CnPack Forum


 
Subject: 提高软件执行效率的几条原则
bahamut8348
灌水司司长
Rank: 6Rank: 6


UID 4743
Digest Posts 14
Credits 337
Posts 79
点点分 337
Reading Access 10
Registered 2007-1-18
Status Offline
Post at 2008-3-22 00:32  Profile | Blog | P.M. 
提高软件执行效率的几条原则

似乎有很多朋友对于我说的“避免使用WITH语句”持反对意见。理由是With语句可以提高执行效率。
    的确With是可以稍微提高一些执行效率,但是这是以破坏代码可读性的代价来换取的,尤其是多个WITH语句嵌套在一起的时候。

    其实,如何提高执行效率主要还是在你所写下的代码里。以下是我总结的几条提高执行效率的例子,请大家指正:

  一、尽量避免使用重复的语句块:
    我们来看一段代码:
        //假设 Loop, LoopChild: Word;
        //ArrayA, ArrayB: array[0..100] of Char;
        //Value: Char;
      for Loop := 0 to 100 do
        ArrayA[Loop]:= ArrayB[Loop];
      for Loop := 0 to 100 do
        begin
          Value:= ArrayA[Loop];
          for LoopChild := 0 to 100 do
            ...
        end;
    其实这个就是重复的语句块的执行了,上面的代码我们可以写成:
      CopyMemory(@ArrayA[0], @ArrayB[0], SizeOf(ArrayA));
      for Loop := 0 to 100 do
        begin
          Value:= ArrayA[Loop];
          for LoopChild := 0 to 100 do
            ...
        end;

  二、尽量不要使用 i:= i + x;这样的语句
    在DELPHI里高效率的替代语句是Inc(i, x);等同于C中的i += x;

  三、尽可能的减少运算次数
    如:s:= Copy(Text, 3, Length(Text) - 2);
    我们可以替代成:s:= Copy(Text, 3, MaxInt);
    因为不管你传进去的拷贝长度是否越界,COPY函数内部都会做一次检查,反正都是要检查的,干脆用长一点不是很好吗,而且LENGTH()这里多调用了一次函数判断字符串的长度。

  四、不使用if Flag = True then 这样的语句
    原因很简单,因为FLAG本来就是BOOLEAN类型的变量,完全没有必要提取他的值来和True比较,直接写成
      if Flag then 可以有效的减少执行时间;
    同理:
      if Value = 0 then
        Result:= True
      else
        Result:= False;
    这样的语句也可以直接写成: Result:= Value = 0;

  五、尽量减少子程序间的嵌套调用
    其实这和提高可读性是矛盾的,过多的在子程序内部嵌套调用其他子程序是会影响执行效率的;
    (所谓嵌套调用就是,比如有10个函数a1, a2, a3, a4, a5, a6, a7, a8, a9, a10; 那么在a1中调用a2,在a2中调用a3...这就叫嵌套调用)
    至于怎么和可读性去协调,那么就要看实际情况了,不过我还是推荐以注意可读性为优先

  六、尽可能使用整数运算来替代浮点运算
    比如 Trunc(a / b) 如果可能的话,优先选择写成 a div b比较好(前提a,b都是整数)

  七、循环次数多的循环尽可能的放在循环嵌套的内部
    如:for i := 0 to 100 do
          for j := 0 to 5 do
            ...
    应该尽量写成:
      for j := 0 to 5 do
        for i := 0 to 100 do
          ...
    因为每次循环前都需要对循环变量进行初始化操作,把循环次数多的循环放在内循环可以有效的减少这个操作,从而提高执行效率。

    另外,大数据量的分页显示;直接的内存操作等等都可以有效的提高软件的执行效率……

    以上是我暂时所能想到的了,呵!或许还有没有想到的,希望大家补充,也欢迎大家批评错误,谢谢!

[ 本帖最后由 bahamut8348 于 2008-3-22 11:13 编辑 ]




做人要厚道,看帖要回贴
Top
Passion (LiuXiao)
管理员
Rank: 9Rank: 9Rank: 9


UID 359
Digest Posts 19
Credits 6756
Posts 3554
点点分 6756
Reading Access 102
Registered 2004-3-28
Status Offline
Post at 2008-3-22 11:09  Profile | Blog | P.M. 
俺要转载并建议改改标题为:《提高软件执行效率的几条原则》。
Top
Passion (LiuXiao)
管理员
Rank: 9Rank: 9Rank: 9


UID 359
Digest Posts 19
Credits 6756
Posts 3554
点点分 6756
Reading Access 102
Registered 2004-3-28
Status Offline
Post at 2008-3-22 11:18  Profile | Blog | P.M. 
还有一条:“打开编译器的优化开关”,哈哈。
Top
abcdman
新警察
Rank: 1



UID 35317
Digest Posts 0
Credits 8
Posts 4
点点分 8
Reading Access 10
Registered 2008-1-3
Status Offline
Post at 2008-3-22 11:22  Profile | Blog | P.M. 
支持,讲的不错,期待新作。
Top
xjw100
灌水科科长
Rank: 3Rank: 3


UID 1476
Digest Posts 0
Credits 134
Posts 74
点点分 134
Reading Access 10
Registered 2005-12-13
Location 桂林
Status Offline
Post at 2008-3-22 11:25  Profile | Blog | P.M. 
如果参数在函数中不可能修改, 一定要使用 const;
不然,编译器就会:
假定先修改, 先要备份使用前后要增减引用计数, 还要套上 try finally.
指定了const 就可以避免以上过程从而提高效率。

还有,被const修饰的东西都受到强制保护,可以预防意外的变动,能提高程序的健壮性。
所以很多C++程序设计书籍建议:“Use const whenever you need。”

[ 本帖最后由 xjw100 于 2008-3-22 11:39 编辑 ]
Top
Passion (LiuXiao)
管理员
Rank: 9Rank: 9Rank: 9


UID 359
Digest Posts 19
Credits 6756
Posts 3554
点点分 6756
Reading Access 102
Registered 2004-3-28
Status Offline
Post at 2008-3-22 11:46  Profile | Blog | P.M. 
楼上说的是string吧。
Top
wsc188
新警察
Rank: 1



UID 39119
Digest Posts 0
Credits 28
Posts 11
点点分 28
Reading Access 10
Registered 2008-3-22
Status Offline
Post at 2008-3-22 14:01  Profile | Blog | P.M. 
好..學到不少東西..支持下.!~
Top
peaksky
新警察
Rank: 1



UID 2272
Digest Posts 0
Credits 14
Posts 6
点点分 14
Reading Access 10
Registered 2006-6-16
Status Offline
Post at 2008-3-22 20:16  Profile | Blog | P.M. 
顶一下
Top
zjy
管理员
Rank: 9Rank: 9Rank: 9



UID 2
Digest Posts 6
Credits 2385
Posts 1543
点点分 2385
Reading Access 102
Registered 2002-12-16
Location China
Status Offline
Post at 2008-3-24 08:27  Profile | Site | Blog | P.M. 
鼓励一下!

不过巴哈有的建议有些想当然了,Delphi的编译器已经非常智能了,很多C里头手工优化的经验Delphi的编译器会自己帮我们来做。比如第二条,上个图看看:


Image Attachment: inc_asm.gif (2008-3-24 08:27, 4.41 K)





Zhou JingYu
CnPack Administrator
http://www.cnpack.org/
Top
bahamut8348
灌水司司长
Rank: 6Rank: 6


UID 4743
Digest Posts 14
Credits 337
Posts 79
点点分 337
Reading Access 10
Registered 2007-1-18
Status Offline
Post at 2008-3-24 18:45  Profile | Blog | P.M. 
顶楼上的,这倒还真不知道,不过养成良好的代码书写习惯确实是件好事情。

PS:我在公司已经被那些实习生“邪恶”的With搞到不行了,嵌套最多竟然到了7层了,我已经快要疯掉了,禁止使用With最大的理由就是这,似乎他们多with情有独钟,简单的几条语句都来下With真搞不懂他们

[ 本帖最后由 bahamut8348 于 2008-3-24 18:46 编辑 ]




做人要厚道,看帖要回贴
Top
Passion (LiuXiao)
管理员
Rank: 9Rank: 9Rank: 9


UID 359
Digest Posts 19
Credits 6756
Posts 3554
点点分 6756
Reading Access 102
Registered 2004-3-28
Status Offline
Post at 2008-3-24 23:26  Profile | Blog | P.M. 
嵌套7层的with!我混了这么多年还真没见过。
Top
bahamut8348
灌水司司长
Rank: 6Rank: 6


UID 4743
Digest Posts 14
Credits 337
Posts 79
点点分 337
Reading Access 10
Registered 2007-1-18
Status Offline
Post at 2008-3-25 01:40  Profile | Blog | P.M. 
因为那个工程有几个包含类,而类里面又包了结构类型,所以有些地方会有XX.XX.XX的情况出现,
但是类里绝对没有包含再包含的关系,结构类型最多也就是包了2层,而且,当访问域多于3层的话,是绝对在类里给出了接口的,如:

TXX = class(TObject)
public
  property List: TStrings;
  property Items[Index: Integer]: AnsiString;
end;

都有像这样的接口给出来了的,就不知道他们为什么不看设计文档了……

补充:
补充一个代码片段

With ADOQuery1 do
  begin
    ...
    With Form1 do
      begin
        ...
        With ListBox1 do
          begin
            ...
            With Items do
              .....
            With ... do
              ...
          end;
      end;
  end;

就像这样的东西真是随处可见................

[ 本帖最后由 bahamut8348 于 2008-3-25 01:54 编辑 ]




做人要厚道,看帖要回贴
Top
kendling (小冬)
高级版主
Rank: 8Rank: 8
MyvNet


Medal No.1  
UID 703
Digest Posts 5
Credits 978
Posts 580
点点分 978
Reading Access 101
Registered 2005-2-18
Location 广东
Status Offline
Post at 2008-3-29 18:03  Profile | Site | Blog | P.M.  | QQ | Yahoo!
无语,我也喜欢用with,不过绝对不会这么多层,最多最多3层,一般都是一层,两层都比较少。。




小冬
http://MyvNet.com
Top
 




All times are GMT++8, the time now is 2024-4-20 20:33

    本论坛支付平台由支付宝提供
携手打造安全诚信的交易社区 Powered by Discuz! 5.0.0  © 2001-2006 Comsenz Inc.
Processed in 0.014965 second(s), 8 queries , Gzip enabled

Clear Cookies - Contact Us - CnPack Website - Archiver - WAP