我想知道总和是否比最近 CPUS 上的产品快。计算总和在数学上更容易,但可能会有优化来加速处理器中的乘法;我不知道。
就我而言,我想结合两个级别的噪声并对它们应用阈值。我可以简单地将它们相乘,因为它们在从0
到的范围内,1
并在同一范围内应用阈值。或者我可以将它们加在一起并在从0
到的某个范围内应用一个阈值2
。我知道算法并不相同,但两者都可以满足我的要求。
我想知道总和是否比最近 CPUS 上的产品快。计算总和在数学上更容易,但可能会有优化来加速处理器中的乘法;我不知道。
就我而言,我想结合两个级别的噪声并对它们应用阈值。我可以简单地将它们相乘,因为它们在从0
到的范围内,1
并在同一范围内应用阈值。或者我可以将它们加在一起并在从0
到的某个范围内应用一个阈值2
。我知道算法并不相同,但两者都可以满足我的要求。
我认为我们在这里谈论的是浮点数,而不是整数运算,因为您提到了 0 到 1 的范围。
在这种情况下,没有显着差异。究竟有多少差异,取决于代码运行的实际处理器,操作的确切顺序(一个操作是否依赖于另一个操作,其中答案直到稍后才“准备好”,等等,另一种算法允许更多的计算要并行完成)。因此,您将需要实际实现这两个版本的代码并测量系统上的差异。如果这是要在许多不同的机器上运行的东西,您将需要在具有不同处理器的几种类型的机器上对其进行测量。
这当然假设“快速”真的很重要。需要多长时间,您“允许”使用多长时间是否有限制。
优化问题的标准答案:
首先使您的实现正确且可读。然后检查这是否提供了可接受的性能。如果没有,请分析您的代码并检查您在哪里损失了大部分处理时间。然后完全改变它。
您可能需要更改第二步的可读代码,但由于您首先使其正确且可读,因此您有一个要比较的基线,您可以先阅读代码的作用。
x86 的典型(因处理器而异)数字是
Latency 1/Throughput
fp add: 3 1
fp mul: 5 1-3
int add: 1 < 1
int mul: 3-7 1-4
具有更多位的整数的乘法速度较慢,而双倍宽度乘法(在 C 中无法表示)则更慢。
int add 和 int mul 之间的巨大差异并不意味着您应该编写a+a
(or a << 1
) 而不是a*2
,源代码不是(直接)决定性能的因素,生成的机器代码会,并且所有认真的编译器都会降低强度.