7得票1回答
为什么编译器并不总是优化掉局部变量?

我想了解如果删除本地中间变量是否可以导致更优化的代码。请考虑以下MWE,特别注意两个函数f和g: struct A { double d; }; struct B { double s; }; struct C { A a; B b; }; A geta...

11得票2回答
LINQ Count()直到,这样做是否更有效率?

假设我想要检查一个集合中是否至少有N个元素。 这个比使用以下代码会更好吗? Count() >= N 使用: public static bool AtLeast<T>(this IEnumerable<T> enumerable, int max) ...

7得票4回答
在开始迭代之前检查Java集合是否为空有用吗?

在以下两种循环风格中,分配了一个Iterator对象。在迭代之前检查集合是否为空有用吗?我不知道这是否合格为“过早优化”。希望对JVM垃圾收集器有深入了解的人能提供见解。 另外,我不知道Java编译器如何处理for-each循环。我假设样式B会自动转换为样式A。但是...也许包括空检查。 ...

106得票7回答
浮点数除法与浮点数乘法

编码时是否有任何(非微观优化)性能提升?float f1 = 200f / 2 相比之下float f2 = 200f * 0.5 我的一位教授几年前告诉我,浮点数除法比浮点数乘法慢,但没有解释为什么。 在现代PC架构中,这种说法是否成立? 更新1 针对评论,请也考虑以下情况:float...

10得票1回答
Skylake是否需要vzeroupper来恢复Turbo时钟,以便在仅读取ZMM寄存器并写入k掩码的512位指令后恢复?

将ZMM寄存器写入可能会让Skylake-X(或类似的)CPU处于降低的最大睿频状态,可能会无限期地保持这种状态。 (SIMD instructions lowering CPU frequency 和 Dynamically determining where a rogue AVX-512...

11得票13回答
重新排列条件评估是否会加速循环?

有点奇怪:我之前听一个朋友说,将这个例子的 for 循环改成以下形式: for (let i = 0; i < arr.length; i++) {  const item = arr[i];  // do something with item...

8得票1回答
使用寄存器R12时,为什么POP操作速度较慢?

在最近的英特尔CPU上,POP指令通常每个周期具有2条指令的吞吐量。然而,当使用寄存器R12(或者编码相同但前缀不同的RSP)时,如果指令经过传统解码器,吞吐量会降至每个周期1条(如果µops来自DSB,则吞吐量保持在大约每个周期2条)。 可以使用nanoBench进行如下复现: sudo...

8得票1回答
在长模式下使用64/32位寄存器是否会受到任何惩罚?

也许这只是微观优化,但这个主题很有趣,我想知道在长模式下使用非本地寄存器大小是否会有任何惩罚? 我从各种来源中了解到,部分寄存器更新(如使用ax而不是eax)可能会导致eflags停顿并降低性能。但我不确定长模式下的情况。对于这个处理器操作模式来说,哪个寄存器大小被认为是本地的呢?x86-6...

15得票2回答
将一个布尔值从参数复制到全局变量 - 比较编译器输出

尽管我完全知道 这些完全人为的基准测试并不意味着太多,但我还是对“四大编译器”选择编译一个微不足道的代码段的几种方式感到有些惊讶。struct In { bool in1; bool in2; }; void foo(In &in) { extern bool...

247得票13回答
如果性能很重要,我应该使用Java的String.format()吗?

我们经常需要构建字符串以用于日志输出等。随着JDK的不断更新,我们学会了在什么情况下使用 StringBuffer(多次追加,线程安全)和 StringBuilder(多次追加,非线程安全)。 那么使用 String.format() 的建议是什么?它是否有效率,或者我们被迫在性能重要的单行...