如何快速填充数组

载舟之水 2010-07-07 05:03:36
例如我有一个480*800的WORD数组,如何能快速填充为一个固定的数值,比如要填入0xF81F。
我试过这个方法

for(DWORD i = 0; i < 800; i++)
{
for(DWORD j = 0; j < 480; j++)
{
*p = 0xF81F;
p++;
}
}


while(1) 的方法也试过,效率都太低了,请问各位有没有办法快速填充?最好用算法或C Run-Time函数。
...全文
683 36 打赏 收藏 转发到动态 举报
写回复
用AI写文章
36 条回复
切换为时间正序
请发表友善的回复…
发表回复
载舟之水 2010-07-09
  • 打赏
  • 举报
回复
[Quote=引用 35 楼 lx_616_at_yeah_net 的回复:]
唉。。。
[/Quote]

不用这么失望吧。^_^你的代码会被人搜索到的,照样有人用。
lx_616_at_yeah_net 2010-07-09
  • 打赏
  • 举报
回复
唉。。。
载舟之水 2010-07-09
  • 打赏
  • 举报
回复
就是用了你的思路啊,其实我之前也想用memcpy,但是整片复制太浪费内存。所以一开始先准备一行,然后就复制给第一行,接下来第一行复制给第二行。。。
X86汇编那个我查了半天也没发现ARM有类似的指令,ARM上memcpy好像不是用一条指令,而是很多条模拟的,就暂时算了,等写X86程序再用吧。

这段代码只是我程序的一小段,用来写显存的,外面还有几个大循环,所以对效率要求很高。
载舟之水 2010-07-08
  • 打赏
  • 举报
回复
gz_qmc 你的算法有点问题,好像len/=2;会造成循环次数减少,数组无法全部填
gz_qmc 2010-07-08
  • 打赏
  • 举报
回复
想到了:
int m=384000=2*x+y;x是2的n次方,取最大可能的数
算出x,y;
就可以
for(i=0;i<n;i++) //n=
{
memcpy(p+off,p,off);
off<<=1;
}
memcpy(p+off,p,y);//最后来这句
如果原理的有问题的哪个O(n)=O(20)
那么现在的O(n)=O(18)
lx_616_at_yeah_net 2010-07-08
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 baihacker 的回复:]
C/C++ code

unsigned* _ptr = ptr;
unsigned _size =size;
unsigned _value = value;
__asm
{
……
[/Quote]
代码写的不错,非常漂亮~但结果有点偏差了~
lx_616_at_yeah_net 2010-07-08
  • 打赏
  • 举报
回复
memset 最终也是调用 汇编rep stos 来填充的。。。
把memset的实现改一下
gz_qmc 2010-07-08
  • 打赏
  • 举报
回复
这就变成了
已知:x*y=384000
求:x+y的最小值
gz_qmc 2010-07-08
  • 打赏
  • 举报
回复
这个问题我想过
得想个巧妙的办法解决这个问题

我还想到了另一种办法
先填充某长度比如800
在用这个块填充p

单个填充的O(n)=O(800*480)=O(384000)
这样填的O(n)=O(480)+O(800)≈O(1280)
同样也提高很多
载舟之水 2010-07-08
  • 打赏
  • 举报
回复
[Quote=引用 21 楼 gz_qmc 的回复:]
因为1变2,2变4是成倍的增加,所以循环次数据是/2成倍的减少
当然为了提高效率,这个数可以先算好,优化一下就变成
len=.....=20; (假设有20次)
for(i=0;i<len;i++)
{
memcpy(p+off,p,off);……
[/Quote]

是这样的,你的算法要求总SIZE必须是能被2开方,这样剩余的部分就要手动填,而按照你的算法来,开始复制时,只复制很少的,结果到了最后几步,反而是大量的数组空间没填满。
buyongxiaohu 2010-07-08
  • 打赏
  • 举报
回复
memcpy和memset
gz_qmc 2010-07-08
  • 打赏
  • 举报
回复
[Quote=引用 14 楼 nbcool 的回复:]

gz_qmc 你的算法有点问题,好像len/=2;会造成循环次数减少,数组无法全部填
[/Quote]

因为1变2,2变4是成倍的增加,所以循环次数据是/2成倍的减少
当然为了提高效率,这个数可以先算好,优化一下就变成
len=.....=20; (假设有20次)
for(i=0;i<len;i++)
{
memcpy(p+off,p,off);
off<<=1;
}

1-2,2-4,4-8,8-16,16-32,....共20次
如果一开始:
word p[480][800]={0xf81f,0xf81f......(32个)}
那么 前面的循环又可以进一步
for(i=5;i<len;i++)
则O(n)由O(20)变成了O(15);
载舟之水 2010-07-08
  • 打赏
  • 举报
回复
gz_qmc 我用了你的想法,改为逐行复制,前一行复制给后一行,效率有所提高。大约提高了50%。后来我发现那个非常快的API用的可能饿是类似DMA的硬件加速,所以速度能达到最快。
赵4老师 2010-07-08
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 baihacker 的回复:]
C/C++ code
static inline void fuck(unsigned int* ptr, unsigned int size, unsigned value)
{
unsigned* _ptr = ptr;
unsigned _size =size;
unsigned _value = value;
__asm
{
……
[/Quote]
对x86系列CPU来说,此为正解。
gz_qmc 2010-07-08
  • 打赏
  • 举报
回复
虽然好了,也结贴了,但也该让大家学习学习,说一下你的思路呗
让我们也总结总结看看思考了多少?
Mg 2010-07-08
  • 打赏
  • 举报
回复
memcpy和memset均可~
载舟之水 2010-07-08
  • 打赏
  • 举报
回复
[Quote=引用 15 楼 redleaves 的回复:]
自己算一下你的硬件性能.比如内存带宽,IO带宽.如果已经达到硬件瓶颈,不使用特殊硬件功能的情况下,没必要考虑再用软件方式优化了...
我用过不少的ARM设备,没几个内存带宽超过100MB/s的...如果你是用的显存,那就更慢了.
[/Quote]

那些方面的考虑是难以测量的,系统工作中,性能也是不断变化中,所以不是第一考虑的要素。局部的代码优化根据对比测量的数据,还是证明有优化的空间。
djjlove_2008 2010-07-08
  • 打赏
  • 举报
回复
向高手学习。
载舟之水 2010-07-08
  • 打赏
  • 举报
回复
我的算法已经优化好了,结贴,谢谢各位的建议。
redleaves 2010-07-08
  • 打赏
  • 举报
回复
自己算一下你的硬件性能.比如内存带宽,IO带宽.如果已经达到硬件瓶颈,不使用特殊硬件功能的情况下,没必要考虑再用软件方式优化了...
我用过不少的ARM设备,没几个内存带宽超过100MB/s的...如果你是用的显存,那就更慢了.
加载更多回复(16)

64,646

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

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