为经常分配和释放内存的函数分配内存的最好方法是什么? 假设这个函数在1GHz的处理器上每秒调用大约500到1000次。
(请忽略静态和全局variables/分配。我只感兴趣这个特定的情况:)
voID test() { ptr=malloc(512) // 512 bytes ... free(ptr) }
要么
voID test() { struct MyStruct localvar; // 512 byte sized structure ... }
内存中丢失了一些Structs值
不一致的运营商新/删除呼叫
在不考虑区域设置的情况下处理不区分大小写的情况
如何在阅读视图中打开Web视图? UWP
全局描述符表的物理地址?
在win32上执行fopen()
创buildlinux make / build文件
有没有办法跟随一个windows文件系统快捷方式编程方式在C#不使用COM?
如何保存表单的状态?
分配给发送给方法的参数的大小
本地变量的堆栈分配比使用malloc堆分配快。 但是,总的堆栈空间是有限的(例如几兆字节)。 所以你应该限制自己在本地堆栈上的“小”数据。 (根据今天的标准,512字节是小的,但是256Kb对于本地堆栈分配来说太大了)。
如果你的函数是非常深的递归,那么甚至512字节可能太大了,因为你需要每个递归调用帧。
但是每秒调用malloc几千次应该是无痛的(恕我直言,一个典型的小型malloc需要几十微秒)。
为了您的好奇心,在C世界之外,您可能会对旧的A.Appel的纸质垃圾收集感兴趣,可能会比堆栈分配更快 (但也许缓存性能考虑可能会削弱今天的这种说法)。
局部变量基本上是“免费”分配的,所以如果我们只对性能感兴趣,那么就没有比赛了。
然而:
本地和堆分配的变量之间的选择通常不是你可以自由决定而没有约束的东西; 通常有一些因素要求选择,所以你的问题有点怀疑,因为它似乎无视这个问题
虽然在堆栈上的分配是“自由的”性能,堆栈上的空间可能是有限的(虽然512字节当然不算什么)
哪个是分配内存的最好方法….
哪个配置更快 ?
你想要更快的方式,还是更好的方法?
无论如何,在你提到的情况下,我想第二个选择:
struct MyStruct localvar;
更高效,因为内存分配是由堆栈完成的。 使用像malloc这样的动态内存分配函数的效率要高得多。
优化
另外,如果你正在做这个性能和优化…
在我的电脑上,使用malloc来分配字符串,而不是从堆栈中声明一个字符数组,这使我每个字符串的延迟时间大约为73纳秒。
如果您在程序中复制了50个字符串:4757142/50 = 95142(和一些)运行您的程序
如果我每天运行你的程序50次:95142/50 = 1902(有点)几天
1902天= 5/5年
所以,如果你每天运行你的程序5年2个月,你将节省时间眨眼间额外的时间。 哇,多么有价值…
当你进入你的功能时打开你的反汇编程序,并通过2例。
局部变量(基于堆栈)将需要0个额外的周期 – 你甚至不会看到分配的位置,因为函数将通过移动堆栈指针来分配1个周期中的所有局部变量,并释放所有局部变量在1个周期内通过恢复堆栈指针。 如果您有1个或1000个局部变量,则“分配”占用相同的时间。
malloc变量……好吧,你将很快感到无聊的点击步骤通过执行从系统堆中获取内存的数千条指令。 最重要的是,你可能会注意到,循环次数因呼叫而异,具体取决于你已经从堆中分配了多少东西,因为每次请求内存时malloc需要通过堆结构进行“搜索”。
我的经验法则 :总是使用堆栈,如果可能的话,而不是malloc/free或new/delete 。 除了更快的性能之外,您还可以获得无需担心内存或资源泄漏的额外好处。 在C中,这只是意味着忘记调用free() ,但是在C ++中,如果在调用delete 之前抛出异常,那么可能会毁了你的一天。 如果你使用堆栈变量,这一切都自动处理! 但是,如果你正在谈论“小”的内存(字节和KB)而不是巨大的对象(不是MB或GB!),只能使用堆栈。 如果你正在谈论巨大的对象,那么你不再是在谈论性能,而且你可能不会在相同的函数调用中调用free/delete 。
堆栈分配比malloc + free更快。
堆栈分配通常以指令来衡量,而malloc + free可能需要多个锁(作为比较需要很长时间的一个例子)。
局部变量的情况会更快:在栈上分配一个变量不会花费额外的时间,它只是改变栈指针的移动量。 而malloc将不得不做一些簿记。
使用堆栈的另一个优点是它不会分割malloc存在的内存空间。 当然,这只是长期运行流程的一个问题。
总结以上是内存溢出为你收集整理的哪个configuration更快? malloc vs局部variables全部内容,希望文章能够帮你解决哪个configuration更快? malloc vs局部variables所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)