боремся за память, 15-20 миллионов строк отжирают полтора гига. Уникальных - в пределах десятка тысяч. Предполагаем строки использовать примерно так:
string StringPool.GetOrAdd(string key).
За - память сохраним.
Против - перфоманс пострадает, очевидно. Возможно, придется еще и лок ставить, если адаптируем решение к мультипоточности.
Системный String.Intern не берем, т.к. оно строки хранит до выгрузки CLR, что неприемлемо.
вы что-то переводите в строки или они сами по себе как-то существуют?
строки задают своего рода пути. Так сложилось исторически, менять это - значит погружаться в куда более плотный рефакторинг, нежели интернация строк.
А откуда берётся много одинаковых строк?
много одинаковых "путей" у разных объектов :)
Они через stringfotlrmat создаются?
погляжу, но мы все-таки совсем не туда удалились. Я хотел бы знать про стринг пулы, нет ли у них роковых недостатков, о которых все в курсе, кроме меня?
Особых вариантов не много
На самом деле достаточно туда, так как мне вот в голову приходит InterpolatedStringHandler, который будет билдить строку через какойнибудь ArrayPool<char>, потом сразу же смотреть строку в пуле и, если что, возвращать её
Точнее, идея в том, чтобы не создавать строку, а считать хеш по получившимся чарам и создавать строку только в случае, если её нет в пуле
В основном string.Format, но есть и Concat и просто +. Да, аллокации лишнии здесь возможны, но все-таки основное - что бы они хотя бы прибивались, а не плодили копии в памяти.
Если делать пул, то непонятно как удалять оттуда объекты
~10к можно и хранить
Они что ли статические?
Обсуждают сегодня