为什么在Delphi中写入数据的速度很慢?

时间:2011-12-13 12:47:24

标签: delphi file buffer

我正在为我的A2计算项目设计一个模拟各种过滤器响应的应用程序。我遇到的一个问题是导出数据选项真的慢。

通常,当生成要在显示器上显示的数据时,它大约为40000 - 80000点/秒。将其录制到文件时,它会下降到大约五分之一。

最初我认为我的问题是因为我在每个数据点都调用了writeln。所以我写了它,它将数据排队成一个字符串,并在一个大的操作中写入它的每1000个点。它使它稍微快一点,但在内置窗体上显示它时仍然慢了4-5倍。

为什么会这样?

这是导出代码:

   for xx := 0 to npoints do
   begin
     freq := minfreq + ((xx / npoints) * maxfreq);
     ampl := GetAmplPoint(freq);
     phase := GetPhasePoint(freq);
     tempstr := tempstr + FormatFloat('#.#####', freq) + ',';
     tempstr := tempstr + FormatFloat('#.#####', ampl) + ',';
     tempstr := tempstr + FormatFloat('#.#####', phase) + sLineBreak;
     // Queue up to 1000 points, then write the data in one lump:
     // most of the time is spent in writeln waiting for IO which
     // slows down export.
     if xx mod 1000 = 0 then
     begin
       write(fileptr, tempstr);
       tempstr := '';
       ProgressBar.Position := 4 + Trunc((xx / npoints) * 96);
     end;
   end;

2 个答案:

答案 0 :(得分:4)

磁盘I / O是当今最慢的瓶颈之一,特别是如果您使用慢速磁盘(即许多笔记本电脑上的4200/5400 rpm磁盘)。

使用缓冲I / O(很久以前设计旧的pascal I / O函数,可能使用小缓冲区,更好地使用Delphi中现有的缓冲流之一)或asynch I / O(你传递缓冲区写入操作系统,调用立即返回,稍后操作系统会告诉你何时写入数据。)

答案 1 :(得分:2)

如果我没记错的话......二进制文件的性能会比文本文件好得多。内容无关紧要,只是声明。您没有显示fileptr的声明。但如果宣布这样:

var fileptr : TextFile;

它会慢于:

var fileptr : File;

var fileptr : File of <some record or type>;

尝试一下,看看它是否加快了速度。 您也可以使用BlockWrite()。请注意,由于缓冲,您的输出可能会落后于程序。您可能希望在任何错误处理程序中刷新文件。