【发布时间】:2014-01-23 14:43:24
【问题描述】:
当我在 XE4 中运行此代码时,应用程序最终使用了 ~800 MB。
为什么不接近 100 MB?
使用 Ansistring 代替字符串没有区别。
const
N = 10000000; // 10 million
M = 10;
var
i,j: integer;
s: string;
X: array of string;
begin
setlength(X,N);
for i:= 1 to N do
begin
s:= '';
for j:= 1 to M do s:= s+chr(65+random(25));
X[i-1]:= s;
end;
showmessage('pause');
end;
【问题讨论】:
-
我的猜测是内存碎片......但这只是一个猜测。
-
是的,将 s:= s+ 替换为 s[j]:= 会降低到 420 MB,但仍然浪费了很多。
-
如果你做
X: Array of Array[1..10] of Char怎么办?有没有好转? -
大量使用字符串连接,如 s := s + ... 这更像是“堆混合器”而不是程序 ;-)
-
@UffeKousgaard 您的示例代码在您的情况下没有意义:内存碎片,导致大量内存使用 主要是由于您努力填充随机字符串(通过串联,这无论如何都不是处理字符串的聪明方法)。如果您想针对内存使用优化您的代码,您首先需要制作一个小应用程序,它会生成一个包含您需要的随机内容的文件,然后将其加载到内存中进行测试。
标签: delphi