我使用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;
这是个人资料的衡量标准:
这就是tictoc措施:
Elapsed time is 6.259040 seconds.
Elapsed time is 0.015387 seconds.
当使用uint8..uint32或int8..int32而不是64位数据类型时,效果消失。
答案 0 :(得分:6)
它可能是Matlab解释器和底层CPU的组合,不支持64位int类型以及其他类型。
Matlab赞成double
超过int
次操作。大多数值都存储在double
类型中,即使它们代表整数值。 double
和int
==
操作将采用不同的代码路径,并且MathWorks将更多地关注调整和优化double
的代码而不是整数代码,尤其是int64
。事实上,旧版本的Matlab根本不支持int64
上的算术运算。 (和IIRC一样,它仍然不支持混合整数数学。)当你进行int64
数学运算时,你会使用不太成熟,调整较少的代码,同样适用于{{1} }}。 Int类型不是Matlab的优先级。 ==
的存在甚至可能会干扰JIT优化该代码,但这只是猜测。
但也可能存在潜在的硬件原因。这是一个假设:如果您使用的是32位x86,那么您将使用32位通用(整数)寄存器。这意味着较小的int类型可以放入寄存器并使用快速指令进行比较,但64位int值不适合寄存器,并且可能需要更昂贵的指令序列进行比较。 int64
即使它们是64位宽,也适合x87浮点单元的宽浮点寄存器,并且可以使用快速浮点比较指令在硬件中进行比较。这意味着double
是唯一无法使用快速单寄存器,单指令操作进行比较的。{/ p>
如果是这种情况,如果你在64位x86-64(在64位Matlab中)运行相同的代码,差异可能会消失,因为你有64位宽的通用寄存器。但是,如果Matlab解释器的代码没有被编译以利用它,那么它可能不会。