- 论坛徽章:
- 1
|
为了提高程序运行效率,写了个测试小程序,想测试下CPU不同运算指令的速度,然后我的脑子就凌乱了
先看代码:
.cfi_startproc
movl $.LC0, %edi
subq $8, %rsp
.cfi_def_cfa_offset 16
xorq %rax, %rax
xorq %rdx, %rdx
not %rax
not %rdx
movq $1000000000, %rcx
.next:
shl $1, %rax
shl $1, %rdx
incq %rdx
decq %rcx
jnz .next
call exit
.cfi_endproc
用C解释这个汇编程序可以这么阅读
rax = 0xFFFFFFFFFFFFFFFF;
rdx = 0xFFFFFFFFFFFFFFFF;
rcx = 1000000000;
do {
rax = rax << 1;
rdx = rdx << 1;
rdx++;
rcx--;
} while (rcx != 0);
若将do while()改成空循环的话,C风格代码如下:
rcx = 1000000000;
do {
rcx--;
} while (rcx != 0)
对应汇编代码则是:
movq $1000000000, %rcx
.next:
decq %rcx
jnz .next
第一个有趣的结果是:
空循环与循环体内不超过3条简单指令的循环相比,执行时间相同,这一点是否可以理解为此CPU对互不影响的指令,可以有限的并发执行
CPU为笔记本i3 M370,比较老的产品了。
这些简单指令包括但不限于: add(对应C语言的"+"), dec(对应C语言的"--"), inc(对应C语言的"++"), shl(对应C语言的"<<")
第二个结果是循环体内如果是mul(对应于C语言的整数乘法)或是adc(功能是带进位加法,这个C语言好像没有)
则执行时间是空循环的5倍,这一点是否可以理解为:此CPU执行整数带进位加法或是整数乘法,速度是普通加减法的四分之一(循环中有一次“--”,视为普通加减法)
假如编程中要考虑并发优化的话,貌似很费脑子呢,商业软件我知道有个Intel出品的高性能运算库,可以做到平常程序员做不到的很多优化,
自学的话,有没有相关书籍介绍下? |
|