第 9 章 dcc - Benchfn.exe
9.7.7 Benchfn.exe
Benchfn 是来自 Plum-Hall 基准程序套装的一个程序,测试函数调用;每轮循环完成 1000 个子程序调用。反汇编的程序在图 9-39 被显示,反编译的 C 程序在图 9-40,最初的 C 程序在图 9-41。这个程序有下列调用图:
main scanf printf proc_1 proc_2 proc_3 proc_4 |
Benchfn 有四个子过程和一个主程序。四个子过程其中三个调用其它子过程,而第四个子过程是空的。这个程序的中间指令数目的缩减比例没有前面几个程序那么高,因为在该程序中没有许多表达式 (通常在高级程序中不是这种情况)。从这个程序的统计可知 (见图 9-42),空的子过程有 100%的缩减率,因为该子过程的序言和尾部低级指令在 C 程序中被清除;另外三个子过程对于它们执行的 29 个子过程调用平均有 29.30%的指令缩减率,而 main 程序有 81.08%的指令缩减率,因为在这个子过程中有使用表达式和赋值。该程序的总平均是比较低的,56.10%,这是因为这个程序较少有赋值语句。
proc_4 | PROC NEAR | ||||
000 | 0002FA | 55 | PUSH | bp | |
001 | 0002FB | 8BEC | MOV | bp,sp | |
002 | 0002FD | 5D | POP | bp | |
003 | 0002FE | C3 | RET | ||
proc_4 | ENDP | ||||
proc_3 | PROC NEAR | ||||
000 | 0002FF | 55 | PUSH | bp | |
001 | 000300 | 8BEC | MOV | bp,sp | |
002 | 000302 | E8F5FF | CALL | near ptr proc_4 | |
003 | 000305 | E8F2FF | CALL | near ptr proc_4 | |
004 | 000308 | E8EFFF | CALL | near ptr proc_4 | |
005 | 00030B | E8ECFF | CALL | near ptr proc_4 | |
006 | 00030E | E8E9FF | CALL | near ptr proc_4 | |
007 | 000311 | E8E6FF | CALL | near ptr proc_4 | |
008 | 000314 | E8E3FF | CALL | near ptr proc_4 | |
009 | 000317 | E8E0FF | CALL | near ptr proc_4 | |
010 | 00031A | E8DDFF | CALL | near ptr proc_4 | |
011 | 00031D | E8DAFF | CALL | near ptr proc_4 | |
012 | 000320 | 5D | POP | bp | |
013 | 000321 | C3 | RET | ||
proc_3 | ENDP | ||||
proc_2 | PROC NEAR | ||||
000 | 000322 | 55 | PUSH | bp | |
001 | 000323 | 8BEC | MOV | bp,sp | |
002 | 000325 | E8D7FF | CALL | near ptr proc_3 | |
003 | 000328 | E8D4FF | CALL | near ptr proc_3 | |
004 | 00032B | E8D1FF | CALL | near ptr proc_3 | |
005 | 00032E | E8CEFF | CALL | near ptr proc_3 | |
006 | 000331 | E8CBFF | CALL | near ptr proc_3 | |
007 | 000334 | E8C8FF | CALL | near ptr proc_3 | |
008 | 000337 | E8C5FF | CALL | near ptr proc_3 | |
009 | 00033A | E8C2FF | CALL | near ptr proc_3 | |
010 | 00033D | E8BFFF | CALL | near ptr proc_3 | |
011 | 000340 | E8BCFF | CALL | near ptr proc_3 | |
012 | 000343 | 5D | POP | bp | |
013 | 000344 | C3 | RET | ||
proc_2 | ENDP | ||||
proc_1 | PROC NEAR | ||||
000 | 000345 | 55 | PUSH | bp | |
001 | 000346 | 8BEC | MOV | bp,sp | |
002 | 000348 | E8D7FF | CALL | near ptr proc_2 | |
003 | 00034B | E8D4FF | CALL | near ptr proc_2 | |
004 | 00034E | E8D1FF | CALL | near ptr proc_2 | |
005 | 000351 | E8CEFF | CALL | near ptr proc_2 | |
006 | 000354 | E8CBFF | CALL | near ptr proc_2 | |
007 | 000357 | E8C8FF | CALL | near ptr proc_2 | |
008 | 00035A | E8C5FF | CALL | near ptr proc_2 | |
009 | 00035D | E8C2FF | CALL | near ptr proc_2 | |
010 | 000360 | E8BFFF | CALL | near ptr proc_2 | |
011 | 000363 | 5D | POP | bp | |
012 | 000364 | C3 | RET | ||
proc_1 | ENDP | ||||
main | PROC NEAR | ||||
000 | 000365 | 55 | PUSH | bp | |
001 | 000366 | 8BEC | MOV | bp,sp | |
002 | 000368 | 83EC08 | SUB | sp,8 | |
003 | 00036B | 8D46FC | LEA | ax,[bp-4] | |
004 | 00036E | 50 | PUSH | ax | |
005 | 00036F | B89401 | MOV | ax,194h | |
006 | 000372 | 50 | PUSH | ax | |
007 | 000373 | E85614 | CALL | near ptr scanf | |
008 | 000376 | 59 | POP | cx | |
009 | 000377 | 59 | POP | cx | |
010 | 000378 | FF76FE | PUSH | word ptr [bp-2] | |
011 | 00037B | FF76FC | PUSH | word ptr [bp-4] | |
012 | 00037E | B89801 | MOV | ax,198h | |
013 | 000381 | 50 | PUSH | ax | |
014 | 000382 | E8BE0B | CALL | near ptr printf | |
015 | 000385 | 83C406 | ADD | sp,6 | |
016 | 000388 | C746FA0000 | MOV | word ptr [bp-6],0 | |
017 | 00038D | C746F80100 | MOV | word ptr [bp-8],1 | |
019 | 00039F | 8B56FA | L1: MOV | dx,[bp-6] | |
020 | 0003A2 | 8B46F8 | MOV | ax,[bp-8] | |
021 | 0003A5 | 3B56FE | CMP | dx,[bp-2] | |
022 | 0003A8 | 7CEA | JL | L2 | |
023 | 0003AA | 7F05 | JG | L3 | |
024 | 0003AC | 3B46FC | CMP | ax,[bp-4] | |
025 | 0003AF | 76E3 | JBE | L2 | |
026 | 0003B1 | B8B201 | L3: MOV | ax,1B2h | |
027 | 0003B4 | 50 | PUSH | ax | |
028 | 0003B5 | E88B0B | CALL | near ptr printf | |
029 | 0003B8 | 59 | POP | cx | |
030 | 0003B9 | 8BE5 | MOV | sp,bp | |
031 | 0003BB | 5D | POP | bp | |
032 | 0003BC | C3 | RET | ||
033 | 000394 | E8AEFF | L2: CALL | near ptr proc_1 | |
034 | 000397 | 8346F801 | ADD | word ptr [bp-8],1 | |
035 | 00039B | 8356FA00 | ADC | word ptr [bp-6],0 | |
036 | JMP | L1 | ;Synthetic inst | ||
main | ENDP |
图 9-39: Benchfn.a2
/* * Input file : benchfn.exe * File type : EXE */ #include "dcc.h" void proc_4 () /* Takes no parameters. * High-level language prologue code. */ { } void proc_3 () /* Takes no parameters. * High-level language prologue code. */ { proc_4 (); proc_4 (); proc_4 (); proc_4 (); proc_4 (); proc_4 (); proc_4 (); proc_4 (); proc_4 (); proc_4 (); } void proc_2 () /* Takes no parameters. * High-level language prologue code. */ { proc_3 (); proc_3 (); proc_3 (); proc_3 (); proc_3 (); proc_3 (); proc_3 (); proc_3 (); proc_3 (); proc_3 (); } void proc_1 () /* Takes no parameters. * High-level language prologue code. */ { proc_2 (); proc_2 (); proc_2 (); proc_2 (); proc_2 (); proc_2 (); proc_2 (); proc_2 (); proc_2 (); } void main () /* Takes no parameters. * High-level language prologue code. */ { long loc1; long loc2; scanf ("%ld", &loc2); printf ("executing %ld iterations\n", loc2); loc1 = 1; while ((loc1 <= loc2)) { proc_1 (); loc1 = (loc1 + 1); } printf ("finished\n"); } |
图 9-40: Benchfn.b
/* benchfn - benchmark for function calls * Thomas Plum, Plum Hall Inc, 609-927-3770 * Let T be the execution time in milliseconds * Then average time per operator = T/major usec * (Because the inner loop has exactly 1000 operations) */ #include <stdio.h> f3() { ;} f2() { f3();f3();f3();f3();f3();f3();f3();f3();f3();f3();} /* 10 */ f1() { f2();f2();f2();f2();f2();f2();f2();f2();f2();f2();} /* 10 */ f0() { f1();f1();f1();f1();f1();f1();f1();f1();f1();} /* 9 */ main (int ac, char *av[]) { long d, major; scanf ("%ld", &major); printf("executing %ld iterations\n", major); for (d = 1; d <= major; ++d) f0(); /* executes 1000 calls */ printf ("finished\n"); } |
图 9-41: Benchfn.c
子程序 | 低级 | 高级 | % 缩减率 |
proc4 | 4 | 0 | 100.00 |
proc3 | 14 | 10 | 28.57 |
proc2 | 14 | 10 | 28.57 |
proc1 | 13 | 9 | 30.77 |
main | 37 | 7 | 81.08 |
合计 | 82 | 36 | 56.10 |
图 9-42: Benchfn 统计
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论