Visual C++函数突然慢了170毫秒(长4倍)

Mik*_*ael 3 c++ memory-leaks visual-c++ slowdown

在过去的几个月里,我一直致力于Visual C++项目,从相机中获取图像并对其进行处理.到目前为止,这需要大约65毫秒来更新数据,但现在它已经突然显着增加.会发生什么:我启动我的程序,并且在前30次左右的迭代中它按预期执行,然后突然循环时间从65毫秒增加到250毫秒.

奇怪的是,在计时每个函数后,我发现引起减速的代码部分是相当基本的,并且在一个多月内没有被修改过.进入它的数据不变,每次迭代都相同,但最初小于1 ms的执行时间突然增加到170 ms,而其余代码仍然按预期执行(时间).

基本上,我一遍又一遍地调用相同的函数,因为它应该执行的前30个调用,之后它没有明显的原因减速.值得注意的是,这是执行时间的突然变化,而不是逐渐增加.

可能是什么导致了这个?代码泄漏了一些内存(~50 kb/s)但不足以保证突然4倍速度下降.如果有人有任何想法,我很乐意听到他们!

编辑:哇,那太快了!这是减速的代码(减去一些数学).我知道这是一个函数,如果你增加行数,计算时间会迅速增加.这里的关键是,使用相同的数据,这会在30次迭代后减慢.

void CameraManager::IntersectLines()
{

    // Two custom classes
    TMaths maths;
    TLine line1, line2;

    while(lines.size()>0)
    {

        // Save the current line
        line1 = lines[0];

        // Then remove it from the list
        lines.erase(lines.begin());

        CvMat* aPoint;
        for (int i = 0; i<lines.size(); i++)
        {

            line2 = lines[i];

            aPoint = cvCreateMat(1, 4, CV_32FC1);

            // Calculate the point of intersection
            maths.Intersect(line1.xyz, line2.xyz, line1.uvw, line2.uvw, aPoint);

            // Add the point to the list
            points.push_back(aPoint);
            }

        }

    }
Run Code Online (Sandbox Code Playgroud)

}

Col*_*len 9

是否有可能在泄漏一定量的内存后,您的计算机必须开始分页内容?这肯定会减慢甚至简单的功能.

在不知道函数的作用的情况下,很难确切地说出可能导致问题的原因.

编辑:正如问题评论中所建议的那样,泄漏一定数量的内存也可能会开始将事情从CPU缓存中剔除,这也会减慢速度.要么修复内存泄漏,要么在这里发布代码供我们查看,这将是一个好主意.

编辑2:在该循环中调用几个函数.除了简单的算术计算外,他们还做了什么?


mca*_*dre 5

如果它泄漏了足够的内存来填充页面(50KB/s可能就足够了),那么Windows将不得不切换页面来处理数据.当发生这种情况时,程序变得更加低效.