for循环代替while(1)
2015-09-27 22:33
281 查看
http://blog.csdn.net/feixiaoxing/article/details/6257537
【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing @163.com】
在下面的blog当中,我将会讲解一些提高个人代码效率的一些手段。这些手段都是被实践证明,切实可行的。但是不同的处理器和处理平台上面可能会有所差别,但是本质上是一样的。
(1) 用for(; ;) 代替while(1)
(2) 循环的时候首先进行内部数据的循环,然后进行外部数据的循环
(3) 同一层循环之内,尽量只安排同一数据的相关操作
(4) 编译的时候头文件不要相互包含,尽量简单
(5) 尽量不要使用乘除, 多用加减和移位操作
(6) 部分复制、计算操作可以用SIMD命令代替,比如 SSE命令等等
(7) 如果是服务器软件或者是游戏客户端软件,请多使用查询,少计算
做过服务器侧软件的朋友都知道,单个socket的响应时间要尽可能的短,因为这有这样我们才能在短时间内响应更多的用户。如果把宝贵的时间放在一些临时性的计算上面,那么就不大合算了。历史的经验运行数据对于我们进行数据分析是很重要。举一个例子来说:我们知道操作系统分配内存的时候,刚开始的访问要求都是混乱无章的。等到运行一段时间之后,我们的内存就会充斥着更多的内存碎片。此时此刻,即使我们需要获取一块较大的内存都是比较困难的。为了获得我们需要的内存,操作系统不得不把操作系统中暂时使用不到的内存临时放到硬盘上面,等到重新需要的时候再次加载进来,这在无形之中就增加了运行时间,降低了运行效率。如果我们能够从经验数据中得到启发,知道应该在机器开机启动的时候就知道怎样进行数据的分配,短时间内实现机器的最优状态,就可以节省时间,还提高了用户的满意程度。
(8) if() ...else()的时候,把最长出现的代码放在前面,不经常出现的结果放在后面
(9) 使用数组的时候,多使用int* p = &value[0]; p ++;迭代的形式, 这样可以减少数据的计算
(10) 优化算法,发挥当前CPU多核的优势,最大限速地发挥CPU的特性
说明:
以下所有代码都是VC6.0完成。
详解:
(1) 为什么需要用for(; ;)代替while(1)?
[cpp] view
plaincopy
5: int m = 0;
00401038 mov dword ptr [ebp-4],0
6:
7: while(1)
0040103F mov eax,1
00401044 test eax,eax
00401046 je test+32h (00401052)
8: {
9: if( m == 0)
00401048 cmp dword ptr [ebp-4],0
0040104C jne test+30h (00401050)
10: break;
0040104E jmp test+32h (00401052)
11: }
00401050 jmp test+1Fh (0040103f)
12:
13: for(;;)
14: {
15: if( m == 0)
00401052 cmp dword ptr [ebp-4],0
00401056 jne test+3Ah (0040105a)
16: break;
00401058 jmp test+3Ch (0040105c)
17: }
0040105A jmp test+32h (00401052)
可以很清楚地看出,while(1)被翻译成了三个命令,而for(;;)却没有。很多同学可能认为,这只是三条指令而已,没有什么大惊小怪的,
但是我们要知道,很多循环都是上百万次的进行的,如果一般的函数都注意这个问题,那么一天节省下来的CPU时间是相当可观的。
(2) 待续
【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing @163.com】
在下面的blog当中,我将会讲解一些提高个人代码效率的一些手段。这些手段都是被实践证明,切实可行的。但是不同的处理器和处理平台上面可能会有所差别,但是本质上是一样的。
(1) 用for(; ;) 代替while(1)
(2) 循环的时候首先进行内部数据的循环,然后进行外部数据的循环
(3) 同一层循环之内,尽量只安排同一数据的相关操作
(4) 编译的时候头文件不要相互包含,尽量简单
(5) 尽量不要使用乘除, 多用加减和移位操作
(6) 部分复制、计算操作可以用SIMD命令代替,比如 SSE命令等等
(7) 如果是服务器软件或者是游戏客户端软件,请多使用查询,少计算
做过服务器侧软件的朋友都知道,单个socket的响应时间要尽可能的短,因为这有这样我们才能在短时间内响应更多的用户。如果把宝贵的时间放在一些临时性的计算上面,那么就不大合算了。历史的经验运行数据对于我们进行数据分析是很重要。举一个例子来说:我们知道操作系统分配内存的时候,刚开始的访问要求都是混乱无章的。等到运行一段时间之后,我们的内存就会充斥着更多的内存碎片。此时此刻,即使我们需要获取一块较大的内存都是比较困难的。为了获得我们需要的内存,操作系统不得不把操作系统中暂时使用不到的内存临时放到硬盘上面,等到重新需要的时候再次加载进来,这在无形之中就增加了运行时间,降低了运行效率。如果我们能够从经验数据中得到启发,知道应该在机器开机启动的时候就知道怎样进行数据的分配,短时间内实现机器的最优状态,就可以节省时间,还提高了用户的满意程度。
(8) if() ...else()的时候,把最长出现的代码放在前面,不经常出现的结果放在后面
(9) 使用数组的时候,多使用int* p = &value[0]; p ++;迭代的形式, 这样可以减少数据的计算
(10) 优化算法,发挥当前CPU多核的优势,最大限速地发挥CPU的特性
说明:
以下所有代码都是VC6.0完成。
详解:
(1) 为什么需要用for(; ;)代替while(1)?
[cpp] view
plaincopy
5: int m = 0;
00401038 mov dword ptr [ebp-4],0
6:
7: while(1)
0040103F mov eax,1
00401044 test eax,eax
00401046 je test+32h (00401052)
8: {
9: if( m == 0)
00401048 cmp dword ptr [ebp-4],0
0040104C jne test+30h (00401050)
10: break;
0040104E jmp test+32h (00401052)
11: }
00401050 jmp test+1Fh (0040103f)
12:
13: for(;;)
14: {
15: if( m == 0)
00401052 cmp dword ptr [ebp-4],0
00401056 jne test+3Ah (0040105a)
16: break;
00401058 jmp test+3Ch (0040105c)
17: }
0040105A jmp test+32h (00401052)
可以很清楚地看出,while(1)被翻译成了三个命令,而for(;;)却没有。很多同学可能认为,这只是三条指令而已,没有什么大惊小怪的,
但是我们要知道,很多循环都是上百万次的进行的,如果一般的函数都注意这个问题,那么一天节省下来的CPU时间是相当可观的。
(2) 待续
相关文章推荐
- 验证码 mewebstudio/captcha
- 第五周
- 添加view
- LeetCode——Single Number III
- ListActivity的注意点
- idea or android studio 使用
- 黑马程序员——IO流:自顶向下的总结
- Python进阶 - 进程与线程
- javascript 中的apply()和call()方法详解
- jdk5.0新特性
- 百度云分享,以前找到的各种东东,分享给大家···Office软件(全-C)
- Python进阶 - GUI程序设计(tkinter)
- Async和Await进行异步编程
- 归并链表
- Android 中的 Service 全面总结(转载)
- 成果展
- nyoj747蚂蚁的难题(三)&&hdoj5501The Highest Mark【dp】
- 自动化测试必将取代手工测试
- 模式总结(一)——创建型模式(Creational Pattern)
- 【阿里ECS】CentOS7安装nginx