OberonCore

Библиотека  Wiki  Форум  BlackBox  Компоненты  Проекты
Текущее время: Вторник, 19 Март, 2024 13:18

Часовой пояс: UTC + 3 часа




Начать новую тему Ответить на тему  [ Сообщений: 54 ]  На страницу Пред.  1, 2, 3
Автор Сообщение
СообщениеДобавлено: Четверг, 17 Январь, 2013 22:34 

Зарегистрирован: Вторник, 29 Август, 2006 12:32
Сообщения: 2662
Откуда: Россия, Ярославль
Илья Ермаков писал(а):
Пётр, возьмите книги Рихтера - там WinApi в плане работы с памятью и прочей системщиной отлично описано.

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


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Четверг, 17 Январь, 2013 23:13 

Зарегистрирован: Вторник, 30 Июнь, 2009 14:58
Сообщения: 1549
Обсуждение размера буфера ("Эзотерика и Флуд"(c) Пётр Кушнир) уехало сюда:
http://oberspace.dyndns.org/index.php/topic,431.0.html

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


Вложения:
ProjectOberon.V4.tar [750 КБ]
Скачиваний: 423
Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Пятница, 18 Январь, 2013 02:42 
Модератор
Аватара пользователя

Зарегистрирован: Среда, 16 Ноябрь, 2005 00:53
Сообщения: 4625
Откуда: Россия, Орёл
Удалены (п. 3.3) три оффтоп-сообщения (п. 2.3).


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Четверг, 22 Август, 2013 21:47 

Зарегистрирован: Вторник, 29 Август, 2006 12:32
Сообщения: 2662
Откуда: Россия, Ярославль
Только что реализовал модуль, который предоставляет возможность записи в untagged массивы информации посредством интерфейса Files.
В реализации я использовал известную схему с блочным выделением памяти, которая затем объединяется в общий массив. Эта схема, которую реализовал Иван Горячев в модуле StringsXml. Насколько я понял, это довольно эффективная схема.

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

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

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

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


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Четверг, 22 Август, 2013 22:24 

Зарегистрирован: Вторник, 30 Июнь, 2009 14:58
Сообщения: 1549
А что показывает профилировщик?

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


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Четверг, 22 Август, 2013 23:00 
Модератор
Аватара пользователя

Зарегистрирован: Понедельник, 14 Ноябрь, 2005 18:39
Сообщения: 9459
Откуда: Россия, Орёл
Попробуйте ДО бенчмарка сделать запись, а потом поставить writer на начало, начать бенчмаркать и записать поверх уже выделенной памяти ещё раз.
Хотя бы поймёте, тратится время на первичное выделение - или на запись.

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


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Четверг, 22 Август, 2013 23:07 

Зарегистрирован: Вторник, 29 Август, 2006 12:32
Сообщения: 2662
Откуда: Россия, Ярославль
Сто мегабайт записываются три секунды в память и две секунды на диск.
Код:
в память 104857600 3.105
на диск 104857600 1.981


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Четверг, 22 Август, 2013 23:11 

Зарегистрирован: Вторник, 29 Август, 2006 12:32
Сообщения: 2662
Откуда: Россия, Ярославль
Илья Ермаков писал(а):
Попробуйте ДО бенчмарка сделать запись, а потом поставить writer на начало, начать бенчмаркать и записать поверх уже выделенной памяти ещё раз.
Хотя бы поймёте, тратится время на первичное выделение - или на запись.

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


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Четверг, 22 Август, 2013 23:21 

Зарегистрирован: Пятница, 25 Сентябрь, 2009 13:10
Сообщения: 1177
Откуда: Мариуполь
Может, виноваты излишние движения блоков памяти туда-обратно?


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Четверг, 22 Август, 2013 23:22 

Зарегистрирован: Вторник, 29 Август, 2006 12:32
Сообщения: 2662
Откуда: Россия, Ярославль
После изучения кода HostFiles я увидел, что там у записывателя есть простой буфер на статических массивах и рекордах. Поменяв у себя некоторые типы мне удалось примерно уравнять время записи в память и в обычный файл, десятые части секунды можно списать на более сложную структуру буфера. При этом тэг untagged никакого влияния на скорость не оказывает. Но это всё равно медленно.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Четверг, 22 Август, 2013 23:57 
Модератор
Аватара пользователя

Зарегистрирован: Понедельник, 14 Ноябрь, 2005 18:39
Сообщения: 9459
Откуда: Россия, Орёл
На самом деле, у Вас тест c 100 миллионами WriteByte(..).
Соответственно, Вы меряете цену 10 миллионов вызовов процедуры, помноженные на число внутренних вызовов и всякой кухни.
А не скорость доступа к памяти.
Потестируйте запись хотя бы блоками по 100 байт, через WriteBytes.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Пятница, 23 Август, 2013 00:30 

Зарегистрирован: Вторник, 29 Август, 2006 12:32
Сообщения: 2662
Откуда: Россия, Ярославль
В общем, ситуацию с побайтовой записью/чтением решить не удалось, слишком высокие накладные расходы на запись одного байта (но 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.
Всё уже придумали за меня :)


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Пятница, 23 Август, 2013 08:42 

Зарегистрирован: Вторник, 30 Июнь, 2009 14:58
Сообщения: 1549
Изображение
Это о реализации MFiles...


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Пятница, 23 Август, 2013 10:30 

Зарегистрирован: Вторник, 29 Август, 2006 12:32
Сообщения: 2662
Откуда: Россия, Ярославль
По результатам вчерашних экспериментов перенёс код бегунков из HostFiles с минимальными правками. Наверное, этот код со временем можно вообще выделить в отдельный модуль, раз уж он так хорошо проработан.


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 54 ]  На страницу Пред.  1, 2, 3

Часовой пояс: UTC + 3 часа


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 3


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
cron
Вся информация, размещаемая участниками на конференции (тексты сообщений, вложения и пр.) © 2005-2024, участники конференции «OberonCore», если специально не оговорено иное.
Администрация не несет ответственности за мнения, стиль и достоверность высказываний участников, равно как и за безопасность материалов, предоставляемых участниками во вложениях.
Без разрешения участников и ссылки на конференцию «OberonCore» любое воспроизведение и/или копирование высказываний полностью и/или по частям запрещено.
Powered by phpBB® Forum Software © phpBB Group
Русская поддержка phpBB