这是参考C ++并使用Visual Studio编译器。
读取/写入(到RAM)和对不同类型的变量(如bool,short int,int,float和double)进行数学运算时,速度是否存在差异?
据我所知,到目前为止,使用双精度的数学运算需要更长的时间(我说的是32位处理器,我对64位处理器知之甚少),而不是使用浮点运算。
然后用float和int比较运算(读/写ram和初等数学)? int和short int如何,甚至每种类型的有符号和无符号版本之间的差异如何?是否有一种数据类型最适合使用低数量计数器?
谢谢, -Faken
答案 0 :(得分:5)
这里有两个不同的问题:读/写时的速度和算术性能。那些是正交的。当然,当读取或写入大型数组时,速度取决于读取的字节数为O(N),因此使用short
而不是int
(考虑VC ++)会将时间减少~1 / 2。
对于算术运算,一旦操作数在寄存器中,类型的大小就没那么重要了。 IIRC,在同一类别的类型之间,它实际上是相同的(因此short
不比int
更快或更慢。在32位平台上使用64位整数类型自然会受到惩罚,因为没有单一指令可以处理它。另一方面,浮点类型比所有整数类型都慢,即使VC ++上有sizeof(float)==sizeof(int)
。但是,再次float
上的操作并不比double
上的操作更快;这假设是默认的FPU设置,它将所有操作数提升为80位扩展浮点数 - 这可以被禁用,以便在使用float
,IIRC时多挤出一点。
以上是VC ++和x86特有的,按照问题的要求。其他平台,尤其是其他架构,可以完全不同。
作为数字计数器(低或非低)最有效的最佳数据类型是int
- 通常与架构和实现无关(因为标准建议将其作为首选字大小)平台)。
答案 1 :(得分:4)
据我所知,到目前为止,使用双精度数的数学运算需要更长的时间(我们谈论的是32位处理器,我对64位处理器知之甚少),而不是使用浮点运算。
我不知道(我几乎从未编写过浮点算术),但我怀疑:因为double是本机精度(由硬件支持),而我不知道浮点数。
然后用float和int比较操作(读/写ram和初等数学)?
Float比int慢。
int和short int如何,甚至每个变量的有符号和无符号版本之间的差异?
short可能比int慢,因为CPU本身使用int并且需要截断结果以使它们变短。如果它们中有很多连续的它们更适合CPU缓存,它们只会更快。
每个变量的有符号和无符号版本之间的差异?
不,我不这么认为。
是否有任何一种数据类型最适合使用低数量计数器?
中间体
答案 2 :(得分:3)
大多数CPU在与其自然字大小匹配的数据类型上运行最快。因此,根据架构,4或8字节数据类型。 int
通常被定义为“自然字大小”,因此对int
的任何操作都应该很快。
然而,在实践中,你要为缓存未命中,软页面错误和硬页面错误以及内存访问付出更多,而不是优化数据类型的任何类型的算术运算可能会浪费时间
配置您的代码,然后优化热点。
答案 3 :(得分:2)
这在很大程度上取决于C ++代码的体系结构和编译程序集。例如,在MIPS上,浮点运算需要从多个CPU寄存器读取数据。
这种类型的微优化不应该对性能产生太大影响,应由编译器来处理。如果您希望优化某些内容,则应该将应用程序分析为瓶颈。
答案 4 :(得分:1)
我不知道处理双打和浮点数之间的区别是什么,但我很确定它是用浮点单位完成的。这与int和long的寄存器操作相比较。 (在现代CPU中是否有单独的整数计算处理器?)
由于缓存水平和与RAM写入速度相比非常高的CPU时钟速度,写入RAM问题现在很难回答。
就表现而言 - 先测量!
编写能够准确反映目标环境的性能测试。
答案 5 :(得分:1)
与CPU缓存类似,主内存访问会影响您的性能。现代(SDRAM,DDRx)DRAM访问时间随着参考的局部性而显着提高。这意味着您希望数据是连续的。这往往与面向对象相矛盾。 OOD会让你将一个对象的所有元素放在一起。如果你的算法要求对一个对象的各种元素进行操作,那么你的参考局部性就会很好。如果您的算法针对多个对象的相同元素调用操作,则您的位置会很糟糕。如果你有“循环运行数十亿甚至数万亿计算的数学运算”,那么你很可能会遇到后一种情况。如果您的操作是从对象中挑选元素,则CPU缓存和RAM预取可能几乎无效甚至是有害的。如果是这种情况,您可以通过将对象数组分解为类似元素的同步数组来显着提高性能。它很难看,但可以更快。
答案 6 :(得分:0)
如果可以使用SIMD原语,则可以使用较小的类型(浮点数,8位整数等)来显着提高性能。 SIMD原语可以将8个8位int操作(或两个双精度,或4个浮点数等)打包到一个在硬件中并行化的操作中。但是,自Pentium III以来,SIMD原语仅在CPU上受支持。