首页 > 解决方案 > 速度比较:先加零或检查非零

问题描述

我正在优化我正在编写的程序中最耗时的循环,该程序将数组中的许多条目相加,其中许多将为零。在添加之前检查条目是否为零是否更快,或者跳过检查并添加所有条目?以下各示例。这是在 C++ 中。谢谢!

double *arr, sum=0;
...
for (int i = 0; i < n; i++)
    sum += arr[i];

或者

double *arr, sum=0;
...
for (int i = 0; i < n; i++)
    if (arr[i])
        sum += arr[i];

标签: c++optimization

解决方案


今日报价:

过早的优化是万恶之
源 - Donald Knuth

如果您的意图是添加数组的所有元素,请编写完全执行此操作的代码,并让编译器的优化器处理最好的。所以选择第一个选择;你的未来有一天你会感激的。

如果不是绝对必要,不要进行手动优化:

对于现代 CPU,无论如何都很难考虑缓存管理、缓存优化、跳转预测和其他硬件技巧的所有可能影响。编译器的优化器可以结合比我们更多的因素。

如果您确实注意到一些性能问题,那么请分析您的代码,并将您的精力集中在真正重要的优化上。或者,您可以在目标平台上对代码进行基准测试,但要注意基准测试中的细微差异,这可能会影响优化器。

现在,这就是说,第二个选项需要一个比较指令(ucomisd在 x86 上)数组中的每个项目。因此,如果大多数项目的值都不为零,那么您通常会增加不必要的开销。对于空项目,您已经用两条指令交换了一个简单的添加,一条比较和一个条件分支。我不确定这是否真的更快,但如果有任何好处,它很可能会非常微不足道。所以在最好的情况下,你会获得非常小的收益,但很可能你会增加一些开销。所以直观地说,坚持第一个选择,除非你的分析器告诉你有问题。


推荐阅读