代码运行速度过慢,求大神优化!!!!!!

zk19870803 2015-01-05 03:58:40
一个嵌套的for循环,但是运行的时间大大超出了要求时间,有没有大神能帮忙优化下~
    for (y = 0; y < height/2; y++) 
{
for (x = 0; x < width/2; x++)
{
dst->data[2][x] = src[1][2*x+0];
dst->data[1][x] = src[1][2*x+1];
}
src[1] += src_pitch[1];
dst->data[2] += dst->linesize[2];
dst->data[1] += dst->linesize[1];
}

就是把一个buff里的内容按照既定的方式存到另外两个buff里,在height = 1536,width = 2048的时候,
统计循环时间超过了200ms,但是要求是最好能再20ms之内完成,求各位大神支招!
...全文
923 30 打赏 收藏 转发到动态 举报
写回复
用AI写文章
30 条回复
切换为时间正序
请发表友善的回复…
发表回复
赵4老师 2015-01-06
  • 打赏
  • 举报
回复
引用 23 楼 wangyaninglm 的回复:
c++ amp opencl cuda 还能怎么搞?
yyfhz 2015-01-06
  • 打赏
  • 举报
回复
引用 11 楼 zk19870803 的回复:
[quote=引用 8 楼 luciferisnotsatan 的回复:] for (y = 0; y < height/2; y++) 循环体里压根没用过y lz,你要这个y循环干嘛?
每隔 width/2次,做一下 src[1] += src_pitch[1]; dst->data[2] += dst->linesize[2]; dst->data[1] += dst->linesize[1]; 总共做 height/2次 循环体是用不到y,y是控制次数嘛[/quote] 做1次和做height/2次,从最终的效果上看,有区别吗?
  • 打赏
  • 举报
回复
不交换数据内容,只交换指向内存的指针,这样是最快的
mymtom 2015-01-06
  • 打赏
  • 举报
回复
dst->data[2][x] = src[1][2*x+0]; 这两边是什么类型?如果类型相同的话,可以试试memcpy

    for (y = 0; y < height/2; y++) 
    {
        /*
        for (x = 0; x < width/2; x++) 
        {
            dst->data[2][x] = src[1][2*x+0];
            dst->data[1][x] = src[1][2*x+1];
        }
        */
        memcpy(&dst->data[2][0], &src[1][0], sizeof(src[1][0]) * (width/2 + 1));
        memcpy(&dst->data[1][0], &src[1][1], sizeof(src[1][1]) * (width/2 + 1));
        src[1]  += src_pitch[1];
        dst->data[2] += dst->linesize[2];
        dst->data[1] += dst->linesize[1];
    }
这样也达不到要求的话,考虑多线程吧
yshuise 2015-01-06
  • 打赏
  • 举报
回复
inline
zk19870803 2015-01-06
  • 打赏
  • 举报
回复
好吧,看来是没什么特别方便的办法了,多谢楼上各位。
  • 打赏
  • 举报
回复
引用 28 楼 yyfhz 的回复:
[quote=引用 11 楼 zk19870803 的回复:] [quote=引用 8 楼 luciferisnotsatan 的回复:] for (y = 0; y < height/2; y++) 循环体里压根没用过y lz,你要这个y循环干嘛?
每隔 width/2次,做一下 src[1] += src_pitch[1]; dst->data[2] += dst->linesize[2]; dst->data[1] += dst->linesize[1]; 总共做 height/2次 循环体是用不到y,y是控制次数嘛[/quote] 做1次和做height/2次,从最终的效果上看,有区别吗?[/quote] buffer指针已经移动了,当然有区别。
乔巴好萌 2015-01-05
  • 打赏
  • 举报
回复
看起来像是图像处理的东西 要是的话 就嵌入MMX指令集吧 加段ASM
shiter 2015-01-05
  • 打赏
  • 举报
回复
c++ amp opencl cuda 还能怎么搞?
luciferisnotsatan 2015-01-05
  • 打赏
  • 举报
回复
想要快,就多线程(CPU有几核就几个线程),分成几个区段同时处理。
luciferisnotsatan 2015-01-05
  • 打赏
  • 举报
回复
引用 16 楼 zk19870803 的回复:
[quote=引用 14 楼 mLee79 的回复:] 说需求, 看代码猜功能太累,这代码看着就像很慢的样子...
在顶楼有说,就是把一个buff里的内容按照既定的方式存到另外两个buff里, 原buff里面存放数据类似 1212123456121212123456..., 两个新buff为111111...,222222..., [/quote] 必须一次把所有数据都这么放到两个buff里么? 这个需求,代码看起来是没法优化了。
zk19870803 2015-01-05
  • 打赏
  • 举报
回复
引用 18 楼 xihu1364 的回复:
循环的次数 不过 768*1024 = 786432次 就70多W次 的赋值操作 能慢到哪里去?
引用 17 楼 zhao4zhong1 的回复:
[quote=引用 15 楼 zk19870803 的回复:] [quote=引用 12 楼 u014444402 的回复:] 什么CPU啊,
CPU:英特尔 core i3-4130 3.40ghz 双核 内存:4G OS:Win7 64位 和64位系统有关系吗? ps:编译在xp虚拟机上编译[/quote] 别在虚拟机里面运行。 换64位VS20XX编译Release X64版再试试。[/quote] 这个目前没办法了,只能在vc6上编译,所以才弄了个虚拟机来编译的,每次运行都是在win7上
zjx8613 2015-01-05
  • 打赏
  • 举报
回复
int yCount = height/2; int xCount = width/2; int tmp = 0; for (y = 0; y < yCount; ++y) { for (x = 0; x < xCount; ++x) { tmp = 2*x; dst->data[2][x] = src[1][tmp]; dst->data[1][x] = src[1][tmp+1]; } src[1] += src_pitch[1]; dst->data[2] += dst->linesize[2]; dst->data[1] += dst->linesize[1]; } 这样看看能优化吗
版主大哥 2015-01-05
  • 打赏
  • 举报
回复
循环的次数 不过 768*1024 = 786432次 就70多W次 的赋值操作 能慢到哪里去?
赵4老师 2015-01-05
  • 打赏
  • 举报
回复
引用 15 楼 zk19870803 的回复:
[quote=引用 12 楼 u014444402 的回复:] 什么CPU啊,
CPU:英特尔 core i3-4130 3.40ghz 双核 内存:4G OS:Win7 64位 和64位系统有关系吗? ps:编译在xp虚拟机上编译[/quote] 别在虚拟机里面运行。 换64位VS20XX编译Release X64版再试试。
zk19870803 2015-01-05
  • 打赏
  • 举报
回复
引用 14 楼 mLee79 的回复:
说需求, 看代码猜功能太累,这代码看着就像很慢的样子...
在顶楼有说,就是把一个buff里的内容按照既定的方式存到另外两个buff里, 原buff里面存放数据类似 1212123456121212123456..., 两个新buff为111111...,222222...,
zk19870803 2015-01-05
  • 打赏
  • 举报
回复
引用 12 楼 u014444402 的回复:
什么CPU啊,
CPU:英特尔 core i3-4130 3.40ghz 双核 内存:4G OS:Win7 64位 和64位系统有关系吗? ps:编译在xp虚拟机上编译
mLee79 2015-01-05
  • 打赏
  • 举报
回复
说需求, 看代码猜功能太累,这代码看着就像很慢的样子...
zk19870803 2015-01-05
  • 打赏
  • 举报
回复
引用 2 楼 zhao4zhong1 的回复:
不做任何修改,生成Release版。试试看。
release编译以后确实快了不少,但是还有100ms左右。 大神还能帮忙看看其他的地方哪里能改进吗?
灌水号 2015-01-05
  • 打赏
  • 举报
回复
什么CPU啊,
加载更多回复(11)

64,659

社区成员

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

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