首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么比较比uint64快?

为什么比较比uint64快?
EN

Stack Overflow用户
提问于 2013-04-23 07:01:40
回答 1查看 2.1K关注 0票数 8

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

代码语言:javascript
复制
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;

这是profile的测量:

这是tictoc衡量的结果:

代码语言:javascript
复制
Elapsed time is 6.259040 seconds.
Elapsed time is 0.015387 seconds.

当使用uint8..uint32或int8..int32而不是64位数据类型时,此效果将消失。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-04-23 08:58:52

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

Matlab支持double而不是int操作。大多数值都存储在double类型中,即使它们表示整数值。doubleint==操作将采用不同的代码路径,并且MathWorks在调优和优化double的代码上花费的精力要比针对int的代码多得多,尤其是int64。事实上,老版本的Matlab语言根本不支持int64上的算术运算。(以及IIRC,它仍然不支持混合整数数学。)在进行int64计算时,您使用的是不太成熟、调优较少的代码,同样的情况也可能适用于==。在Matlab中,Int类型不是一个优先级。int64的存在甚至可能会干扰JIT优化该代码,但这只是一种猜测。

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

如果是这种情况,如果您在64位x86-64 (在64位Matlab中)上运行相同的代码,这种差异可能会消失,因为这样您就拥有了64位宽的通用寄存器。但话又说回来,如果没有编译Matlab解释器的代码来利用它,那么它可能不会。

票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16158154

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档