c++ - 异常缓慢的方法

标签 c++

我的项目中有一个方法,将其放入自己的程序中只需几秒钟即可运行,而在其所属的项目中运行则需要 5 分钟。我不知道为什么。我已经尝试过分析,取出位,改变这个和那个。我很难过。

它填充一个整数 vector 以供另一个类使用,但该类当前未被实例化。我已经尽可能多地进行了检查,看起来确实没有发生任何其他事情,但该方法神奇地在一个项目中比在另一个项目中花费了更长的时间。

该方法在启动时运行,大约需要 5 分钟,如果单独运行则大约需要 3 秒。是什么原因造成的?奇怪的项目设置?我不知道的多线程东西? (据我所知,我的项目中没有任何项目,除非它是自动完成的)。

有项目的链接 here .如果有人能为我解决这个问题,我将不胜感激,我会尽快为此悬赏。

该方法称为 PopulatePathVectors 并在 Level.cpp 中运行。注释掉对方法的调用(在关卡构造函数中)意味着程序会在几秒钟内启动。使用它生成的列表的唯一其他类是 Agent,但目前没有实例化。

编辑 - 根据要求,这是代码。尽管请记住,我的问题不是“为什么代码很慢?”但是“为什么它在一个地方很快,而在我的项目中却很慢?”

//parses the text path vector into the engine
void Level::PopulatePathVectors(string pathTable)
{
    // Read the file line by line.
    ifstream myFile(pathTable);

        for (unsigned int i = 0; i < nodes.size(); i++)
        {
            pathLookupVectors.push_back(vector<vector<int>>());

            for (unsigned int j = 0; j < nodes.size(); j++)
            {
                string line;

                if (getline(myFile, line)) //enter if a line is read successfully
                {
                    stringstream ss(line);
                    istream_iterator<int> begin(ss), end;
                    pathLookupVectors[i].push_back(vector<int>(begin, end));
                }
            }
        }
}

编辑 - 我知道代码不是最好的,但这不是重点。它自己运行很快——大约 3 秒,这对我来说很好。我要解决的问题是为什么在项目中需要这么长的时间。

编辑 - 除了主游戏循环外,我注释掉了所有游戏代码。我将该方法放入代码的初始化部分,该部分在启动时运行一次。除了一些设置窗口的方法外,它现在与仅包含该方法的程序几乎相同,只是它仍然需要大约 5 分钟才能运行。现在我知道它与 pathLookupVectors 的依赖关系无关。另外,我知道计算机开始写入硬盘驱动器不是内存问题,因为当缓慢的程序正在运行该方法时,我可以打开另一个 VS 实例并同时运行单一方法程序,它在秒。我意识到问题可能出在一些基本设置上,但我没有经验,如果这确实令人失望地成为原因,我深表歉意。我仍然不知道为什么要花这么长时间。

如果这不会在 Debug模式下花费太长时间,那就太好了,因为这意味着我每次进行更改时都需要等待 5 分钟。一定是有原因的,为什么这里这么慢。这些是缩减项目中包含的其他 header :

#include <d3d10.h>
#include <d3dx10.h>
#include "direct3D.h"
#include "game.h"
#include "Mesh.h"
#include "Camera.h"
#include "Level.h"

#include <vector>

using namespace std;

编辑 - this是一个小得多的自包含项目,只有一小部分代码仍然会出现问题。

this也是一个非常小的项目,具有相同的代码,但运行速度非常快。

最佳答案

我在 MSVC10(您使用的是同一编译器)中运行了这段代码,并使用您提供的项目复制了您的结果。但是,由于使用了 express 版本,我无法使用此编译器进行分析。

我在 MSVC9 编译器中运行这段代码,它的运行速度提高了 5 倍!我也分析了它,并得到了这些结果:

Initialize (97.43%)
    std::vector::_Assign (29.82%) 
        std::vector::erase (12.86%)
            std::vector::_Make_iter (3.71%)
            std::_Vector_const_iterator (3.14%)
        std::_Iterator_base (3.71%)
        std::~_Ranit (3.64%)
    std::getline (27.74%)
        std::basic_string::append (12.16%)
            std::basic_string::_Grow (3.66%)
            std::basic_string::_Eos (3.43%)
        std::basic_streambuf::snextc (5.61%)
    std::operator<<(std::string) (13.04%)
        std::basic_streambuf::sputc(5.84%)
    std::vector::push_back (11.84%)
        std::_Uninit_move::?? (3.32%)
    std::basic_istream::operator>>(int) (7.77%)
        std::num_get::get (4.6%)
            std::num_get::do_get (4.55%)

“快速”版本得到了这些结果:(缩放以匹配其他时间):

Initialize (97.42%)
    std::_Uninit_copy (31.72%)
        std::_Construct (18.58%)
        std::_Vector_const_iterator::operator++ (6.34%)
        std::_Vector_const_iterator::operator!= (3.62%)
    std::getline (25.37%)
        std::getline (13.14%)
        std::basic_ios::widen (12.23%)
    std::_Construct (18.58%)
        std::vector::vector (14.05%)
    std::_Destroy (14.95%)
        std::vector::~vector (11.33%)
    std::vector::_Tidy (23.46%)
        std::_Destroy (19.89%)
            std::vector::~vector (12.23%)
        [ntdll.dll] (3.62%)

在研究了这些结果并多次考虑了 Michael Price 的评论后,我突然想到要确保输入文件的大小相同。当我意识到这一点时,我意识到“快速”版本的配置文件显示std::operator<<(std::string)std::vector::push_back一点都不,这看起来很可疑。我检查了 MethodTest 项目,发现它没有 WepTestLevelPathTable.txt ,导致 getline 失败,整个函数几乎什么都不做,除了分配一堆空 vector 。当我复制 WepTestLevelPathTable.txt对于 MethodTest 项目,它与“慢”verison 的速度完全相同。破案了。使用较小的文件进行调试构建。

关于c++ - 异常缓慢的方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8120520/

相关文章:

c++ - 不抛出但依赖于抛出的库的类

c++ - move 构造函数而不实现,但它可以工作

c++ - 为什么线程在终止而不分离时让它们的堆栈保持不变?

c++ - 我如何将其编译成可执行文件

c++ - CSV 格式不正确

c++ - 使用 make 将 .o 文件移动到单独的目录

c++ - do{}while(0) 有什么用?

c++ - 定义指数预处理器宏

c++ - 如何在不违反类型别名规则的情况下解释消息负载?

C++、SDL、函数在首次启动后似乎没有改变主界面