Вот решение, которое в основном совпадает с вашим StringBuilder с двумя оптимизациями:
- напрямую записывает в массив
в обход издержек StringBuilder
- Выполняет операции в обратном порядке.
вместо insert (0), который запрашивает
матричная копия каждый раз
Он также делает предположения, что numDigits будет> = к фактическим требуемым символам, но будет правильно обрабатывать отрицательные числа:
before = System.nanoTime();
String arrString=null;
for ( int j = 0; j < numIterations; j++ ){
char[] arrNum = new char[numDigits];
int i = numDigits-1;
boolean neg = testNumber<0;
for(int tmp = neg?-testNumber:testNumber;tmp>0;tmp/=10){
arrNum[i--] = (char)((tmp%10)+48);
}
while(i>=0){
arrNum[i--]='0';
}
if(neg)arrNum[0]='-';
arrString = new String(arrNum);
}
after = System.nanoTime();
System.out.println( "04: " + outputFormat.format( after - before ) + " nanoseconds" );
System.out.println( "Sanity check: Folder = \"" + arrString + "\"" );
Этот метод значительно превзошел ваши образцы на моей машине для негативов и был сопоставим для позитивов:
01: 18,090,933 nanoseconds
Sanity check: Folder = "000000742"
02: 22,659,205 nanoseconds
Sanity check: Folder = "000000742"
03: 2,309,949 nanoseconds
Sanity check: Folder = "000000742"
04: 6,380,892 nanoseconds
Sanity check: Folder = "000000742"
01: 14,933,369 nanoseconds
Sanity check: Folder = "0000-2745"
02: 21,685,158 nanoseconds
Sanity check: Folder = "-000002745"
03: 3,213,270 nanoseconds
Sanity check: Folder = "99997255"
04: 1,255,660 nanoseconds
Sanity check: Folder = "-00002745"
Редактировать: Я заметил, что ваши тесты возобновили некоторые объекты в цикле итерации, что я не сделал в моем (например, не пересчитывая baseNum в версии подстроки). Когда я изменил тесты, чтобы они были последовательными (не возобновляя какие-либо объекты / вычисления, моя версия работала лучше, чем ваша:
01: 18,377,935 nanoseconds
Sanity check: Folder = "000000742"
02: 69,443,911 nanoseconds
Sanity check: Folder = "000000742"
03: 6,410,263 nanoseconds
Sanity check: Folder = "000000742"
04: 996,622 nanoseconds
Sanity check: Folder = "000000742"
Конечно, как уже упоминали другие, микро-бенчмаркинг невероятно труден / «утомителен» со всей оптимизацией, выполняемой ВМ, и невозможностью их контролировать.