Когда рекомендуется вручную интернировать строки в коде .Net? - PullRequest
4 голосов
/ 13 ноября 2010

Ссылка здесь: http://msdn.microsoft.com/en-us/library/system.string.intern.aspx

Похоже, что это выполняется автоматически компилятором, но также может быть сделано вручную.Пожалуйста, поправьте меня, если я ошибаюсь, и пролите немного света на это.Имеет ли значение, является ли язык C #, VB.Net, C ++ / CLI, другой?

Спасибо.

Ответы [ 3 ]

5 голосов
/ 14 ноября 2010

Я сделал это код десериализации / материализации, когда есть хороший шанс повторных значений (почти перечисление, но не совсем).При десериализации тысяч записей это может дать значительное преимущество памяти.Однако в таких случаях вы можете предпочесть использовать отдельный внутренний кэш, чтобы избежать насыщения общего (или, может быть, общего, все в порядке; это зависит от сценария).Ключевым моментом здесь является: сценарий, в котором вы, вероятно, будете иметь множество разных экземпляров строк с одинаковым значением.Десериализация является большим кандидатом там.Следует также отметить, что при проверке встроенного кэша наблюдаются некоторые накладные расходы процессора (постепенно увеличиваются накладные расходы при добавлении данных), поэтому это следует делать, если есть вероятность, что созданные объекты будут жить дольше, чем gen-0;если они всегда будут собираться быстро в любом случае , тогда не стоит менять их на интернированные версии.

2 голосов
/ 13 ноября 2010

Это хорошая идея, когда профилирование показывает, что оно дает выигрыш в производительности.

1 голос
/ 13 ноября 2010

Это делается во время выполнения, но язык может вводить свой собственный тип строки с другим поведением.Это делается только для буквенных строк.Если вы хотите интернировать динамически созданные строки, вы можете сделать это.С одной стороны, это делает сравнение строк действительно простым, но имейте в виду, что в то время как некоторые операции выиграют от интернирования, другие не будут.Например, интернированные строки не освобождаются до завершения процесса (поскольку они основаны на внутренней структуре, см. Подробности в этом вопросе ), поэтому, если вы интернируете много строк вручную, процесс будет переносить многообъем памяти.

...