Programming 版 (精华区)

发信人: SwordLea (飞刀李), 信区: Programming
标  题: [合集] 运算机器周期与代码优化
发信站: 哈工大紫丁香 (Wed Jun 16 14:59:20 2004), 站内

────────────────────────────────────────
  ggrant (ggrant)                  于  (Mon Jun 14 14:35:00 2004)  说道:

弱弱地问:
计算机中每个加减乘除运算分别相当多少个机器周期,即运算时间的概念?


────────────────────────────────────────
  SwordLea (飞刀李)                于  (Tue Jun 15 10:29:14 2004)  说道:

在计算机原理方面的教材有相关资料,大约在流水线那一节。
这些书手头没有,你自己找找吧。
【 在 ggrant (ggrant) 的大作中提到: 】
: 弱弱地问:
: 计算机中每个加减乘除运算分别相当多少个机器周期,即运算时间的概念?




────────────────────────────────────────
  alphame (糊涂)             于  (Tue Jun 15 10:30:55 2004)  说道:

他的这个问题就没有答案
呵呵
机器周期不同的体系结构定义好象都不一样
【 在 SwordLea (飞刀李) 的大作中提到: 】
: 在计算机原理方面的教材有相关资料,大约在流水线那一节。
: 这些书手头没有,你自己找找吧。




────────────────────────────────────────
  SwordLea (飞刀李)                于  (Tue Jun 15 10:33:48 2004)  说道:

哦,我刚才也在考虑这个问题,那些老掉牙的教材里的“准确数据”只怕现在
也时过境迁了。
【 在 alphame (糊涂) 的大作中提到: 】
: 他的这个问题就没有答案
: 呵呵
: 机器周期不同的体系结构定义好象都不一样
: ...................



────────────────────────────────────────
  kylix (智贤fans)                 于  (Tue Jun 15 10:52:24 2004)  说道:

每种机器都不同,具体的要看该机器的Datasheet...

【 在 ggrant (ggrant) 的大作中提到: 】
: 弱弱地问:
: 计算机中每个加减乘除运算分别相当多少个机器周期,即运算时间的概念?




────────────────────────────────────────
  iamxiaohan (潇寒·System Programmer) 于  (Tue Jun 15 10:53:03 2004)  说道:

nod,现在intel提供的技术资料里面,已经没有指令所占周期的数据了,
下面提供一点intel386的吧,仅供参考
(单位:cpu周期)
add : 2~7
sub ; 2~7
mul : 9~41
div : 14~41

这些数据在宏观上感觉还是有意义的,
比如
inc 只有1个时钟周期,
所以 ++a比a=a+1 快

shl 3~7个周期
所以 a = a * 2 要比 a << 2 ;慢很多,

对于定量优化还是有意义的~~~:)

【 在 SwordLea (飞刀李) 的大作中提到: 】
: 哦,我刚才也在考虑这个问题,那些老掉牙的教材里的“准确数据”只怕现在
: 也时过境迁了。




────────────────────────────────────────
  alphame (糊涂)             于  (Tue Jun 15 10:57:31 2004)  说道:


【 在 iamxiaohan (潇寒·System Programmer) 的大作中提到: 】
: 标  题: Re: 运算的机器周期
: 发信站: 哈工大紫丁香 (Tue Jun 15 10:53:03 2004), 转信

: nod,现在intel提供的技术资料里面,已经没有指令所占周期的数据了,
: 下面提供一点intel386的吧,仅供参考
: (单位:cpu周期)
: add : 2~7
: sub ; 2~7
: mul : 9~41
: div : 14~41

: 这些数据在宏观上感觉还是有意义的,
: 比如
: inc 只有1个时钟周期,
: 所以 ++a比a=a+1 快
汇编代码可能是一样的啊

: shl 3~7个周期
: 所以 a = a * 2 要比 a << 2 ;慢很多,
这个也是啊
总之和编译器有关

: 对于定量优化还是有意义的~~~:)

: 【 在 SwordLea (飞刀李) 的大作中提到: 】
: : 哦,我刚才也在考虑这个问题,那些老掉牙的教材里的“准确数据”只怕现在
: : 也时过境迁了。


: --
: 纯C论坛:http://purec.binghua.com

: 一些技术书籍,不知哪位朋友想要:http;//book.binghua.com (6.15新添书一本)

: 业精于勤荒于嬉,行成于思毁于随


※ 修改:·SwordLea 于 Jun 16 15:00:22 修改本文·[FROM: 202.118.246.241]
: ※ 来源:·哈工大紫丁香 bbs.hit.edu.cn·[FROM: 202.118.224.14]




────────────────────────────────────────
  iamxiaohan (潇寒·System Programmer) 于  (Tue Jun 15 11:43:10 2004)  说道:

一般的原则因当是能自己优化就自己优化,
目前的编译器智能程度还达不到可以完全依靠的地步,
a = a * 264 这样的句子,目前很少有编译器,可以将其翻译为
a = a * ( 256 + 8 ) = a << 8 + a << 3 
 
【 在 alphame (糊涂) 的大作中提到: 】
: 汇编代码可能是一样的啊
: 这个也是啊
: 总之和编译器有关
: ...................



────────────────────────────────────────
  SwordLea (飞刀李)                于  (Tue Jun 15 11:44:18 2004)  说道:

不错,编译器会提供一定的优化工作,比如下面这段代码:

int main(int argc, char* argv[])
{
        for (int i = 0; i < 5; i ++)
        {
                printf("%d",i);
        }
        
        int j = 0;
        while (j < 5) 
        { 
                printf("%d",j);
                j = j + 1;
        }
        for (;;);
        return 0;
}

编译后:

00401001   . 33F6           XOR ESI,ESI
; for 循环
00401003   > 56             PUSH ESI
00401004   . 68 30604000    PUSH test.00406030                   ;  ASCII "%d"
00401009   . E8 22000000    CALL test.00401030                   ; printf
0040100E   . 83C4 08        ADD ESP,8
00401011   . 46             INC ESI
00401012   . 83FE 05        CMP ESI,5
00401015   .^7C EC          JL SHORT test.00401003
; while 循环
00401018   . 33F6           XOR ESI,ESI
0040101A   > 56             PUSH ESI
0040101B   . 68 30604000    PUSH test.00406030                   ;  ASCII "%d"
00401020   . E8 0B000000    CALL test.00401030                   ; printf
00401025   . 83C4 08        ADD ESP,8
00401028   . 46             INC ESI
00401029   . 83FE 05        CMP ESI,5
0040102C   .^7C EC          JL SHORT test.0040101A
; for 死循环
0040102E   >-EB FE          JMP SHORT test.0040102E

【 在 alphame (糊涂) 的大作中提到: 】
: 汇编代码可能是一样的啊
: 这个也是啊
: 总之和编译器有关
: ...................



────────────────────────────────────────
  SwordLea (飞刀李)                于  (Tue Jun 15 11:46:02 2004)  说道:

个人意见,除非核心代码或者永不修改的代码,不要为了效率牺牲程序的可读性。
【 在 iamxiaohan (潇寒·System Programmer) 的大作中提到: 】
: 一般的原则因当是能自己优化就自己优化,
: 目前的编译器智能程度还达不到可以完全依靠的地步,
: a = a * 264 这样的句子,目前很少有编译器,可以将其翻译为
: ...................



────────────────────────────────────────
  iamxiaohan (潇寒·System Programmer) 于  (Tue Jun 15 11:47:24 2004)  说道:

这个看怎么说了,
有人认为 a = a + 1 ; 的可读性好,
但也有人认为 ++a ; 的可读性就足够了

【 在 SwordLea (飞刀李) 的大作中提到: 】
: 个人意见,除非核心代码或者永不修改的代码,不要为了效率牺牲程序的可读性。




────────────────────────────────────────
  SwordLea (飞刀李)                于  (Tue Jun 15 11:51:19 2004)  说道:

呵呵,我只是说象 a = a * 264 这个例子,
万万不可写成 a = a << 8 + a << 3  啊!!
【 在 iamxiaohan (潇寒·System Programmer) 的大作中提到: 】
: 这个看怎么说了,
: 有人认为 a = a + 1 ; 的可读性好,
: 但也有人认为 ++a ; 的可读性就足够了
: ...................



────────────────────────────────────────
  iamxiaohan (潇寒·System Programmer) 于  (Tue Jun 15 11:52:40 2004)  说道:

如果从优化的角度,这种方法不值得推荐
因为你不能保证你的这段程序在所有编译器下都会产生这样的最优化代码,
或许vc可以,但bc,gcc或是其它的一些编译器也会吗?
能手动优化,就手动优化是最好的

【 在 SwordLea (飞刀李) 的大作中提到: 】
: 不错,编译器会提供一定的优化工作,比如下面这段代码:
: int main(int argc, char* argv[])
: {
: ...................



────────────────────────────────────────
  iamxiaohan (潇寒·System Programmer) 于  (Tue Jun 15 11:55:34 2004)  说道:

呵呵,有啥不可,只要不是初学者一看就知道是什么意思,最多后面加个注释
以前在dos下写游戏,这种写法是很常见的优化手段~~~:)
a = a * 264 与 a = a << 8 + a << 3 ;
执行的效率差上百倍,要是程序中这种计算太多,速度是会狂降的,
特别是如果在计算量很大,数据超长的科学计算中~~~:(

【 在 SwordLea (飞刀李) 的大作中提到: 】
: 呵呵,我只是说象 a = a * 264 这个例子,
: 万万不可写成 a = a << 8 + a << 3  啊!!




────────────────────────────────────────
  SwordLea (飞刀李)                于  (Tue Jun 15 13:38:59 2004)  说道:

原来是这样,如果不是用于科学计算,对于那些对效率要求
不是很高的程序,还是不要片面追求效率的好。我看过一个
程序,为了减少入栈出栈操作,居然连函数都舍不得用,本
来是个很简单的程序,竟写了数千行。
有时候我也想不明白,同样的诲涩难懂的代码,为什么有的
称经典,有的称垃圾。
【 在 iamxiaohan (潇寒·System Programmer) 的大作中提到: 】
: 呵呵,有啥不可,只要不是初学者一看就知道是什么意思,最多后面加个注释
: 以前在dos下写游戏,这种写法是很常见的优化手段~~~:)
: a = a * 264 与 a = a << 8 + a << 3 ;
: ...................



────────────────────────────────────────
  iamxiaohan (潇寒·System Programmer) 于  (Tue Jun 15 13:41:11 2004)  说道:


【 在 SwordLea (飞刀李) 的大作中提到: 】
原来是这样,如果不是用于科学计算,对于那些对效率要求
不是很高的程序,还是不要片面追求效率的好。我看过一个
程序,为了减少入栈出栈操作,居然连函数都舍不得用,本
来是个很简单的程序,竟写了数千行。
有时候我也想不明白,同样的诲涩难懂的代码,为什么有的
称经典,有的称垃圾。
~~~~~~~~~~~~~~~~~~~~~~~呵呵,也许是时代不同了,
当年存储器很小价格很高的时候,这些东东就称为经典了,
现在存储器很大,这些东东就称为垃圾了~~~
这年头,存储器大了,代码也不值钱了~~~~:(

【 在 iamxiaohan (潇寒·System Programmer) 的大作中提到: 】
: 呵呵,有啥不可,只要不是初学者一看就知道是什么意思,最多后面加个注释
: 以前在dos下写游戏,这种写法是很常见的优化手段~~~:)
: a = a * 264 与 a = a << 8 + a << 3 ;
: ...................



────────────────────────────────────────
  alphame (糊涂)             于  (Tue Jun 15 13:41:31 2004)  说道:

标准不一样~
谁掌握标准,谁说了算
呵呵
【 在 SwordLea (飞刀李) 的大作中提到: 】
: 原来是这样,如果不是用于科学计算,对于那些对效率要求
: 不是很高的程序,还是不要片面追求效率的好。我看过一个
: 程序,为了减少入栈出栈操作,居然连函数都舍不得用,本
: ...................



────────────────────────────────────────
  SwordLea (飞刀李)                于  (Tue Jun 15 13:49:15 2004)  说道:

Joke 版里平均30几个人在线,这个版就只有我们几个争论。
天气越来越炎热,技术版越来越冷清。
【 在 alphame (糊涂) 的大作中提到: 】
: 标准不一样~
: 谁掌握标准,谁说了算
: 呵呵
: ...................



────────────────────────────────────────
  alphame (糊涂)             于  (Tue Jun 15 13:50:46 2004)  说道:

我几乎不区joke
这里到是常来
呵呵
【 在 SwordLea (飞刀李) 的大作中提到: 】
: Joke 版里平均30几个人在线,这个版就只有我们几个争论。
: 天气越来越炎热,技术版越来越冷清。




────────────────────────────────────────
  Amia (小羊)                      于  (Tue Jun 15 14:04:53 2004)  说道:

不错了,头两天毕业设计最忙活的时候都是些什么鬼问题呀
【 在 SwordLea (飞刀李) 的大作中提到: 】
: Joke 版里平均30几个人在线,这个版就只有我们几个争论。
: 天气越来越炎热,技术版越来越冷清。




────────────────────────────────────────
  SwordLea (飞刀李)                于  (Tue Jun 15 14:20:25 2004)  说道:

呵呵,知足常乐啊。
不过,也许真应该成立一个“毕业设计”版,免得“程序设计”版错误
地成为搞毕设的学生们的救命稻草。
【 在 Amia (小羊) 的大作中提到: 】
: 不错了,头两天毕业设计最忙活的时候都是些什么鬼问题呀




[百宝箱] [返回首页] [上级目录] [根目录] [返回顶部] [刷新] [返回]
Powered by KBS BBS 2.0 (http://dev.kcn.cn)
页面执行时间:206.448毫秒