繁体   English   中英

操作符new []在MSVC调试中极其缓慢

[英]operator new[] extremely slow on MSVC debug

在我的应用程序启动中,三元指针结构的内存分配很少。

#define N_1 1024
#define N_2 32
#define N_3 1024

#include <boost/date_time/posix_time/posix_time.hpp>

typedef uint16_t counts;
typedef counts * spectra;
typedef spectra * line;
typedef line * pline;
typedef pline * cube;

void foo()
{
    cube cb = new pline[N_3];

    for (int n3 = 0; n3 < N_3; n3++)
    {
        boost::posix_time::ptime tic = boost::posix_time::microsec_clock::local_time();

        line ln = new spectra[N_2];

        for (int n2 = 0; n2 < N_2; n2++)            
        {
            ln[n2] = new counts[N_1]();
        }

        cb[n3] = &(ln);

        boost::posix_time::ptime toc = boost::posix_time::microsec_clock::local_time();
        boost::posix_time::time_duration dur = toc - tic;
        std::cout << n3 << " line allocated in " << dur.total_microseconds() << " us\n";
    }
}

因此,我们分配了sizeof(counts)*N_1*N_2*N_3 = 2*1024*1024*32个字节,从而导致堆上有64 MB

问题是,仅在Visual Studio调试模式下进行构建时,有关在foo()执行期间消耗的大量时间。 特别是,这是奇怪的(afaik)日志的一部分:

在0 us中分配了0行

在0 us中分配了1行

.........................

在0 us中分配了104行

105行分配给1000002美国

在0 us中分配了106条线

.........................

发布模式下,一切运行顺利。 有见识吗?

编辑:

由于大多数的你指出我的错误使用boost::posix_time::second_clock ,现在取而代之boost::posix_time::microsec_clock ,我想强调的事实是,真正的问题是在new[]性能,同时调试,不是最好的tic-toc工具。

您正在使用boost::posix_time::second_clock ,它仅每秒滴答一次。 因此,您进行的时间测量为零秒或1秒(或更长时间,但这不太可能)。 当我们打印测量结果为1s时,将为您提供输出。

您将如何庆祝新的一年? 可能会发生,您太累了,不会在00:00醒着才去喝一杯酒。 当您第二天醒来时,是否可以声称您已睡了整整一年(因为您在2016年入睡并在2017年醒来),这是否公平?

分辨率为一秒的时钟也会发生同样的情况。 如果某个操作开始执行到足够接近准确的第二边界(例如,在10:23 AM 45秒和999毫秒处),则该操作似乎将持续1秒。

在发行版中,大部分时间都花在“ cout << ... ”上,而程序的其余部分捕获第二个增量瞬间的可能性很小。 使用程序的调试版本(因此会稍慢一些)会增加此类事件的可能性,因为调试版本中内存分配操作的速度比I / O操作的速度要慢。


编辑

请注意,使用boost::posix_time::microsec_clock 不能保证微秒的分辨率

ptime microsec_clock::local_time()

使用亚秒级分辨率时钟获取本地时间。 在Unix系统上,这是使用GetTimeOfDay实现的。 在大多数Win32平台上,它是使用ftime实现的。 Win32系统通常无法通过此API达到微秒级的分辨率 如果更高的分辨率对您的应用程序至关重要,请测试平台以查看达到的分辨率。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM