社区
C++ 语言
帖子详情
如何快速填充数组
载舟之水
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
打赏
收藏
如何快速填充数组
例如我有一个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函数。
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用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)
java种菜源码-autofill-arrays:
快速
轻松地
填充
数组
和其他集合
的自动
填充
数组
这个插件允许你通过输入几个键来用有趣/有意义的单词或数字列表
填充
Arrays 。 您可以从多个可用类别中进行选择。 它适用于所有主流编程语言,如Python 、 Javascript 、 Java 、 C 、 C++ 、 C# 、 ...
java种菜源码-autofill-arrays-vc:
快速
轻松地
填充
数组
和其他集合
的自动
填充
数组
这个插件允许你通过输入几个键来用有趣/有意义的单词或数字列表
填充
Arrays 。 您可以从多个可用类别中进行选择。 它适用于所有主流编程语言,如Python 、 Javascript 、 Java 、 C 、 C++ 、 C# 、 ...
fill-array:通过重复其元素将
数组
填充
到给定长度。 这是一个非常快的实现
填充
数组
通过重复其元素将
数组
填充
到给定长度。 这是一个非常
快速
的实现。使用安装npm i fill-array --save用法 var fill = require ( 'fill-array' ) ;fill ( [ 'a' , 'b' , 'c' ] , 10 ) ;//=> ['a','b','c','a',...
易语言测试比较程序源码,易语言通用
填充
树型框模块
易语言通用
填充
树型框模块源码,通用
填充
树型框模块,
填充
树型框,
快速
填充
树型框,
数组
填充
树型框
c语言多边形
填充
c语言多边形
填充
,
快速
填充
法。 自己修改图像
数组
即可使用。
C++ 语言
64,646
社区成员
250,476
社区内容
发帖
与我相关
我的任务
C++ 语言
C++ 语言相关问题讨论,技术干货分享,前沿动态等
复制链接
扫一扫
分享
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++
技术论坛(原bbs)
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
请不要发布与C++技术无关的贴子
请不要发布与技术无关的招聘、广告的帖子
请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下
试试用AI创作助手写篇文章吧
+ 用AI写文章