Pat*_*oni -1 c++ memory-management new-operator
在我的应用程序启动中,3-ary指针结构的内存分配很少.
#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*32bytes 的分配,导致64 MB堆上.
问题是,仅在Visual Studio DEBUG模式下构建,关于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的测量结果可以为您提供输出.