81得票7回答
将范围检查转换为无符号整数类型比检查负值更有效吗?

我在.NET的List源码中偶然发现了这段代码:// Following trick can reduce the range check by one if ((uint) index >= (uint)_size) { ThrowHelper.ThrowArgumentOutOf...

81得票7回答
分支预测器是否可以告诉程序,跟随分支的可能性有多大?

为了明确一下,我不需要任何可移植性的解决方案,所以任何会绑定到特定机器上的解决方案都是可以接受的。 基本上,我有一个if语句,在99%的情况下将计算为true,现在我想尽可能地提高性能,是否可以发出某种编译器命令(使用GCC 4.1.2和x86 ISA,如果有关系)来告诉分支预测器应该缓存这...

75得票6回答
在JavaScript中,读取数组的`length`属性是否真的是一个昂贵的操作?

我一直认为在 JavaScript 中缓存数组的长度是一个好主意(特别是在 for 循环条件中),因为计算数组长度的开销很大。 例子for (var i = 0; i < arr.length; i++) { } // vs for (var i = 0, arrLength = a...

66得票11回答
快速方法复制内存并进行转换-从ARGB到BGR

概要 我有一个图像缓冲区,需要将其转换为另一种格式。原始图像缓冲区是四个通道,每个通道8位,包括Alpha、Red、Green和Blue。目标缓冲区是三个通道,每个通道8位,包括Blue、Green和Red。 所以暴力方法是:// Assume a 32 x 32 pixel image #d...

65得票6回答
使用xor reg,reg与mov reg,0相比有什么优势吗?

在x86上将整数寄存器设置为零值有两种常见方法。 要么mov reg, 0 或者xor reg, reg 有一种观点认为第二种变体更好,因为代码中不存储值0,这可以节省几个字节的机器代码。这绝对是有好处的——使用了更少的指令缓存,有时可以实现更快的代码执行速度。许多编译器会生成这样的代码。 ...

65得票12回答
62得票4回答
"enter"和"push ebp; mov ebp, esp; sub esp, imm"之间的区别,以及"leave"和"mov esp, ebp; pop ebp"之间的区别

"enter"和 "return"有什么区别?Enter 和 Return的差异是什么?push ebp mov ebp, esp sub esp, imm 有指令和内联函数这两种方法,它们之间有性能差异吗?如果有的话,哪种更快,为什么编译器总是使用后者? leave 也是一样。mov ...

62得票4回答
如何强制GCC假定浮点表达式为非负数?

有些情况下你知道某个浮点表达式肯定是非负的。例如,当计算向量长度时,我们会这样做:sqrt(a[0]*a[0] + ... + a[N-1]*a[N-1])(注意:我知道 std::hypot,但这与问题无关),而根号下的表达式显然是非负的。然而,GCC为sqrt(x*x)生成了以下汇编代码:...

61得票10回答
使用位移操作实现除以10?

使用纯位移、加法、减法和可能乘法,可以将无符号整数除以10吗? 使用资源非常有限且除法速度慢的处理器。

60得票4回答
`typeid` 代码中奇怪的 `?:` 使用

在我正在处理的一个项目中,我看到了这段代码。 struct Base { virtual ~Base() { } }; struct ClassX { bool isHoldingDerivedObj() const { return typeid(1 ? *m_baseP...