Выполнять операции в памяти, минуя жесткий диск, не всегда быстрее

в 11:44, , рубрики: hdd, linux, memory, ram, windows, выполнение операций, Железо, обращения к диску, ОЗУ, операционные системы, Программирование, тестирование, метки: , , , , , ,

image
Среди разработчиков и обывателей бытует распространенное мнение, что сокращение количества запросов к жесткому диску и выполнение максимального количества операций в памяти ведет к ускорению работы ПО. Распространение такого явления как Big Data, сделало одним из наиболее популярных методов экономии времени для программистов выполнение операций исключительно в оперативной памяти. Однако, новые исследования оспаривают общепринятое мнение о том, что любые операции выполняются быстрее в оперативной памяти, чем при наличии обращений к жесткому диску во время работы.

Общепринятое мнение оспаривает документ под названием «When In-Memory Computing is Slower than Heavy Disk Usage», опубликованный исследователями из Университета Калгари и Университета Британской Колумбии. Они протестировали предположение, согласно которому, операции всегда будут выполняться быстрее в оперативной памяти, чем при записи данных на жесткий диск. Для этого был выбран простой пример. Они сравнили альтернативные способы создания строки в 1 MB и ее записи на диск. В случае использования оперативной памяти, размер составляемой строки строго фиксирован: сначала 1, после 10, 1000, а затем 1 000 000 байт, а после результаты в виде строк были записаны на диск. Запись совершалась для каждой строки отдельно: 1 000 000 строк размером 1 байт, 100 000 строк в 10 байт и так далее.

Код, на котором выполнялось тестирование, был написан на Java и Python для двух платформ: Windows и Linux. Сравнивалось время работы только с диском, потом только с оперативной памятью и суммировалось со временем, затраченным на запись строк на жесткий диск.

Полученные систематические результаты показали, что проводить все операции исключительно в оперативной памяти, чтобы минимизировать доступ к диску, а потом единожды записать информацию, занимает намного больше времени, чем просто несколько раз совершить запись во время операции. Например, при использовании Java на обеих тестируемых платформах, чтобы сформировать 1 000 000 строк размером в 1 байт и потом разом их записать, тратится в 9 000 раз больше времени, чем если бы они были сразу последовательно записаны 1 000 000 раз на диск.

Обращение к памяти на Python отрабатывало намного быстрее чем на Java, но все равно, скорость записи всех строк в один подход осуществлялась в сотни раз медленнее, чем если бы они сразу писались по одной после формирования. Как и следовало ожидать, при сокращении необходимых «сцеплений» строк в оперативной памяти время их одномоментной записи стало приближаться ко времени, необходимому для последовательной записи на диск.

Авторы работы поясняют, что используемые для теста высокоуровневые языки делают очень много работы «за кулисами» чтобы разобраться с каскадными связями, созданием объектов и копированием строк для экономии пространства и записи дополнительных байтов данных. «Приведенное выше описание справедливо для любой непрерывной записи данных, которые после нее изменяться не будут» — говорят исследователи. С другой стороны, метод записи строк на диск был эффективнее из-за принципов работы операционной системы в плане буферизации данных, т.е. на самом деле данные пишутся на диск только когда это на самом деле необходимо.

Для того, чтобы повысить скорость работы в оперативной памяти необходимо понимать, как именно ОС и язык программирования подходят к вопросу обработки операций. Авторы смогли ускорить работу Python-кода на Linux, который обращался только к оперативной памяти, через изменение порядка связей, в частности, путем добавления новой строки в конце обрабатываемой, а не после. На работу Java-кода в целом подобные нововведения не повлияли, однако, производительность при работе с измененными данными в самой памяти значительно повысилась. Но это никак не помогло повысить производительность на ОС Windows. Кроме того, данное улучшение переставало работать, если связанная строка объявлялась глобальной переменной.

Хоть это и очень ограниченный пример, но его суть заключается в том, что разработчики не должны по умолчанию считать, что работа в оперативной памяти быстрее, чем при обращениях к жесткому диску. Для того, чтобы знать наверняка, будет ли операция выполняться быстрее при использовании только оперативной памяти, разработчики должны хорошо знать принципы лежащие в основе работы языка и ОС в подобных случаях. Как пишут сами авторы, их исследование оправдывает необходимость:

  1. Пересмотра алгоритмов работы с памятью на системном уровне;
  2. Более серьезной подготовки разработчиков в плане знания тонкостей работы ПО на системном уровне.

Это повысит перспективы оперативной памяти и поможет лучше использовать ее потенциал.

Автор: ragequit

Источник


https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js