提高程序运算速度的方法?(更新:含代码) (0分)

  • 主题发起人 主题发起人 xysir001
  • 开始时间 开始时间
X

xysir001

Unregistered / Unconfirmed
GUEST, unregistred user!
  我有这样一个程序:起循环次数超过10亿次,在循环过程中,有数据的读取、比较判断、数据的输出。(字符串)数据的读取和输出都是从Memo控件,没次循环都要经过这样的过程。
我曾经试验了一下,在一个有10多亿次的循环中,用了16个小时都没运算完?
请问:有什么方法能提高程序的运算速度?
请大家帮我优化优化。
代码如下:(是用的线程)
unit Unit2;

interface

uses
Classes, SysUtils, StrUtils;

type
ThrJS = class(TThread)
private
{ Private declarations }
protected
procedure Execute
override;
end;

implementation

uses Unit1;


{ ThrJS }

procedure ThrJS.Execute;
var
n,r,r1,r2,r3,r4,m,flag,gs,bznum:integer;
CombStr,UStr:string;
tmpStrings, tmpStrings1 : TStrings;
begin
FreeOnTerminate := true;
Form1.Animate1.Active := true;
r:=strtoint(Form1.edit2.Text);
gs:=strtoint(form1.Edit3.Text);
bznum:=strtoint(form1.edit4.text);
n:=form1.memo1.Lines.Count;
form1.Edit1.Text:=inttostr(form1.Memo1.Lines.Count);
tmpStrings := TStringList.Create;

tmpStrings := Form1.Memo1.Lines
//memo1中为原始数据,是一些字符串(后面参与组合)
tmpStrings1 := Form1.Memo4.Lines
//memo4中为标准数据,是一些字符串
begin
try
for r1:=n-1 downto r-1 do
for r2:=r1-1 downto r-2 do
for r3:=r2-1 downto r-3 do
for r4:=r3-1 downto 0 do
begin
CombStr:=tmpStrings[r1]+' '+tmpStrings[r2]+' '+tmpStrings[r3]+' '+tmpStrings[r4];
flag:=0;
UStr:='';
//上面这段代码为求一个C(n,r)的组合,其中参与组合的数据是一些字符串;n为500左右,r=4(在这里)
for m:=0 to bznum do
if flag<gs+1 then
if not AnsiContainsText(CombStr,tmpStrings1.Strings[m]) then
begin
UStr:=UStr+tmpStrings1.Strings[m]+' ';
inc(flag);
end;
//上面这段代码为:每个新组合的字符串与标准数据比较。

if flag=gs then
begin
UStr:=trimright(UStr);
if not AnsiContainsStr(Form1.Memo2.Lines.Text,UStr) then
form1.Memo2.Lines.Add(UStr);
end;
end;
//上面这段代码:如果flag=gs,再判断UStr是否已经在memo2中。如果存在,则不保存;如果不存在,则保存在//memo2中。(memo2中的数据是越来越多)

finally
Form1.Animate1.Active := false;

end;
end;
end;
end.

  
 
 
呵呵。。。没分的。。。我答一下:
1.换更快的CPU
2.加内存
3.数据的读取和输出都是从Memo控件 改成
一次性将数据读取到内存变量TStringlist里
对该变量进行操作,做完后再一次性传给MEMO控件

呵呵。。。答案对你有用的话,去给偶捧个场吧:
http://www.delphibbs.com/delphibbs/dispq.asp?lid=2433393
 
循环最多的部分贴出来看看
大家帮你改改
用多线程
 
难道没人能解决吗?
希望各位大富翁能帮帮小弟。
谢谢!
谢谢!!
谢谢!!!
 
问题就出在 form1.Memo2.Lines.Add(UStr);
这一句

3.数据的读取和输出都是从Memo控件 改成
一次性将数据读取到内存变量TStringlist里
对该变量进行操作,做完后再一次性传给MEMO控件
 
楼主可以丢开Memo控件,直接将文件加载内存流里。
加载到Memo,再进行操作,就是嫌速度太快

BTW:楼主的代码风格真是...
 
我没辙了,看别人吧
 
QQ在线:
 希望你能伸出援助之手!
谢谢!
鞠躬!!!
 
后退
顶部