比较Dart的循环--哪个是最快的?

520 阅读3分钟

比较Dart的循环--哪个是最快的?

Dart,用于编写Flutter应用程序的语言,有许多不同的循环,可以通过列表迭代或运行一些代码的指定次数。有_while_循环,for 循环,_for...in_循环,._forEach_方法,._map_方法等等。在这篇文章中,我们将测试这些不同的循环方法,看看哪种方法是最快的!

对于这些测试,我们将使用tools.dart.devbenchmark_harness包。

优化方法

对于_for_ 或 while 循环,有一些优化措施已经在其他语言中使用,例如:缓存列表的长度和反转循环的顺序。

缓存长度

缓存列表的长度包括在循环之前将我们要循环的列表的长度设置为一个变量。下面是一个未缓存长度的_while_循环的例子。

var count = 0;

下面是一个带有缓存长度的_while_循环的例子。

var count = 0;

当我们在循环前缓存一个列表的长度时,列表的长度只计算一次,而不是在每次迭代时重新计算。然而,当我们不对长度进行缓存时,每次迭代都要计算长度。对于有大量元素的列表,这应该有明显的性能提升。

颠倒顺序

反转循环的顺序包括将迭代器设置为列表的长度减去1(因为列表是从0开始计算的),然后向后迭代(例如,每次迭代后从迭代器中减去1),直到迭代器等于0。

num eachElement = 0;

下面是一个顺序颠倒的_for_ 循环的例子。

num eachElement = 0;

与缓存列表的长度类似,颠倒循环的顺序可以将列表的长度缓存为迭代器的初始值。因此,对于有大量元素的列表,这应该有明显的性能提升。

基准测试

为了衡量每个循环的性能,它必须在一个包含3000000个整数的列表中循环,每个整数是它在列表中的索引。对于列表中的每个元素,该循环必须将一个名为_eachElement_的变量设置为该元素的立方值。

这个程序将为每个循环运行10次,完成操作的平均时间将被记录。然后我把整个基准重复了3次,并找到了平均结果。

现在,让我们看看哪个循环和优化组合是最快的!

While 循环

  1. 用未缓存的长度。
var count = 0;

这个测试大约需要9.14ms来完成。

2.有缓存的长度。

var count = 0;

这个测试花了大约9.65ms完成。

3.顺序颠倒。

var count = list.length - 1;

这个测试花了大约14.57ms完成。

循环

  1. 使用未缓存的长度。
num eachElement = 0;

该测试花了大约9.08ms完成。

2.有缓存的长度。

num eachElement = 0;

这个测试花了大约9.01ms完成。

3.顺序颠倒。

num eachElement = 0;

这个测试花了大约14.27ms完成。

对于...的循环

num eachElement = 0;

这个测试花了大约22.70ms完成。

.forEach方法

num eachElement = 0;

这个测试花了大约142.27ms完成。

.map方法

num eachElement = 0;

这个测试花了大约487.77ms完成。

测试结果

我把这些测试的结果整理成一个条形图。

结果的柱状图

从这个图表中,我们可以看到,带有缓存长度的_for_循环是最快的,而_.map_方法是最慢的(速度相当快),_.forEach_方法是倒数第二的。

其余的循环的性能几乎相同;但是,反转顺序的_while_和_for_ 循环的性能似乎比其他循环差一点。

结论

总之,任何一个_while_或_for_循环都可以使用,每个循环之间的性能差异很小(除了反转循环)。

本文中使用的基准代码和包含结果的电子表格可在此获得。

这篇文章与通常的Flutter文章略有不同,我希望你喜欢阅读这篇文章让我知道你对这些结果的看法,以及我是否应该在评论区发布更多的基准测试文章。如果你觉得这篇文章有用,也请拍手叫好吧