CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
可用分押宝游戏火热进行中... 专题改版:Java Web 专题
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  Delphi >  VCL组件开发及应用

我的程序怎么运行这么慢,如何提高程序运行速度呢?现在有4个for循环,它的结构如下-----------请高手指点

楼主foxfoxfoxchen(花粉过敏者)2004-04-04 11:28:52 在 Delphi / VCL组件开发及应用 提问

var  
  x,y,xx,yy;integer;  
  begin  
   
  for   x:=0   to   200   do   begin  
  for   y:=0   to   234   do   begin  
          这里有代码  
          for   xx:=0   to   50   do   begin  
          for   yy:=0   to   88   do   begin  
          这里有代码  
          end;  
          这里有代码  
          end;  
          这里有代码  
  end;  
  end;  
  for   x:=0   to   120   do   begin  
  这里有代码  
  end;  
  for   y:=0   to   300   do   begin  
  这里有代码  
  end;  
   
  end;  
   
  for循环结构如上,但小弟我的程序运行之慢呀,如何才能提高运行速度了,  
  ---------------------------  
  或     影响速度主要由哪些引起的了.提高速度的最好办法是什么呢?  
  问题点数:100、回复次数:12Top

1 楼zihan(子寒)回复于 2004-04-04 11:32:21 得分 30

这个主要根据你循环语句的代码而定,如果你里面有if语句,那么建议你把if语句提到循环的外面.这样,也许程序看上去不是那么清晰,但是效率要高一些,比如说  
  for   I   :=   0   to   100   do  
  begin  
      if     then  
      begin  
      end  
      else  
      begin  
      end;  
  end;  
  改为  
  if   then  
  begin  
      for   do  
      begin  
      end;  
  end  
  else    
  begin  
      for   do  
      begin  
      end;  
  end;Top

2 楼hwz119(善凉的狼)回复于 2004-04-04 11:33:53 得分 0

可不可以改变一下你的程序逻辑,而不是局限于该程序算法呢Top

3 楼sxtdxvb(和我处不好,你自己找原因!QQ:466080385)回复于 2004-04-04 11:46:33 得分 0

同意楼上  
   
  循环太多了    
   
  虽然单层循环量不大     但是层数太多了     导致循环次数成指数增长  
   
  Top

4 楼alphax(豪言壮语的乌鸦)回复于 2004-04-04 11:53:46 得分 20

把循环次数少的放在外层,多的放在内层,可以提高一点点速度  
   
  不过你的问题在于你的内层执行了50*88*200*234=4,400*46,800=4,500*45,000=202,500,000  
  =202M次,还有外面几层  
   
  能不慢吗?Top

5 楼huazaijiajia(千军万马)回复于 2004-04-04 12:00:47 得分 50

在多重循环中,尽可能将最长的循环放在最内层,最短的循环放在最外层,以减少CPU跨切循环层的次数。举个例子:  
  for   i:=0   to   100   do     //低效率的循环!    
  begin  
      for   j:=0   to   5   do  
          sum:=sum   +   a[i][j];  
  end;  
  相比之下,如果这样写:  
  for   j:=0   to   5   do     //高效率  
  begin  
      for   i:=0   to   100   do  
          sum:=sum   +   a[i][j];  
  end;    
   
  另外,如果循环体内存在逻辑判断,并且循环次数很大,宜将逻辑判断移到循环体的外面。  
  “zihan(子寒)”说的也就是这个意思,   如:  
  程序   A:  
  for   i:=0   to   N   do     //效率低但程序简洁  
  begin  
      if   (condition)   then  
          DoSomething  
      else  
          DoOtherthing;  
  end;  
  如果这样写:  
  程序   B:  
  if   (condition)   then     //效率高但程序不简洁  
      for   i:=0   to   N   do  
          DoSomething  
  else  
      for   i:=0   to   N   do  
          DoOtherthing;  
   
  程序   A   比程序   B   多执行了N-1次逻辑判断。并且由于前者老要进行逻辑判断,打断了循环“流水线”作业,使得编译器不能对循环进行优化处理,降低了效率。如果N非常大,最好采用程序   B   的写法,可以提高效率。如果N非常小,两者效率差别并不明显,采用程序   A   的写法比较好,因为程序更加简洁。  
   
   
   
   
  Top

6 楼racesun(夸父)回复于 2004-04-04 12:14:17 得分 0

循环太多了Top

7 楼lijinghe1(喜欢没有文化性格泼辣身材高大的女人)回复于 2004-04-04 12:19:35 得分 0

上面提到的优化方法我以为都不会有明显的改善,关键的问题是你是否真的需要这么多层的循环嵌套,如果是不可避免的,加个进度条完事了。Top

8 楼reallike(爱翔)(学得太多,得休息一下)回复于 2004-04-04 12:28:25 得分 0

看来数据结构没有学好……  
   
  是个(O)n4次方的算法,唉,还是补习一下基础吧。Top

9 楼foxfoxfoxchen(花粉过敏者)回复于 2004-04-04 12:28:54 得分 0

我在认真看一看能否改善一下循环嵌套.等一下哟.Top

10 楼SydPink(Miss Syd.Barrett)回复于 2004-04-04 12:44:19 得分 0

真不知道说点什么好。。。。。。。如果循环里只做   整形运算还可以。  
  如果不能够精简,那就开线程,放进度条吧。Top

11 楼huazaijiajia(千军万马)回复于 2004-04-04 14:16:43 得分 0

上面所说的是必须要用到这么多循环的情况下可以得到最大程度的改善。如果程序可以不用这么多  
  循环,而又用了这么多循环,那就是程序结构性问题了Top

12 楼wangyansurmount()回复于 2004-04-04 14:18:50 得分 0

搞的太复杂了,循环分解,这样会好些Top

相关问题

  • 同一个系统,在两台w2k机器上安装,运行结果一台正常,另一台出现如下信息,请高手指点:
  • 这个循环为何运行不通?
  • 运行aspx文件时,提示如下:
  • 运行spring出如下错误???
  • 为什么不能运行这些命令?请各位大虾指点指点
  • 应用程序运行出错,请高手指点!
  • 高手指点!请问linux下sql server7.0可以运行吗?
  • 为什么我一运行Delphi就出错!请大侠指点!
  • tomcat运行jsp出错。(请各位能详细指点,谢谢。)
  • VC 加载菜单后运行却没有呀??请指点..

关键词

  • 循环
  • 代码
  • 逻辑
  • 语句
  • 程序
  • 效率
  • 运行
  • 速度
  • 逻辑判断
  • 内层

得分解答快速导航

  • 帖主:foxfoxfoxchen
  • zihan
  • alphax
  • huazaijiajia

相关链接

  • Delphi类图书
  • Delphi类源码下载
  • Delphi控件下载

广告也精彩

反馈

请通过下述方式给我们反馈
反馈
提问
网站简介|广告服务|VIP资费标准|银行汇款帐号|网站地图|帮助|联系方式|诚聘英才|English|问题报告
世纪乐知(北京)网络技术有限公司 版权所有, 京 ICP 证 020026 号
北京创新乐知广告有限公司 提供技术支持
Copyright © 2000-2007, CSDN.NET, All Rights Reserved
GongshangLogo