Ste*_*ein 7 double performance matlab integer compare
我使用Matlab分析了以下程序profile.double和uint64都是64位变量.为什么比比较两个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;
Run Code Online (Sandbox Code Playgroud)
这是配置文件的度量:

这就是tictoc措施:
Elapsed time is 6.259040 seconds.
Elapsed time is 0.015387 seconds.
Run Code Online (Sandbox Code Playgroud)
当使用uint8..uint32或int8..int32而不是64位数据类型时,效果消失.
它可能是Matlab解释器和不支持64位int类型以及其他类型的底层CPU的组合.
Matlab的有利于double在int操作.大多数值都存储在double类型中,即使它们表示整数值.这些double和int ==操作将采用不同的代码路径,并且MathWorks将更多地关注调整和优化代码而double不是整数int64.事实上,旧版本的Matlab根本不支持算术运算int64.(和IIRC,它仍然不支持混合整数数学.)当你进行int64数学运算时,你使用的是较不成熟,调整较少的代码,同样适用于此==.Int类型不是Matlab的优先级.存在int64甚至可能会干扰JIT优化该代码,但这只是猜测.
但也可能存在潜在的硬件原因.这是一个假设:如果您使用的是32位x86,那么您将使用32位通用(整数)寄存器.这意味着较小的int类型可以放入寄存器并使用快速指令进行比较,但64位int值不适合寄存器,并且可能需要更昂贵的指令序列进行比较.的doubleS,即使它们是64个位宽,将适合的x87浮点单元的宽浮点寄存器,并且可以以硬件使用快速浮点比较指令进行比较.这意味着[u]int64s是唯一无法使用快速单寄存器,单指令操作进行比较的.
如果是这种情况,如果你在64位x86-64(在64位Matlab中)运行相同的代码,差异可能会消失,因为你有64位宽的通用寄存器.但是,如果没有编译Matlab解释器的代码来利用它,那么它可能不会.