MSVC 编译的程序比用 MinGW 编译的程序慢 3 倍

问题描述 投票:0回答:1

我需要为 NodeJS 编写一些插件。由于插件应该在 Windows 上运行,所以我需要使用 MSVC 编译它。但编译后我发现插件比原始程序慢。所以,经过检查,我得出的结论是MSVC的问题。请参阅下面的结果。所以,我不明白,为什么MSVC产生这么慢的程序。我可以以某种方式优化 MSVC 编译,以达到 MinGW 编译程序的速度吗?或者只是 MSVC 生成优化程度较低的代码,而 MSVC 的最大优化已经达到?


  • 编译器:g++(x86_64-win32-sjlj-rev3,由 MinGW-W64 项目构建) 12.1.0
  • 编译:g++ -O3 main.cpp
  • 执行时间:18517毫秒

  • 编译器:适用于 x64 的 Microsoft (R) C/C++ 优化编译器版本 19.33.31629(工具集 v143、SDK 10.0.20348.0)
  • 编译:cl /O2 main.cpp
  • 执行时间:58144毫秒

备注:

  1. 我添加
    swap(word1, word2)
    只是为了防止 MinGW 优化,这会导致执行时间为 0 秒。
  2. 如果我从
    string
    切换到
    char[]
    ,MinGW 中的执行时间几乎不会改变(快 1-2 秒),但 MSVC 中的执行时间显着减少 - 切换后 36 秒。如果我替换为 int 向量,它会再次减少到 25 秒。

最小可重现示例:

#include <cmath>
#include <string>
#include <chrono>
#include <iostream>

using namespace std;

int cached[6];
int SIZE;

void setSize(int size) {
    SIZE = size;

    for (int i = 0; i < 6; i++)
        cached[i] = pow(3, i);
}

int getMask(const string& guess, const string& answer) {
    int results[6];
    bool visited[6];

    for (int i = 0; i < SIZE; i++) {
        if (guess[i] == answer[i]) {
            results[i] = 2;
            visited[i] = true;
        }
        else {
            results[i] = 0;
            visited[i] = false;
        }
    }

    for (int i = 0; i < SIZE; i++) {
        if (results[i] != 2) {
            for (int j = 0; j < SIZE; j++) {
                if (answer[j] == guess[i] && !visited[j]) {
                    results[i] = 1;
                    visited[j] = true;
                    break;
                }
            }
        }
    }

    int result = results[0];
    for (int i = 1; i < SIZE; i++) {
        result += results[i] * cached[i];
    }

    return result;
}

int main() {
    setSize(6);

    int sum = 0;
    auto t0 = chrono::steady_clock::now();

    string word1 = "abcdef";
    string word2 = "fedcba";

    for (int i = 0; i < 30000; i++) {
        for (int j = 0; j < 30000; j++) {
            sum += getMask(word1, word2);
            swap(word1, word2);
        }
    }

    auto t1 = chrono::steady_clock::now();
    cout << chrono::duration_cast<chrono::milliseconds>(t1 - t0).count() << "[ms]" << endl;

    cout << sum << endl;

    return 0;
}
c++ visual-c++ mingw
1个回答
0
投票

我也有同样的问题。

gcc
(MingGW) 生成的代码比
cl
(MSVC) 更快。两者都没有优化。速度大约快两倍、三倍,有时甚至四倍。

使用

clang-cl
更好,但 MingGW 仍然更快(1.5 倍)。

我不确定是否有一个简单的解释。就我而言,我需要对一些 Web Assembly 编码进行比较。

© www.soinside.com 2019 - 2024. All rights reserved.