把一个很大很大的数组清零的最快方法是什么?memset()很慢。

z341223318 2008-12-11 12:00:46
数组大小有40多万个字节,直接用memset()置0导致别的任务暂停了一会,有没有更好更快的方法,使在一个任务中对一个很大很大的数组置0对别的任务没有影响。
...全文
4682 85 打赏 收藏 转发到动态 举报
写回复
用AI写文章
85 条回复
切换为时间正序
请发表友善的回复…
发表回复
ljhhh0123 2011-04-03
  • 打赏
  • 举报
回复
static char buf[400000];
顶25楼!
最快的是不用清0的.因为操作系统已经帮你做了.
40万字节,才400K而已,操作系统能为你分配的.
laoyehu 2011-04-03
  • 打赏
  • 举报
回复
好贴,受教了。
kingstarer 2011-04-03
  • 打赏
  • 举报
回复
哦 是比较久以前的贴


我觉得可能是在其它方面出现问题,现在的计算机执行40w条指针应该很快的
kingstarer 2011-04-03
  • 打赏
  • 举报
回复
直接用memset()置0导致别的任务暂停了一会
===============
人能感觉出来的暂停? 那你考虑一下换机器吧

我这边memset一M的数据都没感觉
freefei 2011-04-03
  • 打赏
  • 举报
回复
[Quote=引用 82 楼 bokutake 的回复:]
#79楼……操作系统虽然能够在分配时清零,比如new函数调用的HeapAlloc()可以加ZERO的参数,但是那个功能C语言并没有使用,所以分配到的变量都是随机值。
[/Quote]
难道c语言调用系统调用,内存都是有操作系统分配的
freefei 2011-04-03
  • 打赏
  • 举报
回复
[Quote=引用 17 楼 tnfyj 的回复:]
40多万个字节用一个数组....
何必呢...
这样不光是你清空的时候慢吧...
遍历呢?查找呢?随机访问呢? 都会很慢的...
不要试图用优化的技术来掩盖拙劣的设计...
[/Quote]
感觉楼主的设计有问题,分配4M一次
干什么用呢?
Srulos 2011-04-03
  • 打赏
  • 举报
回复
0 0好多人阿,,有点饿了,
辰岡墨竹 2011-04-03
  • 打赏
  • 举报
回复
#79楼……操作系统虽然能够在分配时清零,比如new函数调用的HeapAlloc()可以加ZERO的参数,但是那个功能C语言并没有使用,所以分配到的变量都是随机值。
super_admi 2011-04-03
  • 打赏
  • 举报
回复
最快的方法,应该是不操作。需要的时候,直接覆盖掉。
pathuang68 2011-04-03
  • 打赏
  • 举报
回复
你们继续讨论,俺旁观。最近一段时间用Java写代码的机会更多些...
666233 2011-04-02
  • 打赏
  • 举报
回复
mark..
辰岡墨竹 2011-04-02
  • 打赏
  • 举报
回复
关闭电源……哪位,RAM上电后会变成随机值的……不是0。
memset是按字节操作的,不过其内部优化应该尽可能以rep movsd一次32个字节之类的方式实现的吧。MOVQ之类的MMX指令甚至SSE指令应该能更快一些。
数组轮换配合多线程的话是好主意。如果把内存块分割成整块大小,比如4KB。然后根据程序下一步的需求试试清零,并且建立位图表,程序访问哪块后设置上脏标志。
当然最终极的方法是在Ring0级修改GDT和LDT,将整个内存池的所有页面都指向同一个内存物理页面,这样只需要清空一个4KB内存区域就可以了,把这些页面设置为只读,当试图写入时会触发保护模式异常,然后在异常处理里分配新页面并清零——(写时复制)。
snake_xiongyang 2011-04-02
  • 打赏
  • 举报
回复
这个帖子好
楼上有人提到了两个数组轮换 再配合另外开一个线程的方法 可以应对这个设计缺陷
当然鄙视一下楼主的结贴率,都是啥人啊
学习了
luciferisnotsatan 2011-04-02
  • 打赏
  • 举报
回复
谁挖的坟

另外,鄙视下lz的结贴率。200多帖子才结了22个
赵4老师 2011-04-02
  • 打赏
  • 举报
回复
关闭电源!嘿嘿!低电平(0V)据说就是0
赵4老师 2011-04-02
  • 打赏
  • 举报
回复
SIMD指令?
jjboy2010 2011-04-02
  • 打赏
  • 举报
回复
个人拙见 先 与 再移位。 char a[5万】; unsigned long a = 0;

p[0] && a << 1万 。 此方法需要先判断 CPU 是 大端 还是小端。
独酌逸醉 2010-05-06
  • 打赏
  • 举报
回复
[Quote=引用 18 楼 zedzhao 的回复:]
先delete 再new
呵呵~~~
[/Quote]
对,我也这么想的。
阿磊2013 2010-05-06
  • 打赏
  • 举报
回复
18楼的好猛
mymtom 2010-05-06
  • 打赏
  • 举报
回复
[Quote=引用楼主 z341223318 的回复:]
数组大小有40多万个字节,直接用memset()置0导致别的任务暂停了一会,有没有更好更快的方法,使在一个任务中对一个很大很大的数组置0对别的任务没有影响。
[/Quote]
在程序的初始化阶段清零,慢一点也没有什么影响。
在程序的运行过程中频繁地对这么大的数组清零,只能说是设计上的缺陷。
加载更多回复(67)

69,371

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧