非常奇怪,汇编看起来慢的代码执行更快,求解
为什么程序 1) link之后 执行速度 比程序2)快? 想不通。
程序1)的执行时间是 2.1秒, 程序2的执行时间是2.7秒。
程序1)和程序2) 是给 数据结构 struct abc_t {int a; int b; int c; int d} 的局部变量 d 赋值 .为了比较速度,循环 (899999999 + 1)次。
程序1) 用的是 每次从一个全局变量 COPY的方法 就是 d = g;
程序2) 是用的赋值的方法, d.a = 1; d.b=2 d.c = 3 d.d =4;
程序 2 )的汇编代码明显更短, 而且不需要读全局变量G, 但是程序2却执行更慢。 求解释。
程序1)
1 .file "temp.c"
2 .comm g,16,4
3 .text
4 .globl main
5 .type main, @function
6 main:
7 .LFB0:
8 .cfi_startproc
9 pushl %ebp
10 .cfi_def_cfa_offset 8
11 .cfi_offset 5, -8
12 movl %esp, %ebp
13 .cfi_def_cfa_register 5
14 subl $32, %esp
15 movl $1, g
16 movl $2, g+4
17 movl $3, g+8
18 movl $4, g+12
19 movl $0, -4(%ebp)
20 jmp .L2
21 .L3:
22 movl g, %eax
23 movl %eax, -20(%ebp)
24 movl g+4, %eax
25 movl %eax, -16(%ebp)
26 movl g+8, %eax
27 movl %eax, -12(%ebp)
28 movl g+12, %eax
29 movl %eax, -8(%ebp)
30 addl $1, -4(%ebp)
31 .L2:
32 cmpl $899999999, -4(%ebp)
33 jbe .L3
34 leave
35 .cfi_restore 5
36 .cfi_def_cfa 4, 4
37 ret
38 .cfi_endproc
39 .LFE0:
40 .size main, .-main
41 .ident "GCC: (Debian 4.9.2-10) 4.9.2"
42 .section .note.GNU-stack,"",@progbits
程序 2)
1 .file "assign.c"
2 .comm g,16,4
3 .text
4 .globl main
5 .type main, @function
6 main:
7 .LFB0:
8 .cfi_startproc
9 pushl %ebp
10 .cfi_def_cfa_offset 8
11 .cfi_offset 5, -8
12 movl %esp, %ebp
13 .cfi_def_cfa_register 5
14 subl $32, %esp
15 movl $1, g
16 movl $2, g+4
17 movl $3, g+8
18 movl $4, g+12
19 movl $0, -4(%ebp)
20 jmp .L2
21 .L3:
22 movl $1, -20(%ebp)
23 movl $2, -16(%ebp)
24 movl $3, -12(%ebp)
25 movl $4, -8(%ebp)
26 addl $1, -4(%ebp)
27 .L2:
28 cmpl $899999999, -4(%ebp)
29 jbe .L3
30 leave
31 .cfi_restore 5
32 .cfi_def_cfa 4, 4
33 ret
34 .cfi_endproc
35 .LFE0:
36 .size main, .-main
37 .ident "GCC: (Debian 4.9.2-10) 4.9.2"
38 .section .note.GNU-stack,"",@progbits