返回介绍

第 9 章 dcc - Benchfn.exe

发布于 2025-03-09 23:09:35 字数 13874 浏览 0 评论 0 收藏 0

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_4PROC NEAR   
0000002FA55PUSHbp 
0010002FB8BECMOVbp,sp 
0020002FD5DPOPbp 
0030002FEC3RET  
 proc_4ENDP   
      
 proc_3PROC NEAR   
0000002FF55PUSHbp 
0010003008BECMOVbp,sp 
002000302E8F5FFCALLnear ptr proc_4 
003000305E8F2FFCALLnear ptr proc_4 
004000308E8EFFFCALLnear ptr proc_4 
00500030BE8ECFFCALLnear ptr proc_4 
00600030EE8E9FFCALLnear ptr proc_4 
007000311E8E6FFCALLnear ptr proc_4 
008000314E8E3FFCALLnear ptr proc_4 
009000317E8E0FFCALLnear ptr proc_4 
01000031AE8DDFFCALLnear ptr proc_4 
01100031DE8DAFFCALLnear ptr proc_4 
0120003205DPOPbp 
013000321C3RET  
 proc_3ENDP   
      
 proc_2PROC NEAR   
00000032255PUSHbp 
0010003238BECMOVbp,sp 
002000325E8D7FFCALLnear ptr proc_3 
003000328E8D4FFCALLnear ptr proc_3 
00400032BE8D1FFCALLnear ptr proc_3 
00500032EE8CEFFCALLnear ptr proc_3 
006000331E8CBFFCALLnear ptr proc_3 
007000334E8C8FFCALLnear ptr proc_3 
008000337E8C5FFCALLnear ptr proc_3 
00900033AE8C2FFCALLnear ptr proc_3 
01000033DE8BFFFCALLnear ptr proc_3 
011000340E8BCFFCALLnear ptr proc_3 
0120003435DPOPbp 
013000344C3RET  
 proc_2ENDP   
      
 proc_1PROC NEAR   
00000034555PUSHbp 
0010003468BECMOVbp,sp 
002000348E8D7FFCALLnear ptr proc_2 
00300034BE8D4FFCALLnear ptr proc_2 
00400034EE8D1FFCALLnear ptr proc_2 
005000351E8CEFFCALLnear ptr proc_2 
006000354E8CBFFCALLnear ptr proc_2 
007000357E8C8FFCALLnear ptr proc_2 
00800035AE8C5FFCALLnear ptr proc_2 
00900035DE8C2FFCALLnear ptr proc_2 
010000360E8BFFFCALLnear ptr proc_2 
0110003635DPOPbp 
012000364C3RET  
 proc_1ENDP   
      
 mainPROC NEAR   
00000036555PUSHbp 
0010003668BECMOVbp,sp 
00200036883EC08SUBsp,8 
00300036B8D46FCLEAax,[bp-4] 
00400036E50PUSHax 
00500036FB89401MOVax,194h 
00600037250PUSHax 
007000373E85614CALLnear ptr scanf 
00800037659POPcx 
00900037759POPcx 
010000378FF76FEPUSHword ptr [bp-2] 
01100037BFF76FCPUSHword ptr [bp-4] 
01200037EB89801MOVax,198h 
01300038150PUSHax 
014000382E8BE0BCALLnear ptr printf 
01500038583C406ADDsp,6 
016000388C746FA0000MOVword ptr [bp-6],0 
01700038DC746F80100MOVword ptr [bp-8],1 
01900039F8B56FAL1: MOVdx,[bp-6] 
0200003A28B46F8MOVax,[bp-8] 
0210003A53B56FECMPdx,[bp-2] 
0220003A87CEAJLL2 
0230003AA7F05JGL3 
0240003AC3B46FCCMPax,[bp-4] 
0250003AF76E3JBEL2 
0260003B1B8B201L3: MOVax,1B2h 
0270003B450PUSHax 
0280003B5E88B0BCALLnear ptr printf 
0290003B859POPcx 
0300003B98BE5MOVsp,bp 
0310003BB5DPOPbp 
0320003BCC3RET  
033000394E8AEFFL2: CALLnear ptr proc_1 
0340003978346F801ADDword ptr [bp-8],1 
03500039B8356FA00ADCword ptr [bp-6],0 
036  JMPL1;Synthetic inst
 mainENDP   

图 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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文