Почему ringe.innern () так медленно?

До того, как кто-либо под сомнение факт использования String.intern () вообще, позвольте мне сказать, что мне нужно в моем Особое приложение для памяти и причины производительности. [1]

Итак, до сих пор я использовал String.innern () и предполагается, что это самый эффективный способ сделать это. Тем не менее, я заметил, так как века это узкое место в программном обеспечении. [2]

Тогда совсем недавно я пытался заменить String.ink () на огромной карте, где я кладу / получаю строки, чтобы получить каждый раз уникальный экземпляр. Я ожидал, что это будет медленнее ... Но это было совсем наоборот! Это было чрезвычайно быстрее! Замена стажера , нажав / избирающуюся на карту (которая достигает точно так же), привело к более чем на один порядок.

Вопрос: почему стажировка () Так медленно?!? Почему не просто не поддерживается картой (или на самом деле, просто настроенный набор) и был бы чрезвычайно быстрее? Я озадачен.

[1]: Для неубежденных: он находится в обработке естественного языка и должен обрабатывать гигабайты текста, поэтому необходимо избегать многих экземпляров одной и той же строки, чтобы избежать взрыва памяти и сравнения связного строки, чтобы быть достаточно быстрым.

[2]: Без него (нормальные строки) Невозможно, с ним невозможно, этот конкретный шаг остается максимальной вычисляющей интенсивной

редактированием:

из-за удивительного интереса к этому посту, вот какой-то код для тестирования OUT:

http://pastebin.com/4cd8ac69

и результаты взаимопонимания чуть более 1 миллиона строк:

  • hashmap : 4 секунды
  • String.intern () : 54 секунды

Из-за того, чтобы избежать какого-либо разминки / ОС кэширования IO и прочее, как это, эксперимент повторяли путем инвертирования порядка обоих тестов:

  • String.intern () : 69 секунд
  • Hashmap : 3 секунды

Как вы видите, разница очень заметна, более чем в десять раз. (Используя OpenJDK 1.6.0_22 64бит ... Но с использованием солнца, привело к аналогичным результатам, которые я думаю)

33
задан dagnelies 2 September 2011 в 18:15
поделиться