До того, как кто-либо под сомнение факт использования String.intern ()
вообще, позвольте мне сказать, что мне нужно в моем Особое приложение для памяти и причины производительности. [1]
Итак, до сих пор я использовал String.innern ()
и предполагается, что это самый эффективный способ сделать это. Тем не менее, я заметил, так как века это узкое место в программном обеспечении. [2]
Тогда совсем недавно я пытался заменить String.ink ()
на огромной карте, где я кладу / получаю строки, чтобы получить каждый раз уникальный экземпляр. Я ожидал, что это будет медленнее ... Но это было совсем наоборот! Это было чрезвычайно быстрее! Замена стажера
, нажав / избирающуюся на карту (которая достигает точно так же), привело к более чем на один порядок.
Вопрос: почему стажировка ()
Так медленно?!? Почему не просто не поддерживается картой (или на самом деле, просто настроенный набор) и был бы чрезвычайно быстрее? Я озадачен.
[1]: Для неубежденных: он находится в обработке естественного языка и должен обрабатывать гигабайты текста, поэтому необходимо избегать многих экземпляров одной и той же строки, чтобы избежать взрыва памяти и сравнения связного строки, чтобы быть достаточно быстрым.
[2]: Без него (нормальные строки) Невозможно, с ним невозможно, этот конкретный шаг остается максимальной вычисляющей интенсивной
редактированием:
из-за удивительного интереса к этому посту, вот какой-то код для тестирования OUT:
и результаты взаимопонимания чуть более 1 миллиона строк:
hashmap
: 4 секунды String.intern ()
: 54 секунды Из-за того, чтобы избежать какого-либо разминки / ОС кэширования IO и прочее, как это, эксперимент повторяли путем инвертирования порядка обоих тестов:
String.intern ()
: 69 секунд Hashmap
: 3 секунды Как вы видите, разница очень заметна, более чем в десять раз. (Используя OpenJDK 1.6.0_22 64бит ... Но с использованием солнца, привело к аналогичным результатам, которые я думаю)