Только что реализовал модуль, который предоставляет возможность записи в untagged массивы информации посредством интерфейса Files.
В реализации я использовал известную схему с блочным выделением памяти, которая затем объединяется в общий массив. Эта схема, которую реализовал Иван Горячев в модуле StringsXml. Насколько я понял, это довольно эффективная схема.
Переложив схему на untagged байтовые массивы, я реализовал динамический массив байтов, а затем над ним описал файловую абстракцию. При этом блоки untagged массивов кэшируются в локальном буфере и повторно используются для работы, при необходимости. Проделал я это для того, чтобы удобно хранить в памяти порядка 30 мегабайт информации (граф), которая после создания в обычном режиме начинала замедлять работу ББ в целом.
Сейчас я написал тестовый бенчмарк, который показал странные вещи.
Тест простейший - пишем сто мегабайт в файл, а затем читаем побайтово. Проведя этот тест на только что реализованных файлах в памяти, и на стандартной реализации файлов, записываемых на диск я обнаружил, что запись и чтение с диска проходят быстрее (для 100 мегабайт - примерно в два раза быстрее), чем для файлов в памяти.
Возможно, я что-то сделал не так? Я рассчитывал на ускорение хотя бы на порядок. Очень странно. Причём, на скорость не влияет размер выделяемого блока памяти. А ещё, результат не зависит от того, выделяется ли блок памяти впервые, или же он выдаётся из буфера готовых блоков, такое впечатление, что упирается всё в скорость записи в память каждого байта.
Исходные файлы можно взять в
репе, модуль ypkObxDataBlob содержит бенчмарк.
Если что, у меня SSD-диск, но не думаю, что он быстрее оперативной памяти
upd: проверил на обычном HDD, никакой разницы, запись/чтение ста мегабайт на диск в два раза быстрее записи в память.
Неужели это настолько тяжелая операция для ядра ББ?