数值优化

时间:2009-02-27 12:01:59

标签: optimization integer double computer-science

我想知道哪种Integer或Float类型最快..
我认为字节比整数更快,因为它的范围更小 有些人告诉我..在某些情况下,整数比一个字节快。

第二个问题:
GPU正在走向世界统治的道路上。
所以我问自己:由于FPU,Double可以比整数更“快” 那么专家在哪里? :)

8 个答案:

答案 0 :(得分:6)

你必须考虑超过时钟周期才能进行算术运算。你可以说增加两个整数需要这么多个循环,增加两个双精度需要这么多个循环,等等,但这可能不相关。如果所有数据同时适合缓存,那么对各个操作进行计时是有意义的。但如果没有,由于高速缓存未命中所需的额外时间主导了各个操作的差异。有时使用较小的数据类型会更快,因为它不同于从缓存中提取某些内容或者不必转到磁盘之间的区别。

现在,计算机将大部分时间用于移动数据,而不是算术,即使在数字运算应用程序中也是如此。前者与后者的比例正在增加。例如,你不能简单地比较乘以短裤和双打所需的时间。您可能会发现,给定程序的两个版本,一个版本在一个小问题上运行得更快,而另一个版本在一个更大的程序上运行得更快,这都是因为各种内存的相对效率。

答案 1 :(得分:4)

  

我认为字节比整数更快,因为它的范围更小。

我经历过的一些事情:使用short给我带来性能打击,而使用int就好了。这是因为,架构上通常不存在短路。它们是便利类型。处理器实际上使用它的字大小。在我的例子中,单词大小是一个int。因此,当访问一个short时,它必须首先将值打包在int中,使用它然后解压缩并简短地得到结果。所有这些都导致了性能损失。所以,更短不一定更好。

答案 2 :(得分:1)

这取决于架构中没有数据位。 浮点处理器在进行计算时将处理float和double。它们都以80位精度进行评估,因此需要相同的时间。将值加载并保存到FPU寄存器可能会有所不同。 Double占用RAM的两倍空间,因此可能因缓存未命中而变慢。如果你有大型数组,你倾向于随机索引,这是值得注意的。

答案 3 :(得分:1)

在CPU级别,没有字节,只有字,现在是32位或64位。算术单元通常是硬连线来处理字大小的数字(或者在浮点的情况下更大)。

因此,在算术运算方面使用小于单词的类型没有速度优势,并且可能存在速度损失,因为你必须做额外的工作才能模拟CPU本身没有的类型,例如:将单个字节写入内存需要您首先读取它所属的单词,修改它然后再写回来。为了避免这种情况,大多数编译器实际上会为所有较小的变量使用完整的内存字,因此即使是布尔变量也需要32位或64位。

但是,如果您有大量数据(例如大型数组),那么使用较小的类型通常会产生更好的性能,因为您将减少缓存丢失。

答案 4 :(得分:0)

数字类型的字节长度取决于语言,有时也取决于您使用的平台。例如,在java中,int和float都使用4个字节,因此处理时间应该相等。虽然更长的类型得到更快的处理,但我会感到惊讶。如果有证据表明我想了解它。

答案 5 :(得分:0)

关于哪一个更快,整数或字节,只要它们都适合寄存器,它们的工作方式相同,或者至少没有可测量的差异。

关于integer vs.double:可能是GPU使用双倍然后常规cpu进行更快的算术运算,但是我怀疑它比双整数运算更快,因为整数运算只是寄存器算术。

答案 6 :(得分:0)

最大的优化是使用循环标量计算,使用向量计算。然后利用GPU或CPU的SSE。

答案 7 :(得分:0)

好吧,只要你不进行任何向量优化,就可以使用与寄存器(32/64位)一样大的整数,而不会产生任何实际的性能损失。

浮点数有点不同:虽然CPU针对双精度进行了优化,但GPU通常可以使用浮点数。