在Haxe中循环最有效的方法是什么?

时间:2019-04-05 15:07:35

标签: performance loops haxe

我找不到有关Haxe循环之间实际性能差异的任何信息。他们提到Vector由于具有固定长度而具有一些速度优化。遍历对象的最佳方法是什么?它是否取决于可迭代对象(例如,数组vs.矢量vs.地图)?

为什么Haxe在SO上很少出现?其他所有语言对此问题的回答都超过5次...

1 个答案:

答案 0 :(得分:2)

由于没有人做过我发现的性能基准测试,因此我决定进行测试,以便将来的Haxe程序员可以使用此信息。

第一个注意事项:如果您不经常在循环中运行,它是如此之快,几乎对性能没有影响。因此,如果仅使用数组更容易,那就去做吧。只有一遍又一遍地运行和/或它真的很大时,性能才会受到影响。

事实证明,最佳选择主要取决于数据结构。我发现,当您为每个样式循环执行而不是标准的for循环或while循环时,数组往往会更快。在小尺寸的情况下,数组的速度基本上与向量一样快,因此在大多数情况下,您无需担心要使用哪一个。但是,如果您要处理大量的Array,则切换到Vector将非常有益。而且,如果使用Vector,则使用标准的for或while循环本质上是等效的(尽管while的触摸速度更快)。地图也非常快,特别是如果您避免了foreach循环。

为得出这些结论,我首先在以下条件下测试了循环:

  1. 经过测试的数组,向量和地图(仅出于娱乐目的使用地图)。
  2. 将每个填充为structure[i] = i,其中i为0 ...尺寸,尺寸为[20、100、1000、10000、100000],以便您找到合适的尺寸。
  3. 使用三种for循环类型在每种大小上测试每种数据结构
    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秒。

最后,这是我的基准测试(在HaxeDevelop中的neko的Debug中运行):

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以及需要使用很多循环的人。