DBで生成されたシーケンス番号(Y)に基づいて、長さがX桁の数(Xはランタイムプロパティファイルから読み取られます)を作成するために、適切に最適化されたコードを作成しようとしています。これは、フォルダーで使用されます。 -ファイルを保存するときの名前。
私はこれまでに3つのアイデアを思いつきましたが、そのうちの最も速いものが最後のアイデアですが、これについて人々からのアドバイスをいただければ幸いです...
1)初期容量XでStringBuilderをインスタンス化します。Yを追加します。長さがX未満の場合、位置ゼロにゼロを挿入します。
2)初期容量XでStringBuilderをインスタンス化します。長さがX未満の場合は、ゼロを追加します。StringBuilder値に基づいてDecimalFormatを作成し、必要に応じて数値をフォーマットします。
3)Math.pow(10、X)の新しいintを作成し、Yを追加します。新しい番号にString.valueOf()を使用してから、substring(1)を使用します。
2つ目は、明らかに外側ループと内側ループのセクションに分割できます。
だから、何かヒントはありますか?10,000回の反復のforループを使用すると、最初の2つから同様のタイミングが得られ、3番目の方法は約10倍高速です。これは正しいようですか?
以下の完全なテストメソッドコード...
// 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 + "\"" );