Performance 为什么比uint64快一倍?

Performance 为什么比uint64快一倍?,performance,matlab,integer,compare,double,Performance,Matlab,Integer,Compare,Double,我使用Matlab的配置文件分析了以下程序。double和uint64都是64位变量。为什么比较两个uint64要比比较两个uint64快得多?它们不是都按位比较吗 big = 1000000; a = uint64(randi(100,big,1)); b = uint64(randi(100,big,1)); c = uint64(zeros(big,1)); tic; for i=1:big if a(i) == b(i) c(i) = c(i) + 1;

我使用Matlab的
配置文件分析了以下程序。double和uint64都是64位变量。为什么比较两个uint64要比比较两个uint64快得多?它们不是都按位比较吗

big = 1000000;

a = uint64(randi(100,big,1));
b = uint64(randi(100,big,1));
c = uint64(zeros(big,1));
tic;
for i=1:big
    if a(i) == b(i)
        c(i) = c(i) + 1;
    end
end
toc;

a = randi(100,big,1);
b = randi(100,big,1);
c = zeros(big,1);
tic;
for i=1:big
    if a(i) == b(i)
        c(i) = c(i) + 1;
    end
end
toc;
这是轮廓的测量:

这就是tictoc衡量的:

Elapsed time is 6.259040 seconds.
Elapsed time is 0.015387 seconds.

当使用uint8..uint32或int8..int32代替64位数据类型时,效果消失。

这可能是Matlab解释器和底层CPU的组合,不支持64位int类型以及其他类型

Matlab支持
double
而不是
int
操作。大多数值存储在
double
类型中,即使它们表示整数值。
double
int
=
操作将采用不同的代码路径,MathWorks将花费比int更多的精力调整和优化
double
的代码,尤其是
int64
。事实上,旧版本的Matlab根本不支持对
int64
进行算术运算。(还有IIRC,它仍然不支持混合整数数学。)当您使用
int64
数学时,您使用的是不太成熟、不太调优的代码,这可能适用于
=
。Int类型在Matlab中不是优先考虑的。
int64
的存在甚至可能会干扰JIT对代码的优化,但这只是一个猜测

但这也可能有一个潜在的硬件原因。这里有一个假设:如果您使用的是32位x86,那么您使用的是32位通用(整数)寄存器。这意味着较小的int类型可以放入寄存器并使用快速指令进行比较,但64位int值无法放入寄存器,可能需要更昂贵的指令序列进行比较。即使是64位宽的
double
s,也可以安装在x87浮点单元的宽浮点寄存器中,并且可以使用快速浮点比较指令在硬件中进行比较。这意味着
[u]int64
是唯一不能使用快速单寄存器单指令操作进行比较的


如果是这种情况,如果您在64位x86-64(在64位Matlab中)上运行相同的代码,那么差异可能会消失,因为您有64位宽的通用寄存器。但是,如果没有编译Matlab解释器的代码来利用它,可能不会。我不知道Matlab,但经常会比较两倍,看看它们是否在彼此的epsilon范围内。这使得比较更加麻烦。@EricJ。恐怕在matlab中不是这样。还有一点被这个问题弄糊涂了。从你的结果来看,比较双音似乎比UINT64倍频程分别报告3s和2.9s快得多。它们不是都按位比较吗?不,不能对
double
s执行此操作。例如,
0
-0
具有不同的二进制表示形式,但在测试相等性时必须比较相等。OTOH,两个
NaN
s将具有相同的二进制表示形式,但必须始终进行比较,而不是彼此相等。+1,似乎这里的硬件主要有故障。我在R2010上测试了一个APU(它有快速的双精度运算,但整数运算很糟糕),对于
single
(u)int8,16,33
,问题是相同的。然后,我在64位CPU、64位R2012 Matlab(具有64位宽的通用寄存器)上进行了测试,所有问题都消失了。@RodyOldenhuis:Ooh,告诉我们有关您正在运行的APU的更多信息。这听起来很有趣,对我来说是新鲜事;我有一个AMD A6-3650,这主要是因为我们的IT经理对它的迷恋;)然而,到目前为止,这对我不是很好;有很多奇怪的副作用(就像我前面提到的那样)。对于我正在进行/设计的高性能科学计算/模拟,我现在更喜欢CPU+GPU:)当然,我的APU是相当新的,并不是最好的,所以我希望这将在未来改变(因为我相信它们有很大的潜力)