Производительность циклов в Java (Android)

Протестировал скорость работы всех типов циклов на Андроиде/Java SE. Разница между самым быстрым циклом и самым медленным составила в среднем 69,7% и в лучшем для самого быстрого случае 109,8%.

Тестировалось на HTC Wildfire (Andoid 2.2.1). Число запусков ~10000, т.е. выборка для практического применения результатов вполне приличная.
Во всех циклах запускалось стандартное суммирование переменной цикла для контроля корректности результата. При тестирование циклы равномерно менялись местами (что бы исключить возможное влияние первого запуска).

Пример кода

concat не делал, оно тут погоды не делает
long timeStart;
long timeEnd;
long s;
String strOut = «»;
int size = 300_000;
int[] arrNums = newint[size];
for(int i=0; i < size; i++)
{
arrNums[i] = 1;
}
for(int r=0; r < 2500; r++)
{
strOut = «id=»+r + «\n»;
s = 0;
timeStart = Calendar.getInstance().getTimeInMillis();
int iw=0;
while (iw < size) {
s+=arrNums[iw];
iw++;
}
timeEnd = Calendar.getInstance().getTimeInMillis();
strOut = strOut + «While: » + (long)(timeEnd — timeStart) + » ms (s=» + s + «)\n»;
s = 0;
timeStart = Calendar.getInstance().getTimeInMillis();
for(int i_fa : arrNums) s+=arrNums[i_fa];
timeEnd = Calendar.getInstance().getTimeInMillis();
strOut = strOut + «For_array: » + (long)(timeEnd — timeStart) + » ms (s=» + s + «)\n»;
s = 0;
timeStart = Calendar.getInstance().getTimeInMillis();
for(int i_f=0; i_f < size; i_f++) s+=arrNums[i_f];
timeEnd = Calendar.getInstance().getTimeInMillis();
strOut = strOut + «For_standart: » + (long)(timeEnd — timeStart) + » ms (s=» + s + «)\n»;
s = 0;
timeStart = Calendar.getInstance().getTimeInMillis();
int idw = 0;
do {
s+=arrNums[idw];
idw++;
} while (idw < size);
timeEnd = Calendar.getInstance().getTimeInMillis();
strOut = strOut + «Do_While: » + (long)(timeEnd — timeStart) + » ms (s=» + s + «)\n»;
//tvOut.setText(strOut);
Log.e(TAG, strOut);
}

Результаты выводятся в лог под дальнейшую обработку в Excel

Результаты

For array (мс) For standart (мс) Do While (мс) While (мс)
Среднее 147,0 110,9 99,5 110,3
Мин 140 105 94 105
Макс 443 346 495 291

 

Результаты после отбрасывания лучшего и худшего

For array (мс) For standart (мс) Do While (мс) While (мс)
Среднее 146,9208 110,8214 99,41190108 110,369
Мин 141 106 95 106
Макс 418 339 356 272

 

Неожиданно присутствует значительный разброс времени, достигающий 500% (500% Карл!!!) И это не единичные отдельные случаи. ~1% числа запусков по всем циклам превосходит 200. Возможно Java Android этому причина. На php такого не наблюдалось. Потому для пущей корректности нужно пустить этот же код на серверной Java, где Андроид будет исключен из процесса или хотя бы на другом смартфоне.

Неожиданно Do While лидирует со значительным отрывом.

Ожидаемо For по предустановленному массиву показал наихудший результат (аналогичный цикл в php foreach в плане скорости также оставляет желать лучшего).

 

Циклы по убыванию скорости

  1. Do While (100%)
  2. While (110,9%)
  3. For standart (111,5%)
  4. For array (147,7%)

Кто решит проверить на своем андроиде ссылка на гитхаб

Случайные Статьи

Loading…


Количество просмотров :2934

Оставьте коментарий