【问题标题】:std::array vs C-array vs std:vectorstd::array vs C-array vs std:vector
【发布时间】:2014-12-15 09:28:34
【问题描述】:

我想在我的程序中用std::array 替换std::vector,所以我继续测试:

template<typename T> class A{
    public:
    void sub_run(T w){
        w[0] = 0.5;
        w[1] = 1.5;
        w[2] = 2.5;
        w[3] = 0.0;

        for (int i = 0; i < 100000000; i++)
        {
            w[0] = i *0.5;
            w[1] = i *1.5;
            w[2] = i *2.5;

            w[3] = w[0] + w[1]*w[2];
        }
    }
};

int main(){

    // Vectors    
    /*
    A<vector<double> > inst_a;
    vector<double> w(4);
    inst_a.sub_run(w);
    */
    // 1.71 sec

    // C-array
    /*
    A<double *> inst_a;
    double w[4];
    inst_a.sub_run(w);
    */
    // 1.03 sec

    // std::array

    A<array<double,4> > inst_a;
    array<double,4> w;
    inst_a.sub_run(w);

    // 3.31 sec

    return 0;
 }

好吧,输出很奇怪 - std::array 比 C 数组慢 3 倍,甚至比 vector 慢。没有应用优化,唯一的标志是-std=c++11。 有什么问题?

【问题讨论】:

  • 没有应用优化,唯一的标志是 -std=c++11。有什么问题?。您是否检查了何时应用优化?未优化的 C++ 不会试图以任何形式或形式击败“类 C”的性能,所以如果你要谈论最终产品的性能,你必须让 C++ 编译器有优化的余地……因为否则,它会留下很多有助于调试/等的东西。比较不公平。
  • “未应用优化”正是问题所在。
  • ""未应用优化"正是问题所在。" - 这在某种程度上是不明显的,因为 cppreference.com 只是说“......将 C 样式数组的性能和可访问性与标准容器的优点相结合,例如知道自己的大小、支持分配、随机访问迭代器等”
  • @stkubr 从文档中可能不明显, 但这是常识。他们不会每次都重复这个。这类似于警告某人每次执行积分时“不要忘记积分常数”。

标签: arrays c++11 stdarray


【解决方案1】:

来自海湾合作委员会documentation about Optimization:

没有任何优化选项,编译器的目标是减少 编译成本和使调试产生预期的结果 结果。语句是独立的:如果你用一个 语句之间的断点,然后您可以将新值分配给任何 变量或将程序计数器更改为 函数并从源代码中获得您期望的结果。

没有 -O 选项,GCC 不关心性能。它关心使用gdb 或其他类似工具进行调试。要真正编译尽可能快地运行的程序,您应该使用-O 选项。例如,-O2。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-26
    • 1970-01-01
    • 2012-03-19
    • 1970-01-01
    • 2016-06-15
    • 2021-02-27
    相关资源
    最近更新 更多