gpt4 book ai didi

c++ - dynamic_cast 的性能

转载 作者:太空狗 更新时间:2023-10-29 23:17:19 25 4
gpt4 key购买 nike

我之前问过一个问题 Why is dynamic_cast evil or not ? 答案让我写了一些关于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)

最佳答案

您确实编写了正确的代码,尽管我不会将类型硬编码为 Cat。为了安全起见,您可以使用命令行参数来决定是构建猫还是狗(您也应该实现)。也尝试禁用优化,以查看它是否发挥了重要作用。

最后,提醒一句。概要分析并不像在计算机上进行测量那么简单,因此您必须意识到您所做的只是到目前为止。它确实给了你一个想法,但不要认为你会得到任何包罗万象的答案。

关于c++ - dynamic_cast 的性能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18691267/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com