站务    人文    电脑    教育   
   
电子    城市    幼教    下页


   
             
             
       
   
             
             
 

Programmer's Story

 
             

   
 
 
A technical discussing
记一次技术争论
今天,我占了光。一场有益的技术争论正好发生在我的电脑桌旁。双笑正好来我这儿交流技术,开发部经理路过顺便提了一句:双笑你在业务网关程序中函数调用采用返回结构的方式,速度慢,这种方式很少见。双笑答曰:“是吗?这种调用是有范例的。效率真有问题吗?”我欣喜地感到一场有益的讨论正在展开。敏感的技术话题吸引了不少听众,陈、罗、肖、伍、周渐次都参加了讨论。肖工说在调用过程中可能多次将结构PUSH进栈,会消耗较多内存。周说在应用服务器设计中有意规避了类似的函数调用方式。双笑问:有没有证明?做过比较吗?经理说:我们发现是慢些.....讨论象是有了结论,但又好象还欠点什么没说透似的。我只能另找时间追究了,午餐为即兴讨论划上了句号。午休刚过,求之不得的机遇又来了。经理拿了一张对照表走过来,连夸"好素材"。原来双笑不满足理论上的探讨,当即针对上午的争论编程作了测试,程序日志使他彻底说服了自己。走廊那边,双笑给我看了他一气呵成编写的测试程序。我要赞叹双笑对技术和学问追根求源、力求澈牾的精神。剩下的,就是在心里祈求:让我多碰见几次这样的争论吧。相信还有人愿意分享我今天的小小收获,只要瞧瞧双笑提供的下列素材就够了:程序对以下的两种函数的调用次数分别设为十万、百万、千万和亿次:

STTEST CAaaDlg::functeststru(Void)
{
Struct structest ret ;
ret.a = 1 ;
ret.b = 1 ;
ret.c = 1 ;
ret.d = 1 ;
ret.e = 1 ;
ret.f = 1 ;
return ret ;
}

CAaaDlg::functestint(int *a,int *b,int *c,int *d,int *e,int *f)
{
*a = 1;
*b = 1;
*c = 1;
*d = 1;
*e = 1;
*f = 1;
retuen 1 ;
}

测试程序用 GetTickCount() 函数记时,测试记录如下:

调用次数 调用方式 第一次 第二次 第三次 平均 时间差
100,000 传结构 80 81 81 80.67 0.34
传地址 80 80 81 80.33 0.423%

1000,000 传结构 892 831 891 871.33 39.66
传地址 842 801 852 831.67 4.768%

10,000,000 传结构 8662 8623 8593 8626 274
传地址 8262 8252 8211 8379 2.94%

100,000,000 传结构 86504 86524 86535 86521 3809
传地址 82819 82809 82508 82712 4.605%

附:下例是C++提供的一个函数原型(效率低于指针传送)
CHARFORMAT & CRichEditView::GetCharFormatSelection();
CPoint GetScrollPosition() const ;

 

.


&