我正在尝试基于 DB 生成的序列号 (Y) 创建一个经过良好优化的代码位来创建长度为 X 位的数字(其中 X 是从运行时属性文件中读取的),然后将其用于文件夹-name 保存文件时。
到目前为止,我已经提出了三个想法,其中最快的是最后一个,但我会很感激人们对此提出的任何建议......
1) 实例化一个具有初始容量 X 的 StringBuilder。附加 Y。当长度 < X 时,在 pos 零处插入一个零。
2) 实例化一个初始容量为 X 的 StringBuilder。当长度 < X 时,追加一个零。根据 StringBuilder 值创建一个 DecimalFormat,然后在需要时格式化数字。
3) 创建一个 Math.pow(10, X) 的新 int 并添加 Y。在新数字上使用 String.valueOf(),然后对其使用 substring(1)。
第二个显然可以分为外循环和内循环部分。
那么,有什么窍门吗?使用 10,000 次迭代的 for 循环,我从前两种方法中得到了相似的时间,而第三种方法大约快了十倍。这看起来正确吗?
下面的完整测试方法代码...
// Setup test variables
int numDigits = 9;
int testNumber = 724;
int numIterations = 10000;
String folderHolder = null;
DecimalFormat outputFormat = new DecimalFormat( "#,##0" );
// StringBuilder test
long before = System.nanoTime();
for ( int i = 0; i < numIterations; i++ )
{
StringBuilder sb = new StringBuilder( numDigits );
sb.append( testNumber );
while ( sb.length() < numDigits )
{
sb.insert( 0, 0 );
}
folderHolder = sb.toString();
}
long after = System.nanoTime();
System.out.println( "01: " + outputFormat.format( after - before ) + " nanoseconds" );
System.out.println( "Sanity check: Folder = \"" + folderHolder + "\"" );
// DecimalFormat test
before = System.nanoTime();
StringBuilder sb = new StringBuilder( numDigits );
while ( sb.length() < numDigits )
{
sb.append( 0 );
}
DecimalFormat formatter = new DecimalFormat( sb.toString() );
for ( int i = 0; i < numIterations; i++ )
{
folderHolder = formatter.format( testNumber );
}
after = System.nanoTime();
System.out.println( "02: " + outputFormat.format( after - before ) + " nanoseconds" );
System.out.println( "Sanity check: Folder = \"" + folderHolder + "\"" );
// Substring test
before = System.nanoTime();
int baseNum = (int)Math.pow( 10, numDigits );
for ( int i = 0; i < numIterations; i++ )
{
int newNum = baseNum + testNumber;
folderHolder = String.valueOf( newNum ).substring( 1 );
}
after = System.nanoTime();
System.out.println( "03: " + outputFormat.format( after - before ) + " nanoseconds" );
System.out.println( "Sanity check: Folder = \"" + folderHolder + "\"" );