2

| 之间有什么重大区别吗?和 + 从长远来看会影响代码的性能吗?还是都是 O(1)?我正在使用的代码是这样的:

uint64_t dostuff(uint64_t a,uint64_t b){
        // the max values of the inputs are 2^32 - 1

        // lots of stuff involving boolean operators
        // that have no way of being substituted by 
        // arithmetic operators

        return (a << 32) + b;
        //or
        return (a << 32) | b;
}

该代码将被多次使用,所以我想尽可能加快它的速度。

4

8 回答 8

5

在任何现代计算机上都没有性能差异。

但是,这两个运算符具有不同的含义。如果该位已设置,|则不执行任何操作,但+会清除该位和所有后续非零位并将下一个零位设置为 1。

于 2011-06-01T19:41:46.990 回答
3

两者肯定都是 O(1),因为 O(1) 表示常数。它们可能不是同一个常数。Big Oh 表示法旨在理解独立于常数的渐近行为。

哦,是的,还有一件事。 在优化之前始终配置文件。你会很快发现时间并没有花在你想的地方。 总是

于 2011-06-01T19:47:10.630 回答
2

使用|.

+只能是增加运行时间的明显原因。

于 2011-06-01T19:43:20.047 回答
1

两者都是一条指令。至于电子传播时间,不知道哪个更快。

我猜你可以自己测试速度,但是看到差异可能是线性的(如果可以检测到的话),并且受噪声因素的影响,这可能有点困难。

于 2011-06-01T19:41:29.397 回答
1

这里最好的答案不是试图预测哪个更好,而是对其进行基准测试或检查汇编代码。我猜想两者都将针对相同的指令进行优化,并且在任何情况下,两者占用的 CPU 周期数都可能相等。

但我强烈建议您检查 ASM 并对这两种解决方案进行基准测试。

于 2011-06-01T19:41:52.097 回答
1

如果有任何优势,它将有利于or. 然而,实际上,任何相当现代的 CPU(甚至除了真正古老的 CPU)都不太可能有任何区别。

基本上,or只是设置位,仅此而已。只需要一个双输入or门,因此您只需要一个传播延迟门。

加法器稍微复杂一点:计算当前位需要一个三输入异或。XOR 通常由两级门组成。此外,它生成一个进位,必须用作下一位加法器的输入。因此,“纹波进位加法器”需要与添加的比特数一样多的时钟周期。有更聪明的方法可以处理与其他加法分开处理的问题,因此您可以获得较低的传播延迟,但在最坏的情况下,即使这些也无济于事。

不过,其中大部分内容只有在您自己设计 CPU 时才重要。如果您使用的是典型的 CPU,则功能单元中的门运行得足够快,以至于它可以/将在一个时钟周期内完成完整的加法运算。一些相当新的产品甚至可以在单个功能单元中每个时钟周期进行两次加法。

于 2011-06-01T20:56:39.540 回答
0

和“ |+”是不同的数学运算。
给定方程:

  unsigned int y = 2 + 2;
  unsigned int z = 2 | 2;

会产生不同的答案。

从技术上讲,`|' 运算速度更快,因为它只使用处理器内部的或门。加法运算需要更多的门。

使用 '|' 获得的性能 over '+' 通常会浪费在将数据输入和输出处理器所需的时间上。换句话说,净性能可以忽略不计。(时间差通常在纳秒范围内。)

但是,两种表格之间的维护时间可能会更长。当一个人需要算术而不是位旋转(反之亦然)时,试图找到这个运行时错误可能会很棒。

为正确的目的使用正确的运算符。让测试和维护组休息一下。这种微优化是不值得的。

于 2011-06-01T19:51:19.250 回答
0

这是特定于平台的(并且可能是特定于编译器的)。如果我没记错的话,在 PS3 的 SPU 上,动态 OR 相当昂贵。我不确定数字,但我认为最终会将其划分为多个操作,从而导致成本扩展到多个指令。在 x86/x64 或大多数现代 CISC 上,很可能任何一个都只是一条指令,并且不太可能导致任何流水线停顿或其他代价高昂的操作。

编辑:成本的原因是因为 Cell 处理器只有一个通用寄存器,这意味着它不能将两个变量都加载到标准寄存器中并执行优化。相反,必须将值加载到必须执行操作的 altivec 寄存器集中,然后必须通过掩码将结果从 altivec 寄存器中提取到 gpr 中,以便检索结果。

如果您将这些操作推送到任何现代计算机上的 PS3 或 GPU 上,您可能需要了解这些处理器的行为方式。GPU 也可能有类似的问题,因为它们也是专用于 SIMD 操作的 RISC 处理器。

于 2011-06-01T21:33:19.240 回答