数据类型大小对性能的影响

时间:2011-01-21 20:28:20

标签: c++ performance types

我正在进行密集的数值模拟。我经常使用长整数,但我意识到使用整数是安全的。这会显着提高我的模拟速度吗?

4 个答案:

答案 0 :(得分:3)

取决于。如果内存中连续存在大量的数字,则它们更有可能适合L2缓存,因此缓存未命中次数较少。 L2缓存未命中 - 取决于您的平台 - 可能会对性能产生重大影响,因此尽可能使缓存尽可能适合缓存(如果可以,也可以预取)绝对是个好主意。但是不要指望你的代码会突然飞行,因为你的类型较小。

编辑:还有一件事 - 如果你选择一个笨拙的类型(比如32位或64位平台上的16位整数),你的性能可能会更差,因为CPU必须通过手术提取16位值并将其转换为可以使用的值。但通常情况下,整数是一个不错的选择。

答案 1 :(得分:2)

取决于您的数据集大小。显然,将整数的大小减半可能会使适合CPU缓存的数据量增加一倍,因此访问数据的速度会更快。有关详细信息,我建议您阅读着名的Ulrich Drepper论文What Every Programmer Should Know About Memory

答案 2 :(得分:0)

这就是为什么typedef是你的朋友。 : - )

如果在数学上可行,请尝试使用浮点数而不是整数。我在某处看到浮点运算(特别是乘法)在某些处理器上实际上可以更快。

最好的事情是进行实验和基准测试。几乎不可能在分析上弄清楚哪种微优化效果最好。

编辑:这个post讨论了整数和浮点数之间的性能差异。

答案 3 :(得分:0)

所有答案都已经处理了CPU缓存问题:如果您的数据小两倍,那么在某些情况下它可以完全适应L2缓存,从而提高性能。

然而,还有另一个非常重要且更一般的事情:内存带宽。如果算法是线性的(又名 O(N)复杂度)并且后续访问内存,则它可能受内存限制。这意味着内存读/写是瓶颈,而CPU只是浪费了很多周期来等待内存操作的完成。在这种情况下,减少总存储器大小两次将产生可靠的2倍性能提升。 此外,在这种情况下,切换到字节可能会产生更大的性能提升,尽管事实上CPU计算可能会像其他答案者已经提到的那样用字节慢。

一般来说,答案取决于几个方面,例如:算法使用的数据总大小,内存访问模式(随机/序列),算法渐近复杂度,每内存计算比率(主要用于线性算法)。