为什么比uint64快一倍?

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位数据类型时,效果消失.

And*_*nke 6

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

Matlab的有利于doubleint操作.大多数值都存储在double类型中,即使它们表示整数值.这些doubleint ==操作将采用不同的代码路径,并且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解释器的代码来利用它,那么它可能不会.