C++ 新建和删除操作花费了意外的时间
我想知道通过复制或传递指针(new和delete),哪种方法更适合在函数之间传递一些数据。所以,我测试了new和delete操作以及复制所花费的时间。复制时间按预期线性增加 但是,我从新的和删除得到了奇怪的时间。在500KB时,需要的时间超过510KB,而在500KB之后则需要更长的时间。此外,在500KB之后,显示的内存越大,所需时间越短 (这是因为Windows将内存保持在“大”块中。因此,当分配的内存超过500KB时,Windows会更轻松?那么,为什么是500KB呢?) 所以,当数据的大小低于500K时,拷贝更好,否则使用指针 有人知道这件事吗 下面是我得到的时间。在10000次手术后,这是平均值 (环境:win7,vs2010) 新增和删除: 大小:10K新数据平均时间:0.012293msC++ 新建和删除操作花费了意外的时间,c++,windows,visual-studio,memory,C++,Windows,Visual Studio,Memory,我想知道通过复制或传递指针(new和delete),哪种方法更适合在函数之间传递一些数据。所以,我测试了new和delete操作以及复制所花费的时间。复制时间按预期线性增加 但是,我从新的和删除得到了奇怪的时间。在500KB时,需要的时间超过510KB,而在500KB之后则需要更长的时间。此外,在500KB之后,显示的内存越大,所需时间越短 (这是因为Windows将内存保持在“大”块中。因此,当分配的内存超过500KB时,Windows会更轻松?那么,为什么是500KB呢?) 所以,当数据的大
尺寸: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;
}