![]() |
1
34
原因如下:许多常见的体系结构(包括x86)都有一条硬件指令将有符号整数转换为双精度整数,但没有从无符号到双精度的硬件转换,因此编译器需要在软件中综合转换。此外,Intel上唯一的无符号乘法是全宽度乘法,而有符号乘法可以使用有符号乘法低位指令。 GCC的软件从无符号int到double的转换很可能是次优的(考虑到您所观察到的减速幅度,几乎可以肯定是次优的),但使用有符号整数时,代码的速度会更快。 假设使用智能编译器,64位系统上的差异应该小得多,因为64位有符号整数->双转换可用于高效地进行32位无符号转换。 举例来说,这是:
如果整数变量是有符号的,则应编译成以下内容:
另一方面,如果整数变量是无符号的,
对于未签名->双转换;情况很可能更糟。
|
![]() |
2
3
下面是一些由VC++6.0生成的代码-无优化:
正如您所看到的,转换无符号数据需要做更多的工作。 |
![]() |
3
1
发布模式。。。
调试模式。。。
ASM处于释放模式((未签名)
有趣的。。。启用释放模式和SSE时(已删除fld和fld说明,但添加了4个说明)
|
![]() |
4
0
我在运行Linux的64位机器上运行了GCC4.7.0。 我把计时电话换成了计时电话。 CPU:Intel X5680@3.33 GHZ GCC标志:-Wall-pedantic-O3-std=c++11
显然,在我的机器/编译器上,unsigned更快。 |
![]() |
S. Jacson · 任意两台发电机的速度差(内置功能) 2 年前 |
![]() |
Sadeq Dousti · 相当于“嵌套删除”的执行性能SQL查询 2 年前 |
![]() |
Prince · 复制大型文件需要更多时间 3 年前 |
![]() |
Sagar · 为什么在循环之外声明变量会更快? 3 年前 |
![]() |
seco · 如何在不挂起页面的情况下加载JS 3 年前 |