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

标签 c++ visual-c++ memory-leaks slowdown

在过去的几个月里,我一直致力于 Visual C++ 项目,以从相机获取图像并进行处理。直到今天,更新数据大约需要 65 毫秒,但现在它突然显着增加。发生的情况是:我启动我的程序,在前 30 次左右的迭代中,它按预期执行,然后循环时间突然从 65 毫秒增加到 250 毫秒。

奇怪的是,在对每个函数进行计时后,我发现导致速度变慢的代码部分相当基础,并且在一个多月内没有被修改。进入其中的数据在每次迭代中都保持不变且相同,但最初小于 1 毫秒的执行时间突然增加到 170 毫秒,而其余代码仍按预期执行(时间方面)。

基本上,我一遍又一遍地调用同一个函数,前 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);
            }

        }

    }

最佳答案

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

在不知道函数的作用的情况下,很难确切地说出是什么导致了问题。

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

编辑 2:您在该循环中调用了几个函数。除了简单的算术计算,他们还会做其他事情吗?

关于c++ - Visual C++ 函数突然慢了 170 毫秒(长了 4 倍),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3047939/

相关文章:

memory-leaks - F# 可观察事件是否消除、调解或与弱引用的需要无关?

C++ Lambda、捕获、智能 Ptr 和堆栈 : Why Does this Work?

c++ - 未解析的外部符号(OpenGL 和 C++)

c++ - 类似 print END << END;在 C++ 中?

c++ - GSL blas 例程在 Visual Studio 中变慢

C++ 从 Unix 转移到 Windows 中的 Visual Studio

c++ - .cpp 和 .h 文件的不同处理方式?

visual-studio - 如何在 Visual Studio 中设置 DLL 文件的路径?

c - 如何在c开发过程中避免内存泄漏

java - Cassandra 绑定(bind)语句和内存泄漏