OberonCore
https://forum.oberoncore.ru/

B14: flush
https://forum.oberoncore.ru/viewtopic.php?f=116&t=6172
Страница 1 из 1

Автор:  Trurl [ Вторник, 21 Ноябрь, 2017 11:03 ]
Заголовок сообщения:  B14: flush

WinApi.FlushFileBuffers надо вставить не в HostFiles.FlushBuffer, а в HostFiles.Flush.

Автор:  Евгений Темиргалеев [ Вторник, 21 Ноябрь, 2017 21:52 ]
Заголовок сообщения:  Re: B14: flush

Это который "portable"? Другого что-то не видно.
Код:
   PROCEDURE (f: File) Flush;
      VAR i: INTEGER;
   BEGIN   (* portable *)
      i := 0; WHILE i # nofbufs DO FlushBuffer(f, i); INC(i) END
   END Flush;

Автор:  Trurl [ Среда, 22 Ноябрь, 2017 12:42 ]
Заголовок сообщения:  Re: B14: flush

"..а у меня там дрова лежат". Какой portable в HostFiles?

Автор:  Борис Рюмшин [ Среда, 22 Ноябрь, 2017 13:27 ]
Заголовок сообщения:  Re: B14: flush

Trurl писал(а):
"..а у меня там дрова лежат". Какой portable в HostFiles?

Трурлинг detected. :mrgreen:

Автор:  Trurl [ Среда, 22 Ноябрь, 2017 21:07 ]
Заголовок сообщения:  Re: B14: flush

Ну, для ценителей шашечек можно
Код:
PROCEDURE (f: File) Flush;
  VAR i: INTEGER;
BEGIN   
  (* portable *)
  i := 0; WHILE i # nofbufs DO FlushBuffer(f, i); INC(i) END
  (* nonportable *)
  WinApi.FlushFileBuffers(f.ref);
END Flush;

или даже

Код:
PROCEDURE FlushFile(f: File);
  VAR i: INTEGER;
BEGIN   
  WinApi.FlushFileBuffers(f.ref);
END Flush;

PROCEDURE (f: File) Flush;
  VAR i: INTEGER;
BEGIN   
  (* totally portable *)
  i := 0; WHILE i # nofbufs DO FlushBuffer(f, i); INC(i) END
  FlushFile(f);
END Flush;

Автор:  Иван Денисов [ Среда, 22 Ноябрь, 2017 21:31 ]
Заголовок сообщения:  Re: B14: flush

Не помешали бы комментарии. Почему нужен такой вызов? Какие сейчас проблемы из-за отсутствия такого вызова?

Автор:  Евгений Темиргалеев [ Среда, 22 Ноябрь, 2017 22:15 ]
Заголовок сообщения:  Re: B14: flush

История вопроса:
Цитата:
РБВ, 14.05.2011 17:17:33
Замечание: Данная дельта резко снижает быстродействие записи при файлов. Суть в том, что нижестоящей операционной системе приходится постоянно вести невыгодную для неё записть по 2 Кб (размер буфера в HostFiles). Кроме общего соображения это было проверено на документе размером ~ 4Мб. Запись заняла порядка 90 сек с включенной дельтой против 0,5 сек с выключенной (wine, ОС Ubuntu 11.04 x86-64, Athlon 64 3200+).

По сути BlackBox ведёт себя как ОС и если бы он сам производил запись на диск, подход был бы оправдан. Но в нашем случае, внизу находится основная ОС, и если запись была произведена, то изменения вступили в силу на основной ФС, даже если ещё не достигли непосредственно жёсткого диска.

Варианта решения два:
1) Для сохранения спецификации можно увеличить размер буфера. Это также повышает быстродействие и в случае вышеописанного эксперимента увеличение буфера до 256 Кб привело к времени записи порядка 2 сек.
2) Отказаться от принудительного сброса буфера.

Автор:  Иван Денисов [ Четверг, 23 Ноябрь, 2017 06:44 ]
Заголовок сообщения:  Re: B14: flush

А зачем была эта дельта? Оригинально WinApi.FlushFileBuffers(f.ref) вызывается только при закрытии файла.

Автор:  Trurl [ Четверг, 23 Ноябрь, 2017 08:24 ]
Заголовок сообщения:  Re: B14: flush

А вот именно поэтому. Чтобы File.Flush гарантировано сбрасывала данные на диск. А как раз при закрытии файла вызывать WinApi.FlushFileBuffers особого смысла нет.

Автор:  Wlad [ Четверг, 23 Ноябрь, 2017 12:14 ]
Заголовок сообщения:  Re: B14: flush

Trurl писал(а):
А вот именно поэтому. Чтобы File.Flush гарантировано сбрасывала данные на диск. А как раз при закрытии файла вызывать WinApi.FlushFileBuffers особого смысла нет.

А что-то по времени и надёжности теряем/выигрываем? Кто-то оценивал?

Автор:  Иван Денисов [ Четверг, 23 Ноябрь, 2017 17:54 ]
Заголовок сообщения:  Re: B14: flush

Trurl писал(а):
А вот именно поэтому. Чтобы File.Flush гарантировано сбрасывала данные на диск. А как раз при закрытии файла вызывать WinApi.FlushFileBuffers особого смысла нет.

Потому, что он и так это будет делать?

Автор:  Trurl [ Пятница, 24 Ноябрь, 2017 10:18 ]
Заголовок сообщения:  Re: B14: flush

Конечно, при закрытии файла все буферы сбрасываются.

Wlad писал(а):
А что-то по времени и надёжности теряем/выигрываем? Кто-то оценивал?

Трудно оценить. Тут ведь речь о том, что File.Flush на самом деле ничего не гарантирует. А вызываеть её все равно надо вручную и никто этого не делает обычно.

Страница 1 из 1 Часовой пояс: UTC + 3 часа
Powered by phpBB® Forum Software © phpBB Group
https://www.phpbb.com/