c++ - dynamic_cast 的性能

标签 c++ rtti dynamic-cast

我之前问过一个问题 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/

相关文章:

c++ - 理解类型特征的架构

c++ - 当我尝试使用指针打印数组元素时打印垃圾值

c++ - 如何避免 C++17 中的虚拟继承?

c++ - 创建一个编译时键到类型映射,通过调用可变参数函数来填充

c++ - 为什么我不能执行动态转换? C 中的策略模式

c++ - 节点结构调用自身

c++ - 如何使负载平衡代理更加完全异步?

c++ - 如何使用 RTTI 确定代码的行为

c++ - 在这种情况下,有比dynamic_cast更好的解决方案吗?

C#:动态转换类型