Поскольку никто не выполнил тесты производительности, которые я нашел, я решил запустить тест, чтобы эта информация была доступна будущим программистам Haxe.
Первое замечание: если вы не часто используете цикл, он настолько быстр, что почти не влияет на производительность. Поэтому, если проще использовать массив, сделайте это. На производительность влияет только то, что вы снова и снова перебираете вещи и / или если они действительно велики.
Оказывается, ваш лучший выбор зависит в основном от вашей структуры данных. Я обнаружил, что массивы имеют тенденцию быть быстрее, когда вы делаете цикл для каждого стиля вместо стандартного цикла for или while. При небольших размерах массивы по существу так же быстры, как векторы, поэтому в большинстве случаев вам не нужно беспокоиться о том, какой из них использовать. Однако, если вы делаете вещи с довольно массивными массивами, было бы очень полезно переключиться на Vector. И если вы используете Vector, то использование стандартного цикла for или while по существу эквивалентно (хотя while работает быстрее). Карты также довольно быстрые, особенно если вы избегаете цикла foreach.
Чтобы прийти к этим выводам, я сначала проверил петли в следующих условиях:
- Проверенный массив, вектор и карта (карта просто для удовольствия).
- Заполнил каждый из них до
structure[i] = i
, где я в 0 ... размер с размерами в [20, 100, 1000, 10000, 100000], чтобы вы могли найти правильный размер для вас.
- Протестировал каждую структуру данных для каждого размера, используя три для типов цикла
for (i in 0...size)
for (item in array)
while (i < size)
и внутри каждого цикла я выполнил поиск и присваивание arr[i] = arr[i] + 1;
- Каждый тип цикла был в своем собственном цикле
for (iter in 0...1000)
, чтобы получить более точное представление о том, как работают циклы. Обратите внимание, что я просто складываю время для каждого цикла, я не усредняю или что-то в этом роде. Таким образом, если для массива потребовалось 12 секунд, на самом деле его выполнение в среднем составляло 12/1000 => 0,012 секунды.
Наконец, вот мой тест (запустите в Debug для neko в HaxeDevelop):
Running test on size 20:
for (i...20) x 1000
Array : 0.0019989013671875
Vector : 0
Map : 0.00300025939941406
for each(i in iterable) x 1000
Array : 0.00100135803222656
Vector : 0.00099945068359375
Map : 0.0209999084472656
while (i < 20) x 1000
Array : 0.00200080871582031
Vector : 0.00099945068359375
Map : 0.0019989013671875
Running test on size 100:
for (i...100) x 1000
Array : 0.0120010375976563
Vector : 0.0019989013671875
Map : 0.0120010375976563
for each(i in iterable) x 1000
Array : 0.00600051879882813
Vector : 0.00299835205078125
Map : 0.0190010070800781
while (i < 100) x 1000
Array : 0.0119991302490234
Vector : 0.00200080871582031
Map : 0.0119991302490234
Running test on size 1000:
for (i...1000) x 1000
Array : 0.11400032043457
Vector : 0.0179996490478516
Map : 0.104999542236328
for each(i in iterable) x 1000
Array : 0.0550003051757813
Vector : 0.0229988098144531
Map : 0.210000991821289
while (i < 1000) x 1000
Array : 0.105998992919922
Vector : 0.0170001983642578
Map : 0.101999282836914
Running test on size 10000:
for (i...10000) x 1000
Array : 1.09500122070313
Vector : 0.180000305175781
Map : 1.09700012207031
for each(i in iterable) x 1000
Array : 0.553998947143555
Vector : 0.222999572753906
Map : 2.17600059509277
while (i < 10000) x 1000
Array : 1.07900047302246
Vector : 0.170999526977539
Map : 1.0620002746582
Running test on size 100000:
for (i...100000) x 1000
Array : 10.9670009613037
Vector : 1.80499839782715
Map : 11.0330009460449
for each(i in iterable) x 1000
Array : 5.54100036621094
Vector : 2.21299934387207
Map : 20.4000015258789
while (i < 100000) x 1000
Array : 10.7889995574951
Vector : 1.71500015258789
Map : 10.8209991455078
total time: 83.8239994049072
Надеюсь, что это поможет всем, кто беспокоится о производительности и Haxe и кому нужно использовать много циклов.