110得票9回答
何时,如果有必要的话,循环展开仍然是有用的?

我一直在尝试通过循环展开来优化一些极其性能关键的代码(一个快速排序算法,在蒙特卡罗模拟中被调用数百万次)。这里是我试图加速的内部循环:// Search for elements to swap. while(myArray[++index1] < pivot) {} while(piv...

14得票1回答
微调指针+无符号+1

很难相信,我所维护的代码中,在若干个内层循环中都存在构造 p[u+1] ,因此正确地微调它的优化可以在运行数天的操作中节省几个小时。 通常最有效的是 *((p+u)+1)。有时候 *(p+(u+1)) 更有效。很少情况下 *((p+1)+u) 是最好的(但是通常编译器能够将 *((p+1)+...

17得票2回答
rep stosb指令如何比等效的loop指令执行更快?

指令rep stosb如何比这段代码执行得更快? Clear: mov byte [edi],AL ; Write the value in AL to memory inc edi ; Bump EDI to next ...

9得票8回答
Java:微调数组操作

我正在尝试制作一个简单前馈神经网络的Java版本。 这显然涉及大量的数字计算,因此我正在尽可能地优化我的中心循环。结果应该在float数据类型的限制范围内正确无误。 我的当前代码如下所示(已删除错误处理和初始化): /** * Simple implementation of a fee...

7得票1回答
Java中的>>和>>>右移运算符之间是否有性能差异?

有没有理由认为Java中的有符号右移运算符(>>)和无符号右移运算符(>>>)会有不同的表现?我在我的机器上无法检测出任何区别。 这纯粹是一个学术问题;我确定它永远不会成为瓶颈。我知道:最好首先写下你的意思;例如,使用>>进行除以2的操作。 我认为...

7得票1回答
编译器中是否有内置工具来判断分支的可预测性?

我不是在询问“__builtin_expect”等内容。我想到的情况是,当我不知道一个分支通常是true或false,但我知道它是可预测的(或不可预测)时。 我期望编译器会知道这个分支是可预测的,更有可能生成分支,并且知道它是不可预测的,则更有可能生成无分支的有条件执行指令。 这在主要编译...

12得票1回答
在Coffee Lake (Skylake)上,bigint乘法的第一步中ADD比ADC要慢。

在下面的高亮行中将add更改为adc显著提高了性能。我发现这非常反直觉,因为add具有更多的执行端口,而且它不依赖于标志。 CPU:Intel i7-9750H(Coffee Lake)。 add的UOPS_ISSUED.ANY = ~2.87 uops/cycle。 adc的UOPS_IS...

29得票2回答
在x86汇编中,将两个有符号整数取平均值的最快方法是什么?

假设我们有两个寄存器长度的有符号整数,例如a和b。 我们想要计算值(a + b) / 2,无论是向上舍入、向下舍入、朝零舍入还是远离零,以任何一种方式都可以(即我们不关心舍入方向)。 结果是另一个寄存器长度的有符号整数(很明显,平均值必须在一个寄存器长度的有符号整数范围内)。 如何最快地执...

9得票3回答
在Rust语言中,哪些整数操作有更高性能的替代方法?

在Rust中编写整数函数时(例如像素处理),使用性能最高的操作很有用,类似于C/C++。虽然参考手册解释了行为的更改,但并不总是清楚哪些方法比标准整数算术运算更高效。(请参见注1)我认为wrapping_add编译后等同于C语言的加法。在标准操作(加/减/乘/取模/除/移位/位操作...)中,...

15得票2回答
C优化:条件存储以避免污染缓存行

在libuv源代码中,我发现了这段代码: /* The if statement lets the compiler compile it to a conditional store. * Avoids dirtying a cache line. */ if (loop-...