有个问题我百思不得其解,望高手指教(100分)

S

songmk

Unregistered / Unconfirmed
GUEST, unregistred user!
我用delphi写的一个程序,主要是字符串比较,比同事用VC++写的慢10倍 ,受不了
我得程序步骤:
第一步,导入文本文件,这个文本文件一般有几十万到几百万行,没行就是些 00-99的数字
第二步,设定要比较的字串,例如:01 03 08 25 56 76 88, 这个通常有几百个
第三步,计算出每个设定的字串在源文本文件中每一行相同的数字的个数。

例如:
源文本是
01 08 70 71 72 73 75 93
02 09 70 71 72 73 77 91
03 10 60 71 72 73 75 77
07 08 70 73 72 73 75 00
..............
比较设置的字串是:
01 08 20 30 33 34 35
02 08 22 30 33 35 37
03 08 20 31 32 33 38

难道delphi 做出来的东西比VC慢这么多?? 还是我得程序不行?
 
我觉得你应该看一看到底是慢在哪里了。是在文件的导入还是在于比较。然后再使用相应的算法进行优化。
 
文件导入不慢, 我说的是导入后,进行运算的时候慢

没什么算法啊 就是一个一个比较
 
肯定有问题,不然你delphi for十万次和VC for十万次比比看就知道循环有没有慢,没有吧,那就是你的算法比人家落后了。你程序的目的是什么?比较每个字符把不同的选出来?还是什么,想个好算法就行了
 
是你的算法有问题。
1:大数据量时的字符串操作很有技巧,因为string类型给你太多的方便(比VC++方便太多了),所以她隐藏了很多实现的细节,使用不当,会造成效率低下(特别是在大字符串,大数据量下)
2:是不是你的查找算法有问题,效率太低。

只有看到你的程序,才能具体帮你。否则,这能说这些了。
记住Delphi的效率绝对不比VC++低,关键是你的算法!
 
好的 谢谢大家
一会儿我把我的程序贴出来 让大家帮我改改
 
对,把算法贴出来让大家分析才是正理
 
算法的问题,百万次运算和10万次运算当然有差别
 
unit Unit1;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;

type
TForm1 = class(TForm)
Button1: TButton;
Edit1: TEdit;
OpenDialog1: TOpenDialog;
Edit2: TEdit;
Button2: TButton;
Button3: TButton;
Label1: TLabel;
Edit3: TEdit;
procedure FormCreate(Sender: TObject);
procedure FormClose(Sender: TObject; var Action: TCloseAction);
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
procedure Button3Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;
TAA,TBB:tstringlist;
implementation

{$R *.dfm}

//比较两个字串
function bijiao(const S1,S2:string):integer;
var
I,R:integer;
begin
I:=1;
R:=0;
while I<=length(S2) do
begin
if (S1=S2) then Inc(R);
Inc(I);
end;
Result:=R;
end;



procedure TForm1.FormCreate(Sender: TObject);
begin
TAA:=tstringlist.Create;
TBB:=tstringlist.Create;
end;

procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
TAA.Free;
TBB.Free;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
if opendialog1.Execute then
TAA.LoadFromFile(opendialog1.FileName);
Edit1.Text:=inttoStr(TAA.Count);
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
if opendialog1.Execute then
TBB.LoadFromFile(opendialog1.FileName);
Edit2.Text:=inttoStr(TBB.Count);
end;


procedure TForm1.Button3Click(Sender: TObject);
var
I,J,ST,ET,N,NA,NB:integer;
S1,S2:string;
begin

ST:=gettickcount;
NA:=TAA.Count;
NB:=TBB.Count;
for I:=0 to NA-1 do
begin
for J:=0 to NB-1 do
begin
S1:=TAA.Strings;
S2:=TBB.Strings[J];
N:=bijiao(S1,S2);
end;
Edit3.Text:=formatfloat('0%',I/NA*100);
application.ProcessMessages;
end;
ET:=gettickcount;
Edit3.Text:=InttoStr(ET-ST)+'毫秒';
end;

end.
 
快贴出来吧,向大家学习!
 
已经贴出来了啊 在上面
 
for I:=0 to NA-1 do
begin
for J:=0 to NB-1 do
begin
S1:=TAA.Strings;
S2:=TBB.Strings[J];
N:=bijiao(S1,S2);
end;
Edit3.Text:=formatfloat('0%',I/NA*100);
application.ProcessMessages; //一定要去掉,非常浪费时间
end;
 
application.ProcessMessages; //一定要去掉,非常浪费时间

去掉这一句速度并没有提高多少,我试过了
 
//比较两个字串
function bijiao(const S1,S2:string):integer;
var
I,R:integer;
begin
I:=1;
R:=0;
while I<=length(S2) do
begin
if (S1=S2) then Inc(R);
Inc(I);
end;
Result:=R;
end;
好像不是完全匹配,解释一下
 
Edit3.Text:=formatfloat('0%',I/NA*100);
application.ProcessMessages;
都没有如何?速度会快点吗?
 
不是完全匹配, 改成完全匹配也可以,这仅仅是个测试程序而已

那两句都去掉也没有改善,你可以试试啊
 
我没有那么大的数据量,无法测试出来.
不是完全匹配和完全匹配的效率数不一样的。
你这个不是完全匹配想得到什么结果?
 
如果改为完全匹配,我想可以提高一些效率,只是可能不到10倍
 
你同事的VC++是完全匹配吗?
 
S1:=TAA.Strings;
S2:=TBB.Strings[J];
N:=bijiao(S1,S2);
这三句是最耗时间的,在两个循环体内,所以,必须优化他们,少一句代码也是好的。
首先,再不大改的基础上,优化为一句
N:=bijiao(TAA.Strings,TBB.Strings);
 

Similar threads

回复
0
查看
864
不得闲
D
回复
0
查看
920
DelphiTeacher的专栏
D
S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
顶部