Почему запись данных в Delphi идет очень медленно? - PullRequest
1 голос
/ 13 декабря 2011

Я проектирую для моего проекта 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;

Ответы [ 2 ]

4 голосов
/ 13 декабря 2011

Дисковый ввод-вывод является одним из самых медленных узких мест на сегодняшний день, особенно если вы используете медленные диски (то есть диски со скоростью 4200/5400 об / мин, встречающиеся на многих ноутбуках).

Лучшая производительность может быть достигнута с использованием буферизованного ввода-вывода (старые функции ввода-вывода Паскаля были разработаны давно и могут использовать небольшие буферы, лучше использовать один из буферизованных потоков, доступных сегодня в Delphi) или асинхронный ввод-вывод ( Вы передаете буфер для записи в ОС, вызов немедленно возвращается, и позже ОС сообщит вам, когда она записала данные).

2 голосов
/ 13 декабря 2011

Если я правильно помню .... у вас будет намного лучшая производительность с двоичными файлами, чем с текстовыми файлами.Содержание не имеет значения, это просто декларация.Вы не показываете объявление для fileptr.Но если он объявлен так:

var fileptr : TextFile;

, он будет медленнее, чем:

var fileptr : File;

или

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

Попробуйте и посмотрите, будет ли скоростьвещи до.Вы также можете использовать BlockWrite ().Обратите внимание, что ваш вывод может отставать от программы из-за буферизации.Возможно, вы хотите сбросить файл в любом обработчике ошибок.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...