【发布时间】:2015-05-20 15:21:15
【问题描述】:
我有一个算法,一开始就像
int sumLargest2 ( int * arr, size_t n )
{
int largest(max(arr[0], arr[1])), secondLargest(min(arr[0],arr[1]));
// ...
我意识到第一个可能不是最佳的,因为当您考虑到一旦找到最大值后,知道最小值所需的信息已经存在时,调用max 然后min 是重复的。所以我发现我可以做到
int largest = max(arr[0], arr[1]);
int secondLargest = arr[0] == largest ? arr[1] : arr[0];
减少对min 的无用调用,但我不确定这是否真的节省了任何数量的操作。是否有任何奇特的位移算法可以做相当于
int largest(max(arr[0], arr[1])), secondLargest(min(arr[0],arr[1]));
?????
【问题讨论】:
-
您的基准测试显示这些“无用的 min 调用”有多大的瓶颈?
-
首先,为什么此时需要这种优化?
-
您非常怀疑您是否删除了一个无用的 min 调用,因为您的编译器无论如何都会内联它。您是否有任何分析结果表明它有所作为?您不会通过猜测正在执行哪些操作并进一步猜测每个操作需要多长时间来优化事物。您只需要测量它(不要忘记使用优化进行编译!)。查看生成的程序集,看看您是否有所作为。
-
@Borgleader 据我所知,我的整个程序没有瓶颈
-
需要注意的一点是,我认为您正在以人类直观的方式查看执行时间,不幸的是它通常不是那么直观。例如,最小/最大通常转换为无分支汇编代码,只是在周围旋转比特,或者在最坏的情况下,是一个有条件的移动(它不会受到分支预测错误的影响)。在这里只使用 if/else 并避免冗余逻辑似乎更快,但您可能会用更昂贵的非冗余逻辑来换取非常便宜的冗余逻辑,这实际上会使事情变得更糟。
标签: c++ algorithm c++11 optimization bit-shift