C++ 编译器之间的巨大性能差异
Drastic performance difference across C++ compiler
每当我使用标准库容器 stack
、queue
、deque
或 priority_queue
时,性能都在 Visual Studio 变得莫名其妙地慢。可以在 gcc 编译器 (Qt Creator) 中 运行 的同一个程序在几秒钟内在 Visual Studio.
中花费了一分钟
这是一个简单的程序,它使用 BFS 检查一个数字是否可以转换为目标数字。允许的转换是 x->x+1
和 x->x/2
.
代码:
#include <queue>
#include <stack>
#include <iostream>
#include <cstring>
#include <cstdio>
#include <chrono>
using namespace std;
using namespace std::chrono;
const int M=10000000;
int vis[M+1];
bool can(int s, int t) {
memset(vis, 0, sizeof(vis));
stack<int> q;
q.push(s);
int m=0;
vis[s]=true;
while(!q.empty()) {
m=max(m, (int)q.size());
int top=q.top();
q.pop();
if(top==t) return true;
if(top+1<=M && !vis[top+1]) {
q.push(top+1);
vis[top+1]=true;
}
if(!vis[top/2]) {
q.push(top/2);
vis[top/2]=true;
}
}
return false;
}
int main() {
vector <int> S {8769154, 9843630, 2222222, 1, 3456789};
vector<int> T {94383481, 1010101, 9999999, 9876543, 1};
high_resolution_clock::time_point t1=high_resolution_clock::now();
for(int i=0; i<S.size(); i++) {
cout<<can(S[i], T[i])<<endl;
}
high_resolution_clock::time_point t2=high_resolution_clock::now();
auto duration=std::chrono::duration_cast<std::chrono::microseconds>(t2 - t1).count();
cout<<"Execution time "<<duration/1000000.0<<" second";
return 0;
}
输出:
Visual Studio : Execution time 77.3784 second
Qt Creator : Execution time 4.79727 second
同一程序在使用堆栈而不是队列时的输出:
Visual Studio : Execution time 114.896 second
Qt Creator : Execution time 4.35225 second
所以在这种情况下,Qt Creator 运行 比 Visual Studio 快将近 20-30 倍。我不知道为什么会这样。当我不使用这些 STL 容器时,性能差异很小。
如评论中所述,Visual Studio 在调试模式下运行缓慢。部分原因是优化已关闭,部分原因是 VC++ 中的标准库实现对迭代器滥用进行了大量检查。
每当我使用标准库容器 stack
、queue
、deque
或 priority_queue
时,性能都在 Visual Studio 变得莫名其妙地慢。可以在 gcc 编译器 (Qt Creator) 中 运行 的同一个程序在几秒钟内在 Visual Studio.
这是一个简单的程序,它使用 BFS 检查一个数字是否可以转换为目标数字。允许的转换是 x->x+1
和 x->x/2
.
代码:
#include <queue>
#include <stack>
#include <iostream>
#include <cstring>
#include <cstdio>
#include <chrono>
using namespace std;
using namespace std::chrono;
const int M=10000000;
int vis[M+1];
bool can(int s, int t) {
memset(vis, 0, sizeof(vis));
stack<int> q;
q.push(s);
int m=0;
vis[s]=true;
while(!q.empty()) {
m=max(m, (int)q.size());
int top=q.top();
q.pop();
if(top==t) return true;
if(top+1<=M && !vis[top+1]) {
q.push(top+1);
vis[top+1]=true;
}
if(!vis[top/2]) {
q.push(top/2);
vis[top/2]=true;
}
}
return false;
}
int main() {
vector <int> S {8769154, 9843630, 2222222, 1, 3456789};
vector<int> T {94383481, 1010101, 9999999, 9876543, 1};
high_resolution_clock::time_point t1=high_resolution_clock::now();
for(int i=0; i<S.size(); i++) {
cout<<can(S[i], T[i])<<endl;
}
high_resolution_clock::time_point t2=high_resolution_clock::now();
auto duration=std::chrono::duration_cast<std::chrono::microseconds>(t2 - t1).count();
cout<<"Execution time "<<duration/1000000.0<<" second";
return 0;
}
输出:
Visual Studio : Execution time 77.3784 second
Qt Creator : Execution time 4.79727 second
同一程序在使用堆栈而不是队列时的输出:
Visual Studio : Execution time 114.896 second
Qt Creator : Execution time 4.35225 second
所以在这种情况下,Qt Creator 运行 比 Visual Studio 快将近 20-30 倍。我不知道为什么会这样。当我不使用这些 STL 容器时,性能差异很小。
如评论中所述,Visual Studio 在调试模式下运行缓慢。部分原因是优化已关闭,部分原因是 VC++ 中的标准库实现对迭代器滥用进行了大量检查。