浅析动态绑定效率

在一个图形系统中,有点,线,面等图元,对这些图元进行绘制只调用一个接口然后出入图元数据,就绘制相应的图元.也就是所谓的多态了...,本人知识有限目前知道3中方法.

C语言Case选择方法[实现伪代码如下:]

 1 enum DataType
 2 {
 3     LINE,
 4     POINT,
 5     RECT,
 6     ETC...
 7 };
 8 
 9 struct PaintData
10 {
11     DataType dateType;
12     int x,y,x1,y1;
13 };
14 
15 void Draw(PaintData* pd)
16 {
17     switch(pd->dateType)
18     {
19     case LINE:
20         //绘制直线代码
21         break;
22     case POINT:
23         // 绘制点代码
24         break;
25     case RECT:
26         ........
27     }
28 }

C语言动态绑定方法[实现伪代码如下:]

 1 typedef void (*Draw)(void*); 
 2 
 3 struct PaintData
 4 {
 5     Draw DrawMethod;
 6     int x,y,x1,y1;
 7 };
 8 
 9 
10 DrawLine(void* dt)
11 {
12     ...
13 }
14 
15 DrawPoint(void* dt)
16 {
17     ...
18 }
19 
20 DrawRect(void* dt)
21 {
22     ...
23 }
24 
25 //这样创建
26 void InitData(PaintData* pd,DataType dt)
27 {
28     switch(dt)
29     {
30     case LINE:
31         pd->DrawMethod = DrawLine;
32         break;
33         .....
34     }
35 }
36 
37 //或者这样创建
38 void* CreateLineData()
39 {
40     void* rt = new PaintData;
41     rt->DrawMethod = DrawLine;
42 }
43 
44 void Draw(PaintData* pt)
45 {
46     pt->DrawMethod(pt);
47 }

C++虚函数[实现伪代码如下:]

 1 class PaintObject
 2 {
 3 public:
 4     virtual void Draw();
 5 };
 6 
 7 class Line:public PaintObject
 8 {
 9 public:
10     virtual void Draw()
11     {
12         ....
13     }
14 };
15 
16 class Point:public PaintObject
17 {
18 public:
19     virtual void Draw()
20     {
21         ....
22     }
23 };
24 
25 class Rect:public PaintObject
26 {
27 public:
28     virtual void Draw()
29     {
30         ....
31     }
32 };

以上三种方法都的维护成本C case方法 > C模拟C++方法 > C++;

 

针对它们的执行效率如下的测试,分别对每种方法调用10000次取样一次,总共取样100次制作如下图表

图表中的数据是关掉Vs的优化情况下测得,横坐标表示测试次数,纵坐标表示占用CPU周期.空跑表示for循环开销,调用空函数为参考基线.

从图标中可以看出 C多态>C++虚函数>C 语言Case

如果打开VS优化得到如下结果

C多态没有被优化仍旧在50000以上.

 

转载于:https://www.cnblogs.com/baili35/archive/2013/01/27/2878674.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值