簡體   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