OberonCore
https://forum.oberoncore.ru/

Абстракция Files.File и её реализации
https://forum.oberoncore.ru/viewtopic.php?f=23&t=4214
Страница 3 из 3

Автор:  Пётр Кушнир [ Четверг, 17 Январь, 2013 22:34 ]
Заголовок сообщения:  Re: Абстракция Files.File и её реализации

Илья Ермаков писал(а):
Пётр, возьмите книги Рихтера - там WinApi в плане работы с памятью и прочей системщиной отлично описано.

Почитал. В любом случае, не хотелось бы велосипедить.

Автор:  ilovb [ Четверг, 17 Январь, 2013 23:13 ]
Заголовок сообщения:  Re: Абстракция Files.File и её реализации

Обсуждение размера буфера ("Эзотерика и Флуд"(c) Пётр Кушнир) уехало сюда:
http://oberspace.dyndns.org/index.php/topic,431.0.html

2 Иван Денисов
А MFiles из Оберона тебе не подойдет?

Вложения:
ProjectOberon.V4.tar [750 КБ]
Скачиваний: 179

Автор:  Евгений Темиргалеев [ Пятница, 18 Январь, 2013 02:42 ]
Заголовок сообщения:  Re: Абстракция Files.File и её реализации

Удалены (п. 3.3) три оффтоп-сообщения (п. 2.3).

Автор:  Пётр Кушнир [ Четверг, 22 Август, 2013 21:47 ]
Заголовок сообщения:  Re: Абстракция Files.File и её реализации

Только что реализовал модуль, который предоставляет возможность записи в untagged массивы информации посредством интерфейса Files.
В реализации я использовал известную схему с блочным выделением памяти, которая затем объединяется в общий массив. Эта схема, которую реализовал Иван Горячев в модуле StringsXml. Насколько я понял, это довольно эффективная схема.

Переложив схему на untagged байтовые массивы, я реализовал динамический массив байтов, а затем над ним описал файловую абстракцию. При этом блоки untagged массивов кэшируются в локальном буфере и повторно используются для работы, при необходимости. Проделал я это для того, чтобы удобно хранить в памяти порядка 30 мегабайт информации (граф), которая после создания в обычном режиме начинала замедлять работу ББ в целом.

Сейчас я написал тестовый бенчмарк, который показал странные вещи.
Тест простейший - пишем сто мегабайт в файл, а затем читаем побайтово. Проведя этот тест на только что реализованных файлах в памяти, и на стандартной реализации файлов, записываемых на диск я обнаружил, что запись и чтение с диска проходят быстрее (для 100 мегабайт - примерно в два раза быстрее), чем для файлов в памяти.
Возможно, я что-то сделал не так? Я рассчитывал на ускорение хотя бы на порядок. Очень странно. Причём, на скорость не влияет размер выделяемого блока памяти. А ещё, результат не зависит от того, выделяется ли блок памяти впервые, или же он выдаётся из буфера готовых блоков, такое впечатление, что упирается всё в скорость записи в память каждого байта.

Исходные файлы можно взять в репе, модуль ypkObxDataBlob содержит бенчмарк.
Если что, у меня SSD-диск, но не думаю, что он быстрее оперативной памяти :)
upd: проверил на обычном HDD, никакой разницы, запись/чтение ста мегабайт на диск в два раза быстрее записи в память.

Неужели это настолько тяжелая операция для ядра ББ? :?

Автор:  ilovb [ Четверг, 22 Август, 2013 22:24 ]
Заголовок сообщения:  Re: Абстракция Files.File и её реализации

А что показывает профилировщик?

ps Скомпилить не смог, т.к. после поиска и установки 2 отсутствующих подсистем у меня кончилось терпение

Автор:  Илья Ермаков [ Четверг, 22 Август, 2013 23:00 ]
Заголовок сообщения:  Re: Абстракция Files.File и её реализации

Попробуйте ДО бенчмарка сделать запись, а потом поставить writer на начало, начать бенчмаркать и записать поверх уже выделенной памяти ещё раз.
Хотя бы поймёте, тратится время на первичное выделение - или на запись.

А сколько мс выполняется тест? Если меньше 50, то вообще доверять нельзя - это погрешность измерения времени...
Сделайте основной цикл, который делает рабочий тест раз 10 - когда будете оперировать с временами порядка тысяч мс, то уже можно сравнивать.
Вообще, для чистоты надо использовать WinApi.GetThreadTimes - сколько потрачено процессорного времени вашим потоком. А по системному времени. Может, на ваш процесс за это время пришлось процентов 20...

Автор:  Пётр Кушнир [ Четверг, 22 Август, 2013 23:07 ]
Заголовок сообщения:  Re: Абстракция Files.File и её реализации

Сто мегабайт записываются три секунды в память и две секунды на диск.
Код:
в память 104857600 3.105
на диск 104857600 1.981

Автор:  Пётр Кушнир [ Четверг, 22 Август, 2013 23:11 ]
Заголовок сообщения:  Re: Абстракция Files.File и её реализации

Илья Ермаков писал(а):
Попробуйте ДО бенчмарка сделать запись, а потом поставить writer на начало, начать бенчмаркать и записать поверх уже выделенной памяти ещё раз.
Хотя бы поймёте, тратится время на первичное выделение - или на запись.

Это я проверил, когда настраивал размер выделяемого блока - начиная с какого-то размера блока время записи не изменялось (до второго знака после запятой) даже при повторном использовании блоков.

Автор:  Роман М. [ Четверг, 22 Август, 2013 23:21 ]
Заголовок сообщения:  Re: Абстракция Files.File и её реализации

Может, виноваты излишние движения блоков памяти туда-обратно?

Автор:  Пётр Кушнир [ Четверг, 22 Август, 2013 23:22 ]
Заголовок сообщения:  Re: Абстракция Files.File и её реализации

После изучения кода HostFiles я увидел, что там у записывателя есть простой буфер на статических массивах и рекордах. Поменяв у себя некоторые типы мне удалось примерно уравнять время записи в память и в обычный файл, десятые части секунды можно списать на более сложную структуру буфера. При этом тэг untagged никакого влияния на скорость не оказывает. Но это всё равно медленно.

Автор:  Илья Ермаков [ Четверг, 22 Август, 2013 23:57 ]
Заголовок сообщения:  Re: Абстракция Files.File и её реализации

На самом деле, у Вас тест c 100 миллионами WriteByte(..).
Соответственно, Вы меряете цену 10 миллионов вызовов процедуры, помноженные на число внутренних вызовов и всякой кухни.
А не скорость доступа к памяти.
Потестируйте запись хотя бы блоками по 100 байт, через WriteBytes.

Автор:  Пётр Кушнир [ Пятница, 23 Август, 2013 00:30 ]
Заголовок сообщения:  Re: Абстракция Files.File и её реализации

В общем, ситуацию с побайтовой записью/чтением решить не удалось, слишком высокие накладные расходы на запись одного байта (но HostFiles всё равно быстрее за счёт статического буфера в самом записывателе).
Опытным путём выяснил, что запись в память начинает себя оправдывать с точки зрения быстродействия при блочной записи с помощью копирования средствами SYSTEM. При этом untagged никак себя не проявляет, разве что её сборщик мусора не трогает. При этом, на тестовом объёме в гигабайт при оптимальном размере записываемого в процессе тестирования блока (4 килобайта) уже начинает оказывать влияние объём выделяемого блока.
Цитата:

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

8
104857600 0.468
104857600 0.655
64
104857600 0.109
104857600 0.328
512
104857600 0.047
104857600 0.296
4096
104857600 0.062
104857600 0.296
32768
104857600 0.062
104857600 0.281
262144
104857600 0.063
104857600 0.281

Эксперименты с RAM-диском в принципе подтверждают, что запись идёт с максимальной скоростью гигабайт в секунду. ББ может закидать гигабайт в выделенные структуры за 0,2 сек, но для их выделения в первый раз потребуется три секунды.
Собственно, вся проблема заключалась в высоких накладных расходах для записывания байта информации напрямую в блок памяти. Получается, надо создать самые простейшие буферы в самих Reader/Writer, размером в 4 килобайта, и читать/писать по 4 килобайта сразу, а затем внутри этого простейшего буфера работать. По сути, повторить схему из HostFiles.
Всё уже придумали за меня :)

Автор:  ilovb [ Пятница, 23 Август, 2013 08:42 ]
Заголовок сообщения:  Re: Абстракция Files.File и её реализации

Изображение
Это о реализации MFiles...

Автор:  Пётр Кушнир [ Пятница, 23 Август, 2013 10:30 ]
Заголовок сообщения:  Re: Абстракция Files.File и её реализации

По результатам вчерашних экспериментов перенёс код бегунков из HostFiles с минимальными правками. Наверное, этот код со временем можно вообще выделить в отдельный модуль, раз уж он так хорошо проработан.

Страница 3 из 3 Часовой пояс: UTC + 3 часа
Powered by phpBB® Forum Software © phpBB Group
https://www.phpbb.com/