Я проектирую для моего проекта A2 Computing приложение для имитации отклика различных фильтров. Одна из проблем, с которыми я сталкиваюсь, заключается в том, что опция экспорта данных действительно медленная.
Обычно при генерации данных для отображения на дисплее это около 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;