我之前问过一个问题为什么 dynamic_cast 邪恶或不邪恶?答案让我写了一些关于性能的代码dynamic_cast
如下。我编译和测试,所消耗的时间dynamic_cast
比没有的略大dynamic_cast
。我没有看到dynamic_cast
耗时的证据。我写了正确的代码吗?
代码是:
class Animal
{
public:
virtual ~Animal(){};
};
class Cat : public Animal
{
public:
std::string param1;
std::string param2;
std::string param3;
std::string param4;
std::string param5;
int param6;
int param7;
};
bool _process(Cat* cat)
{
cat->param1 = "abcde";
cat->param2 = "abcde";
cat->param3 = "abcde";
cat->param4 = "abcde";
cat->param5 = "abcde";
cat->param6 = 1;
cat->param7 = 2;
return true;
}
bool process(Animal *ptr)
{
Cat *cat = dynamic_cast<Cat*>(ptr);
if (cat == NULL)
{
return false;
}
_process(cat);
return true;
}
int main(int argc, char* argv[])
{
/*
argv[1] : object num
*/
if (argc != 2)
{
std::cout << "Error: invalid argc " << std::endl;
return -1;
}
int obj_num = atoi(argv[1]);
if (obj_num <= 0)
{
std::cout << "Error: object num" << std::endl;
}
int c = 0;
for (; c < obj_num; c++)
{
Cat cat;
#ifdef _USE_CAST
if (!process(&cat))
{
std::cout << "Error: failed to process " << std::endl;
return -3;
}
#else
if (!_process(&cat))
{
std::cout << "Error: failed to process " << std::endl;
return -3;
}
#endif
}
return 0;
}
编译它使用:
g++ -D_USE_CAST -o dynamic_cast_test dynamic_cast_benchmark.c
g++ -o dynamic_cast_no_test dynamic_cast_benchmark.c
使用 num 执行它们,即 1,10,100 ...:
$time ./dynamic_cast_test num
$time ./dynamic_cast_no_test num
结果:
dynamic_cast non_dynamic_cast
num 10,000
real 0m0.010s real 0m0.008s
user 0m0.006s user 0m0.006s
sys 0m0.001s sys 0m0.001s
100,000
real 0m0.059s real 0m0.056s
user 0m0.054s user 0m0.054s
sys 0m0.001s sys 0m0.001s
1,000,000
real 0m0.523s real 0m0.519s
user 0m0.517s user 0m0.511s
sys 0m0.001s sys 0m0.004s
10,000,000
real 0m6.050s real 0m5.126s
user 0m5.641s user 0m4.986s
sys 0m0.036s sys 0m0.019s
100,000,000
real 0m52.962s real 0m51.178s
user 0m51.697s user 0m50.226s
sys 0m0.173s sys 0m0.092s
硬件和操作系统:
OS:Linux
CPU:Intel(R) Xeon(R) CPU E5607 @ 2.27GHz (4 cores)