Сообщение Re[2]: быстрый new/delete от 29.11.2022 23:55
Изменено 29.11.2022 23:56 maks1180
Re[2]: быстрый new/delete
УК>а вообще верхний предел количества аллоцируемых объектов?
Пока планируется до 1 млн объектов, если комп будет больше тянуть, то нужно будет больше.
УК>например если их максимум 128к одновременно живых и хочется странного, то заводится фиксированный буфер на 128к объектов, и битовая карта, где бит — свободен объект или нет.
УК>аллокация — поиск первого нулевого бита в битовой карте (и устанавливаем его в единицу, ессно) и возврат индекса этого бита, помноженного на размер объекта
УК>деалокация — получаем индекс объекта в буфере (разность указателя на объект и указателя на начало буфера) и устанавливаем бит с этим индексом в 0
УК>128к бит это 16к байт, целиком влезет в кеш L1 и сканироваться (аллоцировать один объект) будет за десяток наносекунд
Я примерно так и сделал только:
— разбил на страницы по 1-64k объектов, и помечал сколько в ней пустот осталось, если 0 то её не сканирую.
— записываю адрес последного free блока в каждой странице, что-бы его отдать первым без сканирования
— сохраняю место последнее найденого блока, что-бы следующее сканирования начинать с этого места
Всё равно результат лучше чем libc, но не намного.
Пока планируется до 1 млн объектов, если комп будет больше тянуть, то нужно будет больше.
УК>например если их максимум 128к одновременно живых и хочется странного, то заводится фиксированный буфер на 128к объектов, и битовая карта, где бит — свободен объект или нет.
УК>аллокация — поиск первого нулевого бита в битовой карте (и устанавливаем его в единицу, ессно) и возврат индекса этого бита, помноженного на размер объекта
УК>деалокация — получаем индекс объекта в буфере (разность указателя на объект и указателя на начало буфера) и устанавливаем бит с этим индексом в 0
УК>128к бит это 16к байт, целиком влезет в кеш L1 и сканироваться (аллоцировать один объект) будет за десяток наносекунд
Я примерно так и сделал только:
— разбил на страницы по 1-64k объектов, и помечал сколько в ней пустот осталось, если 0 то её не сканирую.
— записываю адрес последного free блока в каждой странице, что-бы его отдать первым без сканирования
— сохраняю место последнее найденого блока, что-бы следующее сканирования начинать с этого места
Всё равно результат лучше чем libc, но не намного.
Re[2]: быстрый new/delete
УК>а вообще верхний предел количества аллоцируемых объектов?
Пока планируется до 1 млн объектов, если комп будет больше тянуть, то нужно будет больше.
УК>например если их максимум 128к одновременно живых и хочется странного, то заводится фиксированный буфер на 128к объектов, и битовая карта, где бит — свободен объект или нет.
УК>аллокация — поиск первого нулевого бита в битовой карте (и устанавливаем его в единицу, ессно) и возврат индекса этого бита, помноженного на размер объекта
УК>деалокация — получаем индекс объекта в буфере (разность указателя на объект и указателя на начало буфера) и устанавливаем бит с этим индексом в 0
УК>128к бит это 16к байт, целиком влезет в кеш L1 и сканироваться (аллоцировать один объект) будет за десяток наносекунд
Я примерно так и сделал только:
— разбил на страницы по 1-64k объектов, и помечал сколько в ней пустот осталось, если 0 то её не сканирую.
— записываю адрес последного free блока в каждой странице, что-бы его отдать первым без сканирования
— сохраняю место последнее найденого блока, что-бы следующее сканирования начинать с этого места
Всё равно результат лучше чем glibc, но не намного.
Пока планируется до 1 млн объектов, если комп будет больше тянуть, то нужно будет больше.
УК>например если их максимум 128к одновременно живых и хочется странного, то заводится фиксированный буфер на 128к объектов, и битовая карта, где бит — свободен объект или нет.
УК>аллокация — поиск первого нулевого бита в битовой карте (и устанавливаем его в единицу, ессно) и возврат индекса этого бита, помноженного на размер объекта
УК>деалокация — получаем индекс объекта в буфере (разность указателя на объект и указателя на начало буфера) и устанавливаем бит с этим индексом в 0
УК>128к бит это 16к байт, целиком влезет в кеш L1 и сканироваться (аллоцировать один объект) будет за десяток наносекунд
Я примерно так и сделал только:
— разбил на страницы по 1-64k объектов, и помечал сколько в ней пустот осталось, если 0 то её не сканирую.
— записываю адрес последного free блока в каждой странице, что-бы его отдать первым без сканирования
— сохраняю место последнее найденого блока, что-бы следующее сканирования начинать с этого места
Всё равно результат лучше чем glibc, но не намного.