46得票3回答
Go语言:多次调用len()会影响性能吗?

目前我正在实现一些排序算法。由于算法的本质,使用 len() 方法对一些数组/切片的长度进行了大量调用。 现在,考虑下面这段代码,它是归并排序算法的一部分: for len(left) > 0 || len(right) > 0 { if len(left) &g...

45得票5回答
尽可能快地比较形如(a + sqrt(b))的两个值?

作为我正在编写的程序的一部分,我需要比较形式为a + sqrt(b)的两个值,其中a和b是无符号整数。因为这是紧密循环的一部分,所以我希望这个比较尽可能快地运行。(如果有影响的话,我在x86-64机器上运行代码,并且无符号整数不大于10^6。另外,我知道a1<a2的事实。) 这是我试图...

45得票7回答
最快的负数取反方法

今天早上我在思考,将一些正数变成负数,将一些负数变成正数的最快方法是什么,当然,最简单的方法可能是: int a = 10; a = a*(-1); 或者 int a = 10; a = -a; 但是,我想,我可以使用shift和指针命令来做到这一点......是否真的有可能使用s...

44得票4回答
在Doom 3 BFG代码中,将计算Sqrt(x)的方法改为x * InvSqrt(x)是否有任何意义?

我浏览了最近发布的Doom 3 BFG源代码,当我发现一些看起来毫无意义的东西时,它们与数学函数包装在idMath类中。其中一些函数只是转发到math.h中对应的函数,但有些是重新实现的(例如idMath::exp16()),我认为它们比它们的math.h对应函数具有更高的性能(也许以精度为代...

44得票1回答
将空指针传递给放置 new

在18.6 [support.dynamic] ¶1中,默认的 new 运算符被声明为一个非抛出异常规定:void* operator new (std::size_t size, void* ptr) noexcept; 该函数除了return ptr;以外什么也不做,因此它被声明为noex...

43得票1回答
为什么循环总是被编译成“do...while”风格(尾部跳转)?

当试图理解汇编语言(启用编译器优化时),我看到了这种行为: 像这样的非常基本的循环:outside_loop; while (condition) { statements; } 经常编译成(伪代码)。 ; outside_loop jmp loop_condit...

41得票2回答
为什么打破LZCNT的"输出依赖性"很重要?

在进行基准测试时,我发现吞吐量比我预计的要低得多,经过排查,我发现是LZCNT指令(TZCNT也会出现此问题)导致的,如下所示: xor ecx, ecx _benchloop: lzcnt eax, edx add ecx, 1 jnz _benchloop 并且: ...

39得票11回答
x > -1与x >= 0是否有性能差异?

有一次我听到一位老师说过这句话,从那以后它就一直困扰着我。假设我们想要检查整数x是否大于或等于0。有两种方法可以检查:if (x > -1){ //do stuff } 和if (x >= 0){ //do stuff } 根据这位教师的说法,>比>=...

38得票4回答
为什么 DateTime.Now 和 DateTime.UtcNow 如此缓慢/昂贵

我知道这已经涉及到微观优化领域,但我很好奇为什么调用DateTime.Now和DateTime.UtcNow会如此"昂贵"。我有一个样本程序,运行几个场景来执行一些"工作"(增加计数器),并尝试在1秒钟内完成。我有几种方法可以让它在有限的时间内执行工作。示例表明,DateTime.Now和Da...

38得票2回答
x86_64最佳方法将64位寄存器减少到32位,同时保留零或非零状态。

我正在寻找将64位寄存器缩小为32位寄存器的最快/空间效率最高的方法,仅保留64位寄存器的零/非零状态。 我目前最好的想法是popcntq (1c tput,在主流英特尔上延迟3c,代码大小为5字节):// rax is either zero or non-zero popcntq %rax...