Интернирование строк поможет производительности в синтаксическом анализаторе?

Я был большим поклонником фильтра w/лямбда однако, это не наилучший вариант если Вы рассматривающий временную сложность

опция

list_to_sort.sort(key=operator.itemgetter('name'))
#edits the list, does not return a new list

Second опции

sorted_list = sorted(list_to_sort, key= lambda x: x['name'])
# returns list of values

First Быстрое сравнение исполнительных времен

# First option
python3.6 -m timeit -s "list_to_sort = [{'name':'Homer', 'age':39}, {'name':'Bart', 'age':10}, {'name':'Faaa', 'age':57}, {'name':'Errr', 'age':20}]" -s "sorted_l=[]" "sorted_l = sorted(list_to_sort, key=lambda e: e['name'])"

1 000 000 циклов, лучших из 3: 0,736 мкс за цикл

# Second option 
python3.6 -m timeit -s "list_to_sort = [{'name':'Homer', 'age':39}, {'name':'Bart', 'age':10}, {'name':'Faaa', 'age':57}, {'name':'Errr', 'age':20}]" -s "sorted_l=[]" -s "import operator" "list_to_sort.sort(key=operator.itemgetter('name'))"

1 000 000 циклов, лучших из 3: 0,438 мкс за цикл

6
задан Community 23 May 2017 в 12:04
поделиться

2 ответа

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

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

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

2
ответ дан 17 December 2019 в 18:18
поделиться

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

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

Оптимизация производительности C # String

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

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

1
ответ дан 17 December 2019 в 18:18
поделиться
Другие вопросы по тегам:

Похожие вопросы: