调用虚函数和调用普通成员函数的效率解决办法
调用虚函数和调用普通成员函数的效率
运行了个测试程序,发现调用虚函数的时间比调用普通成员函数的时间随着调用次数的增加而更小
#include <iostream>
#include <ctime>
using namespace std;
class TextTime
{
public:
void F()
{
cout < < "TextTime::F() " < < endl;
}
virtual void G()
{
cout < < "TextTime::G() " < < endl;
}
};
class Time:public TextTime
{
public:
void F()
{
cout < < "Time::F() " < < endl;
}
void G()
{
cout < < "Time::G() " < < endl;
}
};
int main()
{
TextTime *p=new Time;
clock_t start,end;
int i=50; //调用计数
start=clock();
while( i> =0 )
{
p-> F();
i--;
}
end=clock();
cout < < end-start < < endl;
start=clock();
i=50;
while( i> =0 )
{
p-> G();
i--;
}
end=clock();
cout < < end-start < < endl;
system( "pause ");
return 0;
}
当调用计数在比较小的范围时,例如100内,调用虚函数的时间比调用普通成员函数的时间更多,而当在较大范围时候比如200以上,则是后者使用时间更多
这是为什么呢?
------解决方案--------------------
你这个cout影响太大了,本来调不调虚函数的差别只是若干条指令的问题。
改成Sleep(5)就能看出来了。此外最好用debug模式,release的话优化太多,容易混淆问题。
------解决方案--------------------
还有你的测试程序,两段代码放到一个程序里了,要测试也不见得是这样测试的
应当是独立出来不同的程序进行测试.
你可以看一下Inside the C++ Object Model,上面介绍了很多.
------解决方案--------------------
你是在统计IO开销还是在统计函数调用开销?
运行了个测试程序,发现调用虚函数的时间比调用普通成员函数的时间随着调用次数的增加而更小
#include <iostream>
#include <ctime>
using namespace std;
class TextTime
{
public:
void F()
{
cout < < "TextTime::F() " < < endl;
}
virtual void G()
{
cout < < "TextTime::G() " < < endl;
}
};
class Time:public TextTime
{
public:
void F()
{
cout < < "Time::F() " < < endl;
}
void G()
{
cout < < "Time::G() " < < endl;
}
};
int main()
{
TextTime *p=new Time;
clock_t start,end;
int i=50; //调用计数
start=clock();
while( i> =0 )
{
p-> F();
i--;
}
end=clock();
cout < < end-start < < endl;
start=clock();
i=50;
while( i> =0 )
{
p-> G();
i--;
}
end=clock();
cout < < end-start < < endl;
system( "pause ");
return 0;
}
当调用计数在比较小的范围时,例如100内,调用虚函数的时间比调用普通成员函数的时间更多,而当在较大范围时候比如200以上,则是后者使用时间更多
这是为什么呢?
------解决方案--------------------
你这个cout影响太大了,本来调不调虚函数的差别只是若干条指令的问题。
改成Sleep(5)就能看出来了。此外最好用debug模式,release的话优化太多,容易混淆问题。
------解决方案--------------------
还有你的测试程序,两段代码放到一个程序里了,要测试也不见得是这样测试的
应当是独立出来不同的程序进行测试.
你可以看一下Inside the C++ Object Model,上面介绍了很多.
------解决方案--------------------
你是在统计IO开销还是在统计函数调用开销?