`
mmdev
  • 浏览: 12923891 次
  • 性别: Icon_minigender_1
  • 来自: 大连
文章分类
社区版块
存档分类
最新评论

多重for循环性能分析

 
阅读更多

MARK汇编还是有必要复习复习啊

有人对着汇编语言不够一屑,认为那已经是古老的低级语言,是当今的非主流语言,学了也不知道有什么用。是的,我们不得不承认,作为一门古老的语言,汇编已经完成了历史赋予它的使命,但是我们知道,我们现在所使用的任何高级语言在编译的时候都是被转化为汇编语言来执行的,也就是说,无论我们在上层做了何种的抽象,引入了多少新鲜的概念,作为一个程序员,我们的程序在最底层仍然是它,或许绝大部分的时间,我们无需关心它的存在,但是,当我们编写或优化高性能的应用程序时,除了算法,我们也不得不面对它。下面我们来举一个例子来证明这一点,我们用c/c++ 写两个简单嵌套循环:

1). for ( i= 0; i < 1000000; i++)
for (j =0; j < 100; j++)
{expression;}

2). for ( i= 0; i < 100; i++)
for (j =0; j < 1000000; j++)
{expression;}

我们知道,当计算表达式相同时,这两个循环所计算得到的结果完全相同,但是你会选择哪一种写法呢?或许绝大多数的程序员压根就没有想过要会有第二种写法,因为他的程序都来自他的逻辑(作为人的一种自然逻辑),而不是“机器”的逻辑,呵呵,是的,我们在写程序,是执行在机器上的程序,所以我们在写程序时,就应该尽量遵循“机器”的逻辑,那样的话,我们就能写出高性能的程序,为什么要第2 种写法要优于第1种写法呢?下面让我们来看一看他关键汇编代码描述就明白了(呵呵,终于用到汇编了):

1.
mov cx,0
A: cmp cx, 1000000
jg Over
inc cx
mov bx , 0
B: cmp bx, 100
jg A
inc bx
some calculate……
jump B
Over:
2.
mov cx,0
A: cmp cx, 100
jg Over
inc cx
mov bx , 0
B: cmp bx, 1000000
jg A
inc bx
some calculate……
jump B
Over:

那么我们怎么去评估我们的两个代码的性能呢?
1.在这里我们就去看jump指令,在第一个汇编代码中,我们去评估jg A指令和 jump B 指令,也就是说,正常情况下,jg A被执行了1000,000次,而jump B 指令被执行了 100* 1000,000次,现在让我们来看看第二个汇编代码中的jg A指令和 jump B 指令分别执行的次数,在正常情况下,我们很容易就得知,jg A被执行了100次,而jump B 指令被执行了 100* 1000,000次,也就是说,在两个代码中,jump B 指令被执行的次数相等,而在第二段代码中jg A指令执行的次数比第一段代码中执行的次数少1000,000次,假设我们的程序运行在Pentium 机上,那么一个jump指令大概执行的一个时钟循环(clock cycle),那么,很明显,第二段代码的执行效率要高于第一段时钟的执行效率。
2.其实再仔细分析,可知如下:
A: cmp cx, 1000000
jg Over
inc cx
mov bx , 0

A: cmp cx, 100
jg Over
inc cx
mov bx , 0
执行的次数分别是执行了1000,000和100遍,可想而知哪一个性能高了;

上述只是一个很常见的例子,有时候,为了使性能达到我们的要求,我们要优化代码,关键的部分部分通常利用汇编代码去实现,因为使用特定的CPU提供的特殊的指令集通常能大大提高程序的性能(但是,可移植性通常也因此而被牺牲)。
所以,要成为高手,学习汇编是必要的,因为,汇编能让你在调试你程序的时候更加游刃有余,能让你深入底层,找出很难察觉的Bug,让你更加懂得“机器思维”。而这一切,都是成为高手的必要条件。

分享到:
评论

相关推荐

    Java for循环性能优化实现解析

    主要介绍了Java for循环性能优化实现解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下

    vue使用map代替Aarry数组循环遍历的方法

    原本的方法是使用for循环遍历该数组,变量 i 就是下标,问题在于,如果有多重for循环,就会导致性能大大下降,数据也容易出错 因此使用map,让数组(原本是list)变成一个map集合(key-value形式),把主键id当做key...

    vue使用map代替Aarry数组循环遍历

    原本的方法是使用for循环遍历该数组,变量 i 就是下标,问题在于,如果有多重for循环,就会导致性能大大下降,数据也容易出错 因此使用map,让数组(原本是list)变成一个map集合(key-value形式),把主键id当做key...

    7个回归分析方法思维导图.png

    岭回归分析是一种用于存在多重共线性(自变量高度相关)数据的技术。 在多重共线性情况下,尽管最小二乘法(OLS)对每个变量很公平,但它们的差异很大,使得观测值偏移并远离真实值。 岭回归通过给回归估计...

    提高PHP性能的编码技巧以及性能优化详细解析

    0、用单引号代替双引号来包含字符串,这样做会更快一些。... 1、如果能将类的方法定义成static,就尽量定义成static,它的速度会提升将近4倍。 2、$row[‘id’] 的速度是$row[id]的7倍。...4、在执行for循环之前确定最大循

    Python性能优化技巧

    Python是一门非常酷的语言,因为很少的Python代码可以在短时间内做很多事情,并且,Python很容易就能支持多任务和多重处理。 py  1、关键代码可以依赖于扩展包 Python使许多编程任务变得简单,但是对于很关键的任务...

    提高PHP编程效率 引入缓存机制提升性能

    因为PHP会在双引号包围的字符串中搜寻变量,单引号则不会,注意:只有echo能这么做,它是一种可以把多个字符串当作参数的... 4、在执行for循环之前确定最大循环数,不要每循环一次都计算最大值,最好运用foreach代

    提升PHP性能的21种方法介绍

    1.用单引号来包含字符串要比双引号来...5.在执行for循环之前确定最大循环数,不要每循环一次都计算最大值,最好运用foreach代替。6.注销那些不用的变量尤其是大数组,以便释放内存。7.尽量避免使用__get,__set,__aut

    windowsnt 技术内幕

    报名参加考试 考试的费用问题 考前的自我调整 使用考试中心提供的考试工具 参加模拟测试 熟悉使用计算机进行考试 充分利用考试时间 考题的形式 理解多重选择题型 理解对错题题型 理解多重选择多重答案题型 理解基于...

    Python 中文手册

    4.2. for 语句 4.3. The range() 函数 4.4. break 和 continue 语句, 以及循环中的 else 子句 4.5. pass 语句 4.6. 定义函数 4.7. 深入 Python 函数定义 4.7.1. 默认参数值 4.7.2. 关键字参数 4.7.3. 可变参数列表 ...

    Java2核心技术.part5

    3.10.1 “for each”循环 3.10.2数组初始化器以及匿名数组 3.10.3数组拷贝 3.10.4命令行参数 3.10.5数组排序 3.10.6多维数组 3.10.7不规则数组 第4章对象与类 4.1面向对象程序设计概述 ...

    Java2核心技术.part3

    3.10.1 “for each”循环 3.10.2数组初始化器以及匿名数组 3.10.3数组拷贝 3.10.4命令行参数 3.10.5数组排序 3.10.6多维数组 3.10.7不规则数组 第4章对象与类 4.1面向对象程序设计概述 ...

    Java2核心技术.part1

    3.10.1 “for each”循环 3.10.2数组初始化器以及匿名数组 3.10.3数组拷贝 3.10.4命令行参数 3.10.5数组排序 3.10.6多维数组 3.10.7不规则数组 第4章对象与类 4.1面向对象程序设计概述 4.1.1 OOP...

    Java2核心技术.part6

    3.10.1 “for each”循环 3.10.2数组初始化器以及匿名数组 3.10.3数组拷贝 3.10.4命令行参数 3.10.5数组排序 3.10.6多维数组 3.10.7不规则数组 第4章对象与类 4.1面向对象程序设计概述 ...

    Java2核心技术.part4

    3.10.1 “for each”循环 3.10.2数组初始化器以及匿名数组 3.10.3数组拷贝 3.10.4命令行参数 3.10.5数组排序 3.10.6多维数组 3.10.7不规则数组 第4章对象与类 4.1面向对象程序设计概述 ...

    Java2核心技术.part2

    3.10.1 “for each”循环 3.10.2数组初始化器以及匿名数组 3.10.3数组拷贝 3.10.4命令行参数 3.10.5数组排序 3.10.6多维数组 3.10.7不规则数组 第4章对象与类 4.1面向对象程序设计概述 ...

    Access+2000中文版高级编程

    8.12.2 性能分析器向导 234 8.12.3 文档管理器 236 8.13 小 结 236 第9章 创建功能强大的窗体 237 9.1 增强窗体性能 237 9.1.1 增强窗体性能 237 9.2 使用Access 2000最新的窗体特性 238 9.2.1 使用...

    Access 2000中文版高级编程(part1)

    8.12.2 性能分析器向导 234 8.12.3 文档管理器 236 8.13 小 结 236 第9章 创建功能强大的窗体 237 9.1 增强窗体性能 237 9.1.1 增强窗体性能 237 9.2 使用Access 2000最新的窗体特性 238 9.2.1 使用窗体的...

    TCK/TK组合教程

    45.5 多重foreach循环变量 45.6 事件循环从tk移植到tcl 45.7 网络socket 45.8 多重解释器和safe—tcl 45.9 grid几何形状管理器 45.10 文本框 45.11 输入项部件 第46章 tcl 7.6/tk 4.2 46.1 更多...

Global site tag (gtag.js) - Google Analytics