2009-08-31 1 views
6

Если вы разбираетесь, давайте просто скажем HTML, как только вы прочтете имя элемента, будет ли полезно его ставить? Логика здесь заключается в том, что этот парсер будет анализировать одни и те же строки (имена элементов) снова и снова? И несколько документов будут проанализированы.Будет ли встроенная строка работать в парсере?

Теория:

// elemName is checked for null. 
MarkupNode node = new MarkupNode() 
{ 
    Name = String.IsInterned(elemName) ? elemName : String.Intern(elemName), 
    ... 
}; 

Этот вопрос был мотивирован вопрос string-interning-memory.

+0

Мое общее предложение к этому было бы - попробуйте сам и измерить, если это делает никакой разницы ... (хотя я знаю, что это не совсем то, что вы после ...) – Rashack

+0

@Rashack я намерен чтобы проверить его, но я также думаю, что это правильный вопрос, и я не видел непосредственно связанного вопроса, касающегося разбора текста, такого как HTML или XML-контент. :) –

ответ

2

Я не мог точно сказать, поможет ли это вашей работе или нет. Это будет зависеть от того, сколько строк вы используете, и как часто вы создаете экземпляры этих строк. Проводка обычно выполняется автоматически, поэтому явная проверка, если строка интернирована, может фактически увеличить ваши накладные расходы и снизить вашу производительность. Когда дело доходит до использования памяти, интернированные строки могут определенно использовать меньше памяти.

Если вы хотите использовать интернирование строк, есть несколько способов его достижения. Прежде всего, я бы привязал свои имена элементов в статическом классе, полном публичных строковых констант. Любой строковый литерал, найденный в исходном коде программы, определенно и автоматически интернирован. Такие строки загружаются в внутренний пул при загрузке приложения. Если ваши строки не могут быть определены как константы для подготовки к подготовке во время компиляции, тогда я бы просто вызвал String.Intern (...) вместо того, чтобы делать полное тернарное выражение String.IsInterned (...)? ...: String.Intern (...). Метод Intern автоматически проверяет, является ли строка интернированной, верните интернированную версию, если она есть, и в противном случае добавит строку в внутренний пул и вернет ее, если это не так. Не нужно вручную проверять IsInterned самостоятельно.

Опять же, я не могу сказать, будет ли ручной интернинг строк улучшать производительность. Если вы используете константы, они будут автоматически интернированы для вас самым оптимальным способом, и это лучший подход к повышению производительности и использования памяти регулярно повторяющихся строк. Я бы честно рекомендовал вам держаться подальше от ручного интернирования, а также позволить компилятору и оптимизации времени выполнения для вас.

1

Конечно, интернированные строки помогают исполнению, но как @jrista сказал: «Если вы используете константы, они будут автоматически интернированы для вас ...».

Вот некоторые статьи могут помочь вам,

Optimizing C# String Performance

РЕЗЮМЕ: совместное использование памяти, C# поддерживает что-то называется "стажер стол". Это список строк, на которые в настоящее время ссылаются. Если создается новая строка, то проверяется таблица intern. Если ваша строка уже находится там, то обе переменные будут указывать на тот же блок памяти, который поддерживается рабочей таблицей.

http://blog.cumps.be/string-concatenation-vs-memory-allocation/

Смежные вопросы