cl和g ++编译器之间的区别?

时间:2017-11-26 06:40:37

标签: c++ c++11 visual-c++ g++

#include <iostream>
#include <algorithm>
#include <vector>
#include <chrono>

template<class Resolution = std::chrono::milliseconds>
class ExecutionTimer {
public:
    using Clock = std::conditional_t<std::chrono::high_resolution_clock::is_steady,
        std::chrono::high_resolution_clock,
        std::chrono::steady_clock>;
    ExecutionTimer() = default;

    ~ExecutionTimer() {
        std::cout
            << "Elapsed: "
            << std::chrono::duration_cast<Resolution>(Clock::now() - mStart).count()
            << std::endl;
    }
private:
    Clock::time_point mStart = Clock::now();
};

int main() {
    ExecutionTimer<> timer;

    std::vector<int> v(50000000);
    std::sort(std::begin(v), std::end(v));
    return 0;
}

我尝试使用2个不同的编译器编译上述C ++代码,并观察两个.exe文件的运行时间差异

我使用环境变量

    &#34; C:\ Program Files(x86)\ Microsoft Visual Studio \ 2017 \ Community \ VC \工具\ MSVC \ 14.10.25017 \ BIN \ Hostx64 \ 64&#34;

CL  ->  cl /ehsc Benchmark.cpp
        364 (ms)
g++ ->  g++ -std=c++17 Benchmark.cpp -o bench17
        16565 (ms)

有人能告诉我为什么会有巨大差异吗?

1 个答案:

答案 0 :(得分:0)

默认情况下,g ++根本不执行任何优化。对于使用标准模板的代码来说,这尤其成问题,这些模板几乎完全在预编译的标准库之外实现,因此缺乏优化是非常明显的。

我没有Microsoft编译器进行测试,但在我的系统上,启用-O2会将执行时间从25秒以上缩短到不到1秒。