每当我使用标准库容器stackqueuedequepriority_queue时,Visual Studio的性能都会变得异常缓慢。可以在几秒钟内在gcc编译器(Qt Creator)中运行的同一程序在Visual Studio中需要一分钟以上的时间。

这是一个使用BFS来检查数字是否可以转换为目标数字的简单程序。允许的转换为x->x+1x->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:执行时间77.3784秒
  Qt Creator:执行时间4.79727秒


使用堆栈而不是队列时同一程序的输出:


  Visual Studio:执行时间114.896秒
  Qt Creator:执行时间4.35225秒


因此,在这种情况下,Qt Creator的运行速度比Visual Studio快20-30倍。我不知道为什么会这样。当我不使用这些STL容器时,性能差异很小。

最佳答案

如注释中所述,Visual Studio在调试模式下运行缓慢。部分原因是优化工作不可行,部分原因是VC ++中的标准库实现对迭代器滥用进行了大量检查。

07-28 01:26
查看更多