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. |
Автор: | 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/ |