Я полагаю, что требуемое время ЦП должно быть линейно увеличено в соответствии с размером массива, но тестовая программа показывает, что процесс 30000 байт требует гораздо более 35 раз по сравнению с процессом 3000 байт.
На самом деле, я ожидаю, что он будет расти квадратично с размером массива.Если бы вы профилировали программу, вы, вероятно, обнаружили бы, что значительная часть времени идет на звонки на String.concat
.И когда массив становится больше, пропорция будет увеличиваться.
По сути, каждый раз, когда вы делаете конкатенацию строк, вы копируете все накопленные вами символы в новую строку ... и выбрасываете предыдущий.Нетрудно видеть, что эта часть кода имеет вид O(N**2)
, где N
- размер массива.
Замените объявление String и конкатенации на это:
// allocate the builder with extra space to hold the '||' characters
StringBuilder sb= new StringBuilder(TestArraySize * 3 / 2);
...
// this replaces the concatenation.
sb.append(new String(bytearrayMsgTrunk);
sb.append("||");
...
// this does a final copy of the characters to create a new String
String strFinalMessage = sb.toString();