Я пытаюсь создать хорошо оптимизированный бит кода для создания количества X-цифр в длину (где X читается из файла свойств среды выполнения) на основе сгенерированного БД порядкового номера (Y), который затем используется папка -имя при сохранении файла.
На данный момент я придумал три идеи, самая быстрая из которых - последняя, но я был бы признателен за любые советы, которые люди могут дать по этому поводу...
1) Создайте экземпляр StringBuilder с начальной емкостью X. Добавьте Y. Пока длина ‹ X, вставьте ноль в нулевой позиции.
2) Создайте экземпляр StringBuilder с начальной емкостью X. Пока длина ‹ X, добавьте ноль. Создайте DecimalFormat на основе значения StringBuilder, а затем отформатируйте число, когда это необходимо.
3) Создайте новый int Math.pow( 10, X ) и добавьте Y. Используйте String.valueOf() для нового числа, а затем подстроку (1) его.
Второй, очевидно, может быть разделен на секции внешнего и внутреннего цикла.
Итак, какие-нибудь советы? Используя цикл for из 10 000 итераций, я получаю аналогичные тайминги первых двух, а третий метод примерно в десять раз быстрее. Это кажется правильным?
Полный код тестового метода ниже...
// 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 + "\"" );