Какой самый эффективный способ зацикливания в Haxe? - PullRequest
2 голосов
/ 05 апреля 2019

Я не смог найти никакой информации о фактических различиях производительности между циклами в Haxe. Они упомянули, что Vector имеет некоторые оптимизации скорости из-за его фиксированной длины. Каков наилучший способ зацикливания объектов? И зависит ли это от повторяемого объекта (например, массив против вектора против карты)?

Почему Хэкс так мало присутствует на SO? На любой другой язык ответили на этот вопрос 5 раз ...

1 Ответ

2 голосов
/ 05 апреля 2019

Поскольку никто не выполнил тесты производительности, которые я нашел, я решил запустить тест, чтобы эта информация была доступна будущим программистам Haxe.

Первое замечание: если вы не часто используете цикл, он настолько быстр, что почти не влияет на производительность. Поэтому, если проще использовать массив, сделайте это. На производительность влияет только то, что вы снова и снова перебираете вещи и / или если они действительно велики.

Оказывается, ваш лучший выбор зависит в основном от вашей структуры данных. Я обнаружил, что массивы имеют тенденцию быть быстрее, когда вы делаете цикл для каждого стиля вместо стандартного цикла for или while. При небольших размерах массивы по существу так же быстры, как векторы, поэтому в большинстве случаев вам не нужно беспокоиться о том, какой из них использовать. Однако, если вы делаете вещи с довольно массивными массивами, было бы очень полезно переключиться на Vector. И если вы используете Vector, то использование стандартного цикла for или while по существу эквивалентно (хотя while работает быстрее). Карты также довольно быстрые, особенно если вы избегаете цикла foreach.

Чтобы прийти к этим выводам, я сначала проверил петли в следующих условиях:

  1. Проверенный массив, вектор и карта (карта просто для удовольствия).
  2. Заполнил каждый из них до structure[i] = i, где я в 0 ... размер с размерами в [20, 100, 1000, 10000, 100000], чтобы вы могли найти правильный размер для вас.
  3. Протестировал каждую структуру данных для каждого размера, используя три для типов цикла
    for (i in 0...size)
    for (item in array)
    while (i < size)
    
    и внутри каждого цикла я выполнил поиск и присваивание arr[i] = arr[i] + 1;
  4. Каждый тип цикла был в своем собственном цикле 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 и кому нужно использовать много циклов.

...