我需要为 NodeJS 编写一些插件。由于插件应该在 Windows 上运行,所以我需要使用 MSVC 编译它。但编译后我发现插件比原始程序慢。所以,经过检查,我得出的结论是MSVC的问题。请参阅下面的结果。所以,我不明白,为什么MSVC产生这么慢的程序。我可以以某种方式优化 MSVC 编译,以达到 MinGW 编译程序的速度吗?或者只是 MSVC 生成优化程度较低的代码,而 MSVC 的最大优化已经达到?
备注:
swap(word1, word2)
只是为了防止 MinGW 优化,这会导致执行时间为 0 秒。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;
}
我也有同样的问题。
gcc
(MingGW) 生成的代码比 cl
(MSVC) 更快。两者都没有优化。速度大约快两倍、三倍,有时甚至四倍。
使用
clang-cl
更好,但 MingGW 仍然更快(1.5 倍)。
我不确定是否有一个简单的解释。就我而言,我需要对一些 Web Assembly 编码进行比较。