当前位置:主页>仓库管理软件> 列表

请问如果降低系统资源和内存的占用,提高效率 找进销存管理系统

财务软件版1楼: 昨天提问了这个问题:http://www.delphibbs.com/delphibbs/dispq.asp?lid=3371158
刚才我这样子解决,就是很傻的全部遍历比较一次,结果A:2000 B:6000,运行不到两分钟就没有响应了,资源占用100%,请问应该如何改进,若用数据库的话,代码该怎么写呢?谢谢。
我的写法:
procedure TForm1.Button3Click(Sender: TObject);
var
i,j,k,l:integer;
F:boolean;
begin
memo3.Text:='''';
memo4.Text:='''';
k:=0;
l:=0;
F:=False;
for i:=0 to memo1.Lines.Count-1 do
begin
For j:=0 to Memo2.Lines.Count-1 Do
Begin
if memo1.Lines.strings[i]=memo2.Lines.strings[j] then
Begin
memo3.Lines.Insert(k,memo1.Lines.strings[i]);
k:=k+1;
f:=true;
label4.caption:=''相同代理''+inttostr(k);
break;
End;
End;
if F=false then
begin
Memo4.Lines.Insert(l,memo1.Lines.strings[i]);
l:=l+1;
label3.Caption:=''不同代理''+inttostr(l);
end;
F:=False;
end;
memo3.Lines.SaveToFile(''相同代理(''+inttostr(k)+'').txt'');
memo4.Lines.SaveToFile(''不同代理(''+inttostr(l)+'').txt'');
end;

2楼: 呵呵,看到你的上一个问题的时候就猜到要有这个问题的。
使用遍历的比较方法肯定快不上去的。
为了加快检索速度,你可以先对结果进行排序。
然后采用二分法查找,提高检索速度。
不过提高检索速度最快的方法就是使用hash。

uses
IniFiles;
//使用hash
procedure TForm1.btn1Click(Sender: TObject);
var
x: THashedStringList;
i: Integer;
v: TDateTime;
begin
x := THashedStringList.Create;
for i := 0 to 5000 do
begin
x.Add(''xxx:800'' + IntToStr(i));
end;
v := Now;
for i := 0 to 5000 do
begin
x.IndexOf(''xxx:800'' + IntToStr(Random(5000)));
end;
ShowMessage(FormatDateTime(''ss zzz'', Now - v));
end;

//不使用hash
procedure TForm1.btn2Click(Sender: TObject);


var
x: TStringList;
i: Integer;
v: TDateTime;
begin
x := TStringList.Create;
for i := 0 to 500 do
begin
x.Add(''xxx:800'' + IntToStr(i));
end;
v := Now;
for i := 0 to 500 do
begin
x.IndexOf(''xxx:800'' + IntToStr(Random(5000)));
end;
ShowMessage(FormatDateTime(''ss zzz'', Now - v));
end; 如软件销售技巧

3楼: to zbird:
你把这个问题里的hash比较用错地方了。一般在对比数量基本相当的情况下,使用hash比较不一定是最合适的。比如这个题目,他在比较的是ip地址,而且两者数量有可能会很接近,这时候使用端口分组地址做累加和排序是最快的,不知你是否同意?

另,to abc1点2点3点:就是你不使用特殊的算法,最起码在运算前也要把memo锁上吧?

4楼: to:flamingo
你应该没搞清楚hash的原理。
在delphi里面THashedStringList的性能不太好。
但对付这点需求还是足够了。
你试过就知道了。

PS:
有一些其他的hash实现,比如jcl里面带了hashset。
不过不太清楚性能怎么样。
java的hashset的性能好的一塌糊涂。
在我机器上是609毫秒(JAVA对一些常用算法的实现,效率都很高)。
public static void testHashSet() {
HashSet set = new HashSet();
for (int i = 0; i < 100000; i++) {//十万条数据
set.add("127.0.0.1:" + i);
}
long v = System.currentTimeMillis();
for (int i = 0; i < 20000000; i++) {//2千万次检索
set.contains("127.0.0.1");
}
System.out.println(System.currentTimeMillis() - v);
}

5楼: to zbird:
昨天有点晚了,想了想没计算就说了,今天醒来后算了一下,hash还是比我的方法好。这个问题里的搜索广度是容量分之一,深度是3,都明显优于我的方法。

6楼: to zbird,对了,我还忘了鄙视鄙视你:你上面那个搜索代码例子中想说明什么问题?是表示快吗?你知道这个显示的时间是表示搜索了多少次后的时间?十万条数据*2千万次检索?看来是你需要再读读原理了。

财务软件版7楼: 你那个代码用 Delphi 写应该不会超过 50ms !!我刚刚实测过。

8楼: 汗~
高手们论战,有看没有懂,不知hash怎么用。
刚才用下面这写法,速度倒是快了很多,不到一秒,几千代理就分出来了,只是只能生成不同代理的文件,文件名也被定死了;相同的还没搞定



var
A,B:TStringList;
i,Iindex:integer;
begin
A:=TStringList.Create;
B:=TStringList.Create;
A.LoadFromFile(''A.TXT'');
B.LoadFromFile(''B.TXT'');
for i:=0 to B.Count-1 do
begin
iIndex:=A.IndexOf(B[i]);
while iIndex>=0 do
begin
A.Delete(iIndex);
iIndex:=A.IndexOf(B[i]);
end;
end;
a.SaveToFile(''不同代理.TXT'');
A.Free;
B.Free;
end;

9楼: 来自:flamingo, 时间:2006-3-5 10:21:56, ID:3372034
你那个代码用 Delphi 写应该不会超过 50ms !!我刚刚实测过。
-------
请贴代码。
反正代码也不长。

10楼: TO:abc123123
你把TStringList换成THashedStringList会快不少。

11楼: THashedStringLis好用吗?如果用来存放对象!

12楼: zbird,代码是我同事写的,我也很久不写代码了,用的是公司共公库的hash算法,结构和你已经贴出的完全相当,所以就不贴代码了。不过,你也不用推荐abc用这个东西,因为其中存在一个小问题,对还不太充分理解hash用法的朋友来讲,我宁愿支持先学着用,以后熟悉了再用到具体代码中比较好。 如进销存管理系统

13楼: 我想到办法解决了,不过今晚没空了。
明天晚上我把程序写好发出来吧。

财务软件版14楼: to:flamingo
既然用的是非标准算法库那我就没什么好说的了。可能你同事写的算法比较好吧。
下面的代码近乎于空循环,花费的时间也得4xx ms。这里不是不相信你说的速度,我只是说JAVA对常用算法的实现效率已经很高了。
var
i: integer;
v: TDateTime;
x, k: string;
begin
v := now;
for i := 0 to 10000000 do
begin
x := ''x'';
end;
ShowMessage(FormatDateTime(''ss zzz'', now - v));
end;

十万条数据*2千万次检索?看来是你需要再读读原理了。
----我确实不知道哪里有问题,说个明白?

因为其中存在一个小问题
----也说个明白吧。

15楼: 多人接受答案了。