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;
}