C++ C+之间的巨大性能差异+;编译程序

C++ C+之间的巨大性能差异+;编译程序,c++,gcc,visual-studio-2013,stl,qt-creator,C++,Gcc,Visual Studio 2013,Stl,Qt Creator,每当我使用标准库容器stack、queue、deque或priority\u queue,Visual Studio中的性能都会变得令人费解的慢。在VisualStudio中,可以在几秒钟内在gcc编译器(Qt Creator)中运行的相同程序需要一分钟 下面是一个简单的程序,它使用BFS检查一个数字是否可以转换为目标数字。允许的转换是x->x+1和x->x/2 代码: #包括 #包括 #包括 #包括 #包括 #包括 使用名称空间std; 使用名称空间std::chrono; 常数int M=1

每当我使用标准库容器
stack
queue
deque
priority\u queue
,Visual Studio中的性能都会变得令人费解的慢。在VisualStudio中,可以在几秒钟内在gcc编译器(Qt Creator)中运行的相同程序需要一分钟

下面是一个简单的程序,它使用BFS检查一个数字是否可以转换为目标数字。允许的转换是
x->x+1
x->x/2

代码:

#包括
#包括
#包括
#包括
#包括
#包括
使用名称空间std;
使用名称空间std::chrono;
常数int M=10000000;
int-vis[M+1];
布尔can(整数s,整数t){
memset(vis,0,sizeof(vis));
堆栈q;
q、 推;
int m=0;
vis[s]=真;
而(!q.empty()){
m=最大(m,(int)q.size());
int-top=q.top();
q、 pop();
if(top==t)返回true;

如果(顶部+1如评论中所述,Visual Studio在调试模式下运行缓慢。部分原因是优化关闭,部分原因是VC++中的标准库实现对迭代器滥用进行了大量检查。

将哪些标志传递给每个编译器?探查器对此问题说了什么?@Jarod42您在该文件中看到了什么de对于哪个移动语义会产生可测量的性能差异?请显示两个编译器使用的编译标志。您是否可能将优化的gcc构建与调试与构建进行比较?使用我的MSVC 2013 Ultimate副本,您的程序在发布构建中打印执行时间0.48秒,
执行时间62.743调试时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;
}