以前に質問したのですが、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
1,10,100 ... である num を使用してそれらを実行します。
$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:
OS:Linux
CPU:Intel(R) Xeon(R) CPU E5607 @ 2.27GHz (4 cores)