4

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

第二个问题:
GPU 正在走向世界统治..
所以我问自己:Double 能否比 Integer“更快”.. 因为 FPU
那么专家在哪里?:)

4

8 回答 8

6

您必须考虑的不仅仅是时钟周期来执行算术。您可以说添加两个整数需要这么多周期,添加两个双精度数需要这么多周期,等等,但这可能不相关。如果您的所有数据同时适合缓存,那么对单个操作进行计时是有意义的。但如果不是,由于缓存未命中所需的额外时间将决定各个操作的差异。有时使用较小的数据类型会更快,因为它决定了是否必须从缓存中提取某些内容,或者是否必须转到磁盘。

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

于 2009-02-27T12:27:59.920 回答
4

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

我经历过的事情:使用 ashort给了我性能上的打击,而使用 anint就好了。这是因为,架构上通常不存在短裤。它们是便利类型。处理器实际上使用它的字长。在我的例子中,字长是一个整数。因此,当访问一个 short 时,它必须首先将值打包到 int 中,使用它,然后解包并让我得到一个 short 的结果。所有这些都导致性能下降。所以,更短不一定更好。

于 2009-02-27T12:13:49.627 回答
1

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

于 2009-02-27T12:27:35.740 回答
1

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

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

但是,如果您有大量数据,例如大型数组,则使用较小的类型通常会产生更好的性能,因为您将有更少的缓存未命中。

于 2009-02-27T12:55:11.040 回答
0

数字类型的字节长度取决于语言,有时还取决于您使用的平台。例如在 java 中,int 和 float 都使用 4 个字节,所以处理时间应该相等。尽管更长的类型处理得更快,但我会感到惊讶。如果有证据,我想读一读。

于 2009-02-27T12:08:53.070 回答
0

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

关于整数与双精度:可能是 GPU 使用双精度数比常规 cpu 执行更快的算术,但我怀疑它比整数更快地执行双精度算术,因为整数算术只是寄存器算术。

于 2009-02-27T12:10:42.020 回答
0

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

于 2009-02-27T12:12:34.387 回答
0

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

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

于 2009-02-27T12:13:14.137 回答