Форум С++

 

Ответить на сообщение

Вернуться к теме

Вы отвечаете на сообщение:

Автор: like-nix   (10.07.2007 в 12:55)
Ну если отвечать всем влом попробую продолжить свои изыскания сам ;-).
Рассматривая конкретно этот пример размер буфера можно сделать кратным как размеру буфера стандартной библиотеки (хз, можно в доках поискать, но, наверно, кратно 256), так и размеру кластера файловой системы (думаю, во всех размер кластера кратен 256). В некоторых случаях (если ОС стара и убога или ты работаешь на низком уровне) это (кратность) может оптимизировать обращения к диску, но с современных ОС считываемые с диска данные буферизуются, кажется, не менее, чем дважды (дисковый кэш, и файловый буфер стандартной библиотеки), это не считая собственного кэша HDD. Так что эта кратность особо ни на что не повлияет. Верны ли эти предположения? Тогда 256 является оптимально?

Если обратиться к нативе апе то чтение и запись в файл осущ с помощью системных вызовов
NtWriteFile
NTSYSAPI
NTSTATUS
NTAPI
NtWriteFile(
IN HANDLE FileHandle,
IN HANDLE Event OPTIONAL,
IN PIO_APC_ROUTINE ApcRoutine OPTIONAL,
IN PVOID ApcContext OPTIONAL,
OUT PIO_STATUS_BLOCK IoStatusBlock,
IN PVOID Buffer,
IN ULONG Length,
IN PLARGE_INTEGER ByteOffset OPTIONAL,
IN PULONG Key OPTIONAL
);
и
NtReadFile
NTSYSAPI
NTSTATUS
NTAPI
NtReadFile(
IN HANDLE FileHandle,
IN HANDLE Event OPTIONAL,
IN PIO_APC_ROUTINE ApcRoutine OPTIONAL,
IN PVOID ApcContext OPTIONAL,
OUT PIO_STATUS_BLOCK IoStatusBlock,
OUT PVOID Buffer,
IN ULONG Length,
IN PLARGE_INTEGER ByteOffset OPTIONAL,
IN PULONG Key OPTIONAL
);
У обоих этих вызовов есть буфер и чем меньше мы делаем этот самый буфер тем больше вызовов получаем а на кождый вызов тратится время те на файл 4000 байт с буфером чтения/запись 256 байт будет истрачено 16 выззовов а с буфером 4096 один. Теперь я думаю где предел указания буфера и нужно ли его привязывать к кратности кластера в файловой системе. Верно ли это? И как посчитать системные вызовы NtReadFile/NtWriteFile этой программы?


Ваше имя:

Пароль:

Цитировать

Используйте тэги для выделения текста:
Код: [code][/code]
Жирный: [b][/b]
Наклонный: [i][/i]
URL: [url][/url]

Сообщение:

Прикрепить: