从一段c程序的优化说起

今天一个朋友找到我,说他写了一个图像方面的c程序,效率不太理想,寻求我的帮忙,我乃热心之人,故答应之。下面是其代码段,大家共赏:

 

大致浏览了一下,有以下几个问题

1、函数没有对其输入值进行应有的判断,过于相信用户。

2、内部的for循环就是连续内存拷贝,对于逐位拷贝的方法过于缓慢 。

3、用了大量的乘法运算,效率过低  。

于是我修改了一下:

 顿时感觉代码清晰多了,此处使用了memcpy函数,直接对整段内存进行了拷贝,效率提高了不少,同时assert函数给此段数据进行了验证,使代码的健壮性得到了提高。“果然你是老手,比我强多了”,“哪里哪里,只不过多看了一点c代码而已,话说你想不想再提高一下效率”,“还能再提高一点”,“嗯,是的,我写给你看”。

“这次和上一次的版本有什么区别吗?”,“当然有了,很明显循环的次数减少了,更准确的说此段程序少执行了height1 / 2次y < height判断和height1 / 2的y++。”,“那这么说效率有提高了,我用起来也就更快了”,“嗯,效率是提高了,不过这里有个问题我们没处理”,“什么问题?”,“如果height1是奇数的话,此段程序会怎样?”,“会多执行一次拷贝函数吧”,“非常正确”,“但是有什么影响吗?执行结果是正确的啊”,“当然对此段程序的功能没有什么影响,但是对使用它的程序,也许有灾难性的影响,因为我们多拷贝了长度为width2的内存到pTmp2去,也就是说我们额外拷贝了一段内存,很可能此段内存保存很重要的信息被重新赋值了,所以我们要对此段程序中height1进行奇偶判断”,“好,那我们都写一下”,五分钟后,“不太好搞”,“呵呵,看看我写的”。

“嗯,我理解一下”,“好的,此代码段当height1比较小的时候,也许效率还没有第一个修改的效率高,但是一旦height1很大的时候优势是非常明显的”,“额,果然很赞,height-1用一个临时变量存一下会不会更好”,“嗯,是的,另外,你发现没有此段代码我们用了一个%运算符,%运算符效率将是很低的,其实我们还可以将效率再次提高一点”

“噢,height&1是什么意思”,“&是二进制中的与运算,0&1 = 0 ,1 &1 = 1,同时还有x % 2 = x&1,x / 2 = x >> 1,x * 2  = x <<1,此公式仅限于整形”, “好扎实的基础”,“多看了一点c代码而已”,“嗯嗯,的确不错哈,我再理解理解”,“你慢慢看看”,“此处的if条件是不是1 ==(height & 1)”,“哦,是的,写错了。好吧,我再改一下”

“哈哈,这回对了吧”,“嗯,效率提高很多,代码也优雅多了,搞定,另外代码的背景不错,你怎么设置的”,“这是主题哈”,“哦,主题哈,也发一份给我吧”,“你可以在网上下一个哈”,“我就喜欢你的这个主题”,“好吧,怎么摊上这样一个朋友,唉。” 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 10
    评论
评论 10
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值