размер буфера
Вот у нас есть программа к примеру....
#include <stdio.h>
#include <errno.h>
#define BUF_SIZE 256
int main (int argc, char *argv [])
{
FILE *in_file, *out_file;
char rec [BUF_SIZE];
size_t bytes_in, bytes_out;
if (argc != 3) {
printf ("Usage: cpC file1 file2\n");
return 1;
}
in_file = fopen (argv [1], "rb");
if (in_file == NULL) {
perror (argv [1]);
return 2;
}
out_file = fopen (argv [2], "wb");
if (out_file == NULL) {
perror (argv [2]);
return 3;
}
/* Process the input file a record at a time. */
while ((bytes_in = fread (rec, 1, BUF_SIZE, in_file)) > 0) {
bytes_out = fwrite (rec, 1, bytes_in, out_file);
if (bytes_out != bytes_in) {
perror ("Fatal write error.");
return 4;
}
}
fclose (in_file);
fclose (out_file);
return 0;
}
Объясните мне пож почему BUF_SIZE 256 а не скажем 4096, и от чего это зависит
хз.... может из-за размера класстера.... если мне память не изменяет он 512...
Можно указать любое число (по крайней мере по данному коду это вроде так), поэксперементируйте со значениями.
Код:
size_t fread ( void * ptr, [COLOR="Red"]size_t size, size_t count[/COLOR], FILE * stream );
Об этом говорит не только Кнут, но и все профессиональные программисты. Ибо спецпроги найдут уязвимые места получше программиста. А вот что ты хотел сказать про размер элемента и их число, я не понял) Причем здесь понятность кода?
А вообще это было для красного словца, не было другого примера в голове. Пиво там. Завтра в оптуск.
Если обратиться к нативе апе то чтение и запись в файл осущ с помощью системных вызовов
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 этой программы?
Размер кластера, если не ошибаюсь, можно узнать (есть соответствующие функции API).
Цитата: cheburator
Стандартный размер сектора диска всегда был 512 байт. А вот размер кластера - величина изменчивая, зависящая от файловой системы.
Размер кластера, если не ошибаюсь, можно узнать (есть соответствующие функции API).
Размер кластера, если не ошибаюсь, можно узнать (есть соответствующие функции API).
Спосибо конечно за напоминание, это мне известно, но здесь никто про сектора дисков не говорил. Конечно можно сначало узнать размер кластера файловой системы, а потом такого размера делать буфер сложно вато конечно но можно. Но вопрос не в этом. Будет это оптимально создавать буфер кратный кластеру файловой системы? Или лучше создать больший буфер? А если больший то насколько?
...............
Спосибо конечно за напоминание, это мне известно, но здесь никто про сектора дисков не говорил. [/quote]
Правильно, про сектора никто не говорил - почему-то все говорят про "кластеры", которые с точки зрения программы к логике процесса чтения/записи диска не относятся. Ведь даже на чистом асме под ДОС обращение к диску происходит по секторам (int 13h и int 25h/26h)
А для IBM-PC совместимых машин размер кластера может быть только больше, чем 512. Учите матчасть.
А цифирь эта взята "с потолка". Правда, с учётом скорости диска, заполнение одного большого буфера выполняется быстрее, чем несколько раз - мелкого.
И стековые буфера вообще лучше не использовать - стек не безразмерный, чтоб его захламлять. Кроме того, работа программы быстрее от этого не станет - функци чтения всё равно, от какой области памяти адрес будет.