Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Вопрос-Ответ Новый топик    Ответить
 Наивный вопрос про чтение с диска  [new]
Иван FXS
Member

Откуда:
Сообщений: 1690
Если мы пишем код, который предназначен для работы на компьютере с дисковым устройством памяти, то следует ли нам исходить из того, что алгоритм чтения большого файла "задом наперёд" (от конца к началу) будет работать многократно медленнее, чем алгоритм чтения его обычным порядком (от начала к концу)?
12 янв 18, 15:38    [21101953]     Ответить | Цитировать Сообщить модератору
 Re: Наивный вопрос про чтение с диска  [new]
exp98
Member

Откуда:
Сообщений: 1282
Вообще, сложный вопрос, если точно не знать. Лично я не уверен. Моя мысль в том, что время Т= постоянная часть + диск/флешка + операционка + оперативка + процессорные кеши.

Уж точно завист, какими порциям читать непосредственно в проге. Если по 1б, то вообще вряд ли. Учитывая предикции диска, а также кеширования его же в т.ч. и на уровне операционки, разница будет зависеть в основном как кладётся в память проге. В ассемблере непрерывный цикл типа 3-х встроенных команд ~LOOP, в си ~memcopy(). Ну да, вперёд кладёт быстро, в обратом порядке - уж и не знаю, есть ли в ассемблере обратный цикл?
12 янв 18, 18:12    [21102637]     Ответить | Цитировать Сообщить модератору
 Re: Наивный вопрос про чтение с диска  [new]
White Owl
Member

Откуда:
Сообщений: 12217
include <stdio.h>
#include <sys/types.h>
#include <unistd.h>

int main (int argc, char **argv) {
  int fd;
  char ch;
  size_t total_read;
  time_t time_start;

  time_start = time(0);
  fd =  = open(argv[1], O_RDONLY);
  total_read= 0;
  while (read(fd, &ch, 1)) {
     total_read++;
  }
  close(fd);
  printf("Read %ld bytes in %dms\n", total_read, time(0)-time_start);

  time_start = time(0);
  fd =  = open(argv[1], O_RDONLY);
  lseek(fd, SEEK_END, 0);
  total_read= 0;
  do {
     read(fd, &ch, 1);
     total_read++;
  } until (lseek(fd, SEEK_CUR, -2) != EINVAL);
  close(fd);
  printf("Back read %ld bytes in %dms\n", total_read, time(0)-time_start);

  retuirn 0;
}

Скомпилируй, дай на вход большой файл и смотри результат.
12 янв 18, 19:05    [21102798]     Ответить | Цитировать Сообщить модератору
 Re: Наивный вопрос про чтение с диска  [new]
Akina
Member

Откуда: Зеленоград, Москва, Россия
Сообщений: 17140
Иван FXS, представь себе, что мы принудительно записали файл на носитель физически строго в обратном порядке - последний кластер, за ним предпоследний, за ним ... , и, наконец, первый...
12 янв 18, 20:38    [21103096]     Ответить | Цитировать Сообщить модератору
 Re: Наивный вопрос про чтение с диска  [new]
Иван FXS
Member

Откуда:
Сообщений: 1690
Akina,

представил. Что я должен был понять или почувствовать?
12 янв 18, 21:18    [21103201]     Ответить | Цитировать Сообщить модератору
 Re: Наивный вопрос про чтение с диска  [new]
Иван FXS
Member

Откуда:
Сообщений: 1690
Akina, когда я писал "от конца к началу", то имел в виду "от того конца, которым мы закончили запись этого файла на диск, к тому началу, с которого мы начинали запись этого файла на диск".
12 янв 18, 21:40    [21103288]     Ответить | Цитировать Сообщить модератору
 Re: Наивный вопрос про чтение с диска  [new]
Siemargl
Member

Откуда: 010100
Сообщений: 5487
Иван FXS
Если мы пишем код, который предназначен для работы на компьютере с дисковым устройством памяти, то следует ли нам исходить из того, что алгоритм чтения большого файла "задом наперёд" (от конца к началу) будет работать многократно медленнее, чем алгоритм чтения его обычным порядком (от начала к концу)?
да
12 янв 18, 22:11    [21103416]     Ответить | Цитировать Сообщить модератору
 Re: Наивный вопрос про чтение с диска  [new]
Akina
Member

Откуда: Зеленоград, Москва, Россия
Сообщений: 17140
Иван FXS, нет никакой разницы. Не парься. Ибо между получаемым в программу телом файла и байтами на диске лежат минимум три разные подсистемы (контроллер накопителя, драйвер доступа к устройству, драйвер доступа к файловой системе), и каждая со своим кэшем, и в каждой в той или иной форме есть предчтение. Даже при прямом доступе к диску как устройству, а не файловой системе, разница если ловится - то исключительно на уровне различия скоростей чтения разных цилиндров, да и то при условии, что реальная геометрия хотя как-то соответствует транслируемой, что встречается всё реже. К тому же время чтения и время перехода на дорожку отличается в разы, и не в пользу последней, так что при не-линейном чтении фиг ты эту разницу поймаешь...
А об SSD, сетевых дисках и флешках я даже не заикаюсь.
12 янв 18, 23:26    [21103581]     Ответить | Цитировать Сообщить модератору
 Re: Наивный вопрос про чтение с диска  [new]
Akina
Member

Откуда: Зеленоград, Москва, Россия
Сообщений: 17140
Иван FXS
когда я писал "от конца к началу", то имел в виду "от того конца, которым мы закончили запись этого файла на диск, к тому началу, с которого мы начинали запись этого файла на диск".
Это ты к тому, что конец файла с гораздо большей вероятностью ещё не вымылся из кэша?
12 янв 18, 23:26    [21103583]     Ответить | Цитировать Сообщить модератору
 Re: Наивный вопрос про чтение с диска  [new]
Иван FXS
Member

Откуда:
Сообщений: 1690
Это было к
Akina
представь себе, что мы ... записали файл ... в обратном порядке - последний кластер, за ним предпоследний, за ним ... , и, наконец, первый.

-- с точки зрения моего вопроса тут "последний кластер" будет началом, а "первый" -- концом.

А в каких нибудь языках программирования, интересно, команды чтения из фала вообще имеют опцию "направление" -- чтобы можно было скомандовать "читай из файла Ф в буфер Б начиная с адреса А число битов Ч в направлении к началу файла"?
13 янв 18, 00:01    [21103643]     Ответить | Цитировать Сообщить модератору
 Re: Наивный вопрос про чтение с диска  [new]
Siemargl
Member

Откуда: 010100
Сообщений: 5487
Иван FXS,

Ты хоть какое нибудь понимание имеешь про блочное чтение, форвард-кеширование итп ??

А может прежде чем плодить тупые топики, озаботиться образованием ?
13 янв 18, 00:07    [21103653]     Ответить | Цитировать Сообщить модератору
 Re: Наивный вопрос про чтение с диска  [new]
Dimitry Sibiryakov
Member

Откуда:
Сообщений: 44684
Akina
в каждой в той или иной форме есть предчтение

Вот только это предчтение везде осуществляется "вперёд", а не "в направлении пользовательской последовательности блоков".
13 янв 18, 14:48    [21104239]     Ответить | Цитировать Сообщить модератору
 Re: Наивный вопрос про чтение с диска  [new]
Akina
Member

Откуда: Зеленоград, Москва, Россия
Сообщений: 17140
Dimitry Sibiryakov
Вот только это предчтение везде осуществляется "вперёд"
Неправда. Базовое предчтение осуществляется в режиме "минимальный включающий блок", что в случае дискового контроллера соответствует дорожке. Если требуемый блок находится в последнем секторе, получится предчтение к началу. Всё остальное - дополнения.
13 янв 18, 15:07    [21104275]     Ответить | Цитировать Сообщить модератору
Все форумы / Вопрос-Ответ Ответить