浅析动态绑定效率
在一个图形系统中,有点,线,面等图元,对这些图元进行绘制只调用一个接口然后出入图元数据,就绘制相应的图元.也就是所谓的多态了...,本人知识有限目前知道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以上.