我想很多人都有这样的任务:如果在一个循环中至少有一次满足一个条件,那么这个应该被记录下来。问题 - 如何在性能方面更快地做到这一点?
所以:
var условие_выполнено = false;
for (var i = 0; i < len; i++)
if (условие) {
if (условие_выполнено == false)
условие_выполнено = true;
...
}
要么像这样:
var условие_выполнено = false;
for (var i = 0; i < len; i++)
if (условие) {
условие_выполнено = true;
...
}
- 每次检查和 1 次重新分配,还是每次重新分配?假设条件足够微不足道。
另一个子问题 - 如果有的话,这个差异是多少?
以c++为例,但其他语言的编译器也可以这样做。推动两个选项
在https://godbolt.org/进行优化。我们得到完全相同的输出代码:
https://godbolt.org/z/TKujOJ和https://godbolt.org/z/GFWrwm
编译器已经优化了一切。所以这是一个可读性的问题。
思考和添加更有效
break
。或者甚至剪掉旗帜并使用
return
.显然选项2更快。很明显,那里需要再次休息。退出循环:
然而,如果它完全是风水,那么你需要写++i。对于类来说,预增量更容易实现,如果突然 i 成为模板参数并且不是内置类型,这很有用。
并且您测量这两个选项的性能。在循环之前和循环之后,读取第一个选项和第二个选项的系统时间。只需在编译器中启用完全优化。
我建议对代码进行以下修改。
满足条件后,进一步的代码执行发生在内循环中。也就是说,这是您需要复制
Console.WriteLine(i);
的代码(您有) 。...
在这种情况下,只有一个分配,没有额外的检查。
如果将
5
in替换为if
,例如 by50
,则值的输出i
将保持不变。