MSVC скомпилированный код работает в разы медленней MinGW

Результаты ниже. Можно ли еще как то оптимизировать компиляцию MSVC, чтобы достигнуть примерно такой же скорости выполнения программы, как в MinGW. В чем собственно причина, плохой оптимизатор MSVC или какие то дополнительные проверки делают программу столь медленной?


  • Компилятор: g++ (x86_64-win32-sjlj-rev3, Built by MinGW-W64 project) 12.1.0
  • Компиляция: g++ -O3 main.cpp
  • Время выполнения: 18517 ms

  • Компилятор: Microsoft (R) C/C++ Optimizing Compiler Version 19.33.31629 for x64 (Toolset v143, SDK 10.0.20348.0)
  • Компиляция: cl /O2 main.cpp
  • Время выполнения: 58144 ms

Код:

#include <cmath>
#include <string>
#include <unordered_map>
#include <vector>
#include <chrono>
#include <fstream>
#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();

    const string word1 = "abcdef";
    const string word2 = "fedcba";
    for (int i = 0; i < 30000; i++) {
        for (int j = 0; j < 30000; j++) {
            sum += getMask(word1, word2);
        }
    }
    auto t1 = chrono::steady_clock::now();
    cout << chrono::duration_cast<chrono::milliseconds>(t1 - t0).count() << "[ms]" << endl;

    cout << sum << endl;

    return 0;
}

Ответы (0 шт):