Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/158.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 新建和删除操作花费了意外的时间_C++_Windows_Visual Studio_Memory - Fatal编程技术网

C++ 新建和删除操作花费了意外的时间

C++ 新建和删除操作花费了意外的时间,c++,windows,visual-studio,memory,C++,Windows,Visual Studio,Memory,我想知道通过复制或传递指针(new和delete),哪种方法更适合在函数之间传递一些数据。所以,我测试了new和delete操作以及复制所花费的时间。复制时间按预期线性增加 但是,我从新的和删除得到了奇怪的时间。在500KB时,需要的时间超过510KB,而在500KB之后则需要更长的时间。此外,在500KB之后,显示的内存越大,所需时间越短 (这是因为Windows将内存保持在“大”块中。因此,当分配的内存超过500KB时,Windows会更轻松?那么,为什么是500KB呢?) 所以,当数据的大

我想知道通过复制或传递指针(new和delete),哪种方法更适合在函数之间传递一些数据。所以,我测试了new和delete操作以及复制所花费的时间。复制时间按预期线性增加

但是,我从新的和删除得到了奇怪的时间。在500KB时,需要的时间超过510KB,而在500KB之后则需要更长的时间。此外,在500KB之后,显示的内存越大,所需时间越短

(这是因为Windows将内存保持在“大”块中。因此,当分配的内存超过500KB时,Windows会更轻松?那么,为什么是500KB呢?)

所以,当数据的大小低于500K时,拷贝更好,否则使用指针

有人知道这件事吗

下面是我得到的时间。在10000次手术后,这是平均值

(环境:win7,vs2010)

新增和删除: 大小:10K新数据平均时间:0.012293ms
尺寸:20K新数据平均时间:0.027168ms
尺寸:30K新数据平均时间:0.0502781ms
尺寸:40K新数据平均时间:0.0739503ms

大小:210K新数据平均时间:0.116843ms
尺寸:220K新德里平均时间:0.117263ms
尺寸:230K新德里平均时间:0.0960635ms

尺寸:430K新德里平均时间:0.165539ms
尺寸:440K新德里平均时间:0.162156ms
尺寸:450K新德里平均时间:0.126388ms
尺寸:460K新德里平均时间:0.168734ms
尺寸:470K新数据平均时间:0.196589ms
尺寸:480K新德里平均时间:0.25601ms
大小:490K新德里平均时间:0.25485ms
大小:500K新数据平均时间:0.264911ms
大小:510K新数据平均时间:0.00591305ms
尺寸:52000新数据平均时间:0.00230184ms

尺寸:530K新德里平均时间:0.00215912ms
尺寸:540K新数据平均时间:0.00219284ms

尺寸:980K新数据平均时间:0.0024105ms
尺寸:990K新德里平均时间:0.00244989ms
尺寸:1000K新数据平均时间:0.0024912ms
尺寸:10M新数据平均时间:0.00311146ms
大小:20M新数据平均时间:0.00297647ms
尺寸:30M新数据平均时间:0.00302636ms
尺寸:40M新数据平均时间:0.00310456ms
尺寸:50M新数据平均时间:0.00311733ms
尺寸:60M新数据平均时间:0.00312078ms
尺寸:70M新数据平均时间:0.0032505ms
尺寸:80M新德里平均时间:0.00322513ms
尺寸:90M新德里平均时间:0.00328945ms
大小:100M新数据平均时间:0.00330236ms

复制:线性 大小:110K拷贝平均时间:0.0128748ms

大小:480K拷贝平均时间:0.0286189ms
大小:490K拷贝平均时间:0.0261801ms
大小:500K拷贝平均时间:0.0295913ms
大小:510K拷贝平均时间:0.0308001ms
大小:520K拷贝平均时间:0.0308093ms
大小:530K拷贝平均时间:0.0306727ms

大小:1010K拷贝平均时间:0.0804052ms

大小:1810K拷贝平均时间:0.183536ms

大小:3710K拷贝平均时间:0.400298ms

大小:10M拷贝平均时间:1.80764ms

尺寸:60米拷贝平均时间:10.7776毫秒

这是我的密码
void NewDeleteTime(单位U)
{
流出(“NewDeleteTime.txt”,ios::out | ios::app);
字符串strUnit=Unit_M==U?“M”:“K”;
int UnitSize=Unit_M==U?M1:K1;
const int interval=10;
常量int MaxSize=1001;
常数int repeat=1000;
矢量数据;
储备(10);
时间计数器;
int max=单位μM==U?101:1001;
用于(整数大小=10;大小<最大值;大小+=间隔)
{
//setSrcData(尺寸*M1);
tmr.Start();
用于(整数倍=0;倍<重复;++倍)
{
//新的
对于(int i=0;i<10;++i)
{
char*pD=新字符[size*UnitSize];
vecData.推回(pD);
}
//删除
对于(int i=0;i
500K依赖于实现。对于其他系统或编译器,它可能不同

所以,当数据的大小低于500K时,拷贝更好,否则使用指针

经验法则-不要做任何你不需要做的事情。 即使拷贝和分配相对便宜,最好对任何足够大的数据使用指针(大于16-32字节,您的里程可能会有所不同)

(这是因为Windows将内存保持在“大”块中。因此,当分配的内存超过500KB时,Windows会更轻松?那么,为什么是500KB呢?)

500K依赖于实现。对于其他系统或编译器,它可能不同

所以,当数据的大小低于500K时,拷贝更好,否则使用指针

经验法则-不要做任何你不需要做的事情。 即使拷贝和分配相对便宜,最好对任何足够大的数据使用指针(大于16-32字节,您的里程可能会有所不同)

void NewDeleteTime( Unit U )
{
    ofstream out("NewDeleteTime.txt", ios::out | ios::app);
    string strUnit = Unit_M == U ? "M":"K";
    int UnitSize = Unit_M == U ? M1 :K1;

    const int interval = 10;
    const int MaxSize = 1001;
    const int repeat = 1000;

    vector<char*> vecData;
    vecData.reserve(10);

    TimerCounter tmr;

    int max = Unit_M == U ? 101 : 1001;

    for (int size = 10; size < max; size += interval)
    {
        // setSrcData( size * M1);

        tmr.Start();

        for ( int times = 0; times < repeat; ++ times )
        {
            // new
            for ( int i =0; i < 10; ++i )
            {
                char* pD = new char[size * UnitSize];
                vecData.push_back( pD );
            }


            // delete
            for ( int i =0; i < vecData.size(); ++i )
            {
                delete[] vecData[i];
            }

            vecData.clear();
        }

        tmr.Stop();

        cout<<"size: "<<size<<strUnit<<" NewDleteAverageTime:"<< tmr.dbTime * 1000 / repeat / 10 <<"ms"<<endl;
        out<<"size: "<<size<<strUnit<<" NewDleteAverageTime:"<< tmr.dbTime * 1000 / repeat / 10 <<"ms"<<endl;

    }