- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我想知道哪种方式更适合通过复制或传递指针(new 和 delete)在函数之间传递一些数据。所以,我测试了在新建和删除操作以及复制上花费的时间。复制时间线性增加,这是预期的。
但是,我从新建和删除中得到了奇怪的时间。在 500KB 比 510KB 和 500KB 之后的花费更多的时间。更进一步,500KB之后显示内存越大,耗时越少。
(是不是因为 Windows 将内存保持在“大” block 中。所以当分配超过 500KB 的内存时,Windows 更容易?那么,为什么是 500KB?)
那么,当数据大小小于500K时,Copy更好,否则使用指针?
有没有人对此有所了解?
下面是我得到的时间。取10000次运算后的平均值。
(环境: win7, vs2010)
大小:10K NewDleteAverageTime:0.012293ms
大小:20K NewDleteAverageTime:0.027168ms
大小:30K NewDleteAverageTime:0.0502781ms
大小:40K NewDleteAverageTime:0.0739503ms
...
大小:210K NewDleteAverageTime:0.116843ms
大小:220K NewDleteAverageTime:0.117263ms
大小:230K NewDleteAverageTime:0.0960635ms
...
大小:430K NewDleteAverageTime:0.165539ms
大小:440K NewDleteAverageTime:0.162156ms
大小:450K NewDleteAverageTime:0.126388ms
大小:460K NewDleteAverageTime:0.168734ms
大小:470K NewDleteAverageTime:0.196589ms
大小:480K NewDleteAverageTime:0.25601ms
大小:490K NewDleteAverageTime:0.25485ms
大小:500K NewDleteAverageTime:0.264911ms
大小:510K NewDleteAverageTime:0.00591305ms
大小:520K NewDleteAverageTime:0.00230184ms
大小:530K NewDleteAverageTime:0.00215912ms
大小:540K NewDleteAverageTime:0.00219284ms
...
大小:980K NewDleteAverageTime:0.00241015ms
大小:990K NewDleteAverageTime:0.00244989ms
大小:1000K NewDleteAverageTime:0.0024912ms
大小:10M NewDleteAverageTime:0.00311146ms
大小:20M NewDleteAverageTime:0.00297647ms
大小:30M NewDleteAverageTime:0.00302636ms
大小:40M NewDleteAverageTime:0.00310456ms
大小:50M NewDleteAverageTime:0.00311733ms
大小:60M NewDleteAverageTime:0.00312078ms
大小:70M NewDleteAverageTime:0.0032505ms
大小:80M NewDleteAverageTime:0.00322513ms
大小:90M NewDleteAverageTime:0.00328945ms
大小:100M NewDleteAverageTime:0.00330236ms
大小:110K CopyAverageTime:0.0128748ms
...
大小:480K CopyAverageTime:0.0286189ms
大小:490K CopyAverageTime:0.0261801ms
大小:500K CopyAverageTime:0.0295913ms
大小:510K CopyAverageTime:0.0308001ms
大小:520K CopyAverageTime:0.0308093ms
大小:530K CopyAverageTime:0.0306727ms
...
大小:1010K CopyAverageTime:0.0804052ms
...
大小:1810K CopyAverageTime:0.183536ms
...
大小:3710K CopyAverageTime:0.400298ms
...
大小:10M CopyAverageTime:1.80764ms
...
大小:60M CopyAverageTime:10.7776ms
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;
}
最佳答案
(Is it because that Windows keep memory in "big" chunk. So that when allocating memory more than 500KB, it was easier for Windows? Then, why 500KB?)
500K 取决于实现。对于另一个系统或编译器,它可能会有所不同。
So, Copy is better when size of data below 500K, otherwise use pointer?
经验法则 - 不要做任何不必要的事情。即使复制和分配相对便宜,最好对任何足够大的数据使用指针(大于 16-32 字节,您的里程可能会有所不同)。
关于c++ - 在新建和删除操作中花费了意外的时间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42918496/
我目前正在开发自己的内存泄漏跟踪系统。 我正在使用 Microsoft Visual C++ 2008,我知道他们有一个内置的,但我一直在为自己制作一个,只是为了好玩。 但是,当我覆盖 new 和 n
在我的库(替换全局 new/delete 运算符)中,我使用另一个外部库(casablanca pplx)。此外部库不包含替换的 new/delete 运算符(我使用 Visual Studio 的
最近的 C++ 标准中的内存分配操作是否有复杂性保证?也就是说,如果我有一个类 A,其默认构造函数和析构函数在 O(1) 中运行,那么“new A[N]”和“delete[] A”的 big-O 是什
我正在用 Qt 和 C++ 编写一个简单的编辑器。我想要有标签,所以在创建新文档后,我想在新标签中打开它。我的代码: // mainwindow.cpp #include "mainwindow.h"
好吧,这让我感到困惑...下面的代码在一个 DLL 中,当我的控制台应用程序调用这段代码时,它突然在 delete[] lpBuffer 行抛出访问冲突。我整天都在使用这段代码,根本没有改变它。到目前
我现在很头疼。 基本上我有这个: Class A -> Class B Class A -> Class C Class A -> Class D Class E with constructor w
我想通过将一个表 (tableA) 与另一个表 (tableB) 进行比较来查找新的、修改的和删除的记录。两个表具有相同的模式并具有唯一的 ID 字段。 在我的情况下,tableA 最初与 table
这是我们的商业案例, 应用程序为使用过的 iPhone 提供即时报价,并允许卖家立即出售。另一方面,有些买家愿意立即购买或竞标房源。潜在的零售商可以访问网站并根据年份、型号、状况、配件输入获得即时报价
需要一些帮助。设法创建一个 jQuery 来在单击后更改按钮的类,但我需要您单击一个从其他按钮中删除的新按钮类。 我正在努力,但我做不到。我已经尝试了一些方法,但每当我尝试时,我都可以删除所有内容并单
为什么“创建 Java 项目”屏幕中有时会缺少“内容”部分(带有“从现有源创建项目”选项)?我知道我以前见过并使用过它,但现在它已经消失了。 最佳答案 您最好在 Eclipse JDT 论坛上提出这个
我写了下面的代码 1. function Car() { this.make = "BMW" } var x = new Car().make alert(x) 结果:显示警报 BMW 2. fu
我正在使用 wxPython 为 python 应用程序编写 UI。我已经处理了一些 OnX 函数,但我需要 OnNew 和 OnSave/SaveAs 方面的帮助 这是我的保存和另存为代码: def
每当我尝试创建一个新的 Win32 控制台应用程序或 Win32 项目时,Win32 应用程序向导弹出,项目设置项目符号点为空,并且无法单击“应用程序设置”、“完成”和“取消”按钮. 当我搜索与我类似
我创建了一个扩展点 newWizard,并在那里添加了向导(比方说 Wizard1、Wizard2、Wizard3)。我创建了一个视角,即 perspectiv1。当我创建插件项目时,所有向导标签都会
新建 >> 项目 >> Android 应用程序 项目不起作用我收到这些消息: Problem Opening Wizard The selected wizard could not be star
#include #include using namespace std; int main(void) { unsigned char* pFoo = new unsigned cha
谁能帮我理解为什么我的代码在第一段代码中的 delete[] szPassword 上失败?我知道 szPassword 只是复制“a”,而 st2 等于 8: TCHAR *szPassword =
伙计们,如果我在我的 dll 代码中覆盖全局新建和删除,这会覆盖用户代码新建和删除吗?我做了一个测试,显示用户new和delete不会受到影响。如果我想让用户代码new和delete被我的sdk ne
编译 in_ 表达式的默认 SQLAlchemy 行为对于非常大的列表来说是病态的,我想为运算符创建一个自定义的、更快的编译器。如果解决方案是一个新的运算符(即:in_list_)或者它是否覆盖了 i
new 和 delete 被称为预处理器,而 malloc 和 free 是函数。 new 和 delete 是预处理器是什么意思? 最佳答案 new 和 delete 是 C++ 运算符(如 +、(
我是一名优秀的程序员,十分优秀!