OberonCore

Библиотека  Wiki  Форум  BlackBox  Компоненты  Проекты
Текущее время: Пятница, 22 Ноябрь, 2019 03:36

Часовой пояс: UTC + 3 часа




Начать новую тему Ответить на тему  [ Сообщений: 12 ] 
Автор Сообщение
 Заголовок сообщения: B14: flush
СообщениеДобавлено: Вторник, 21 Ноябрь, 2017 11:03 

Зарегистрирован: Понедельник, 28 Ноябрь, 2005 10:28
Сообщения: 1202
WinApi.FlushFileBuffers надо вставить не в HostFiles.FlushBuffer, а в HostFiles.Flush.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: B14: flush
СообщениеДобавлено: Вторник, 21 Ноябрь, 2017 21:52 
Модератор
Аватара пользователя

Зарегистрирован: Среда, 16 Ноябрь, 2005 00:53
Сообщения: 4526
Откуда: Россия, Орёл
Это который "portable"? Другого что-то не видно.
Код:
   PROCEDURE (f: File) Flush;
      VAR i: INTEGER;
   BEGIN   (* portable *)
      i := 0; WHILE i # nofbufs DO FlushBuffer(f, i); INC(i) END
   END Flush;


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: B14: flush
СообщениеДобавлено: Среда, 22 Ноябрь, 2017 12:42 

Зарегистрирован: Понедельник, 28 Ноябрь, 2005 10:28
Сообщения: 1202
"..а у меня там дрова лежат". Какой portable в HostFiles?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: B14: flush
СообщениеДобавлено: Среда, 22 Ноябрь, 2017 13:27 
Администратор

Зарегистрирован: Вторник, 15 Ноябрь, 2005 01:14
Сообщения: 4338
Откуда: Россия, Орёл
Trurl писал(а):
"..а у меня там дрова лежат". Какой portable в HostFiles?

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


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: B14: flush
СообщениеДобавлено: Среда, 22 Ноябрь, 2017 21:07 

Зарегистрирован: Понедельник, 28 Ноябрь, 2005 10:28
Сообщения: 1202
Ну, для ценителей шашечек можно
Код:
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;


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: B14: flush
СообщениеДобавлено: Среда, 22 Ноябрь, 2017 21:31 
Аватара пользователя

Зарегистрирован: Четверг, 08 Октябрь, 2009 15:00
Сообщения: 2430
Не помешали бы комментарии. Почему нужен такой вызов? Какие сейчас проблемы из-за отсутствия такого вызова?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: B14: flush
СообщениеДобавлено: Среда, 22 Ноябрь, 2017 22:15 
Модератор
Аватара пользователя

Зарегистрирован: Среда, 16 Ноябрь, 2005 00:53
Сообщения: 4526
Откуда: Россия, Орёл
История вопроса:
Цитата:
РБВ, 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) Отказаться от принудительного сброса буфера.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: B14: flush
СообщениеДобавлено: Четверг, 23 Ноябрь, 2017 06:44 
Аватара пользователя

Зарегистрирован: Четверг, 08 Октябрь, 2009 15:00
Сообщения: 2430
А зачем была эта дельта? Оригинально WinApi.FlushFileBuffers(f.ref) вызывается только при закрытии файла.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: B14: flush
СообщениеДобавлено: Четверг, 23 Ноябрь, 2017 08:24 

Зарегистрирован: Понедельник, 28 Ноябрь, 2005 10:28
Сообщения: 1202
А вот именно поэтому. Чтобы File.Flush гарантировано сбрасывала данные на диск. А как раз при закрытии файла вызывать WinApi.FlushFileBuffers особого смысла нет.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: B14: flush
СообщениеДобавлено: Четверг, 23 Ноябрь, 2017 12:14 

Зарегистрирован: Воскресенье, 28 Май, 2006 22:12
Сообщения: 1438
Trurl писал(а):
А вот именно поэтому. Чтобы File.Flush гарантировано сбрасывала данные на диск. А как раз при закрытии файла вызывать WinApi.FlushFileBuffers особого смысла нет.

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


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: B14: flush
СообщениеДобавлено: Четверг, 23 Ноябрь, 2017 17:54 
Аватара пользователя

Зарегистрирован: Четверг, 08 Октябрь, 2009 15:00
Сообщения: 2430
Trurl писал(а):
А вот именно поэтому. Чтобы File.Flush гарантировано сбрасывала данные на диск. А как раз при закрытии файла вызывать WinApi.FlushFileBuffers особого смысла нет.

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


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: B14: flush
СообщениеДобавлено: Пятница, 24 Ноябрь, 2017 10:18 

Зарегистрирован: Понедельник, 28 Ноябрь, 2005 10:28
Сообщения: 1202
Конечно, при закрытии файла все буферы сбрасываются.

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

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


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 12 ] 

Часовой пояс: UTC + 3 часа


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 0


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Вся информация, размещаемая участниками на конференции (тексты сообщений, вложения и пр.) © 2005-2019, участники конференции «OberonCore», если специально не оговорено иное.
Администрация не несет ответственности за мнения, стиль и достоверность высказываний участников, равно как и за безопасность материалов, предоставляемых участниками во вложениях.
Без разрешения участников и ссылки на конференцию «OberonCore» любое воспроизведение и/или копирование высказываний полностью и/или по частям запрещено.
Powered by phpBB® Forum Software © phpBB Group
Русская поддержка phpBB