Повысить производительность локализации? (ComponentResourceManager.ApplyResources) - PullRequest
3 голосов
/ 09 апреля 2010

После того, как у меня возникли проблемы с производительностью на стороне клиента, мы решили попробовать некоторые профилировщики производительности, чтобы попытаться найти узкое место или идентифицировать виновные части кода. Конечно, как и во многих исследованиях производительности, проблемы возникают из-за разных вещей, но я обнаружил, что ComponentResourceManager.ApplyResources моих пользовательских элементов управления занимает слишком много времени при создании моих форм: более 24% времени создания проводится в ApplyResources внутри InitializeComponent(). Это выглядит довольно просто для «поиска строки ресурса и помещения ее в контейнер».

Что именно сделано в ComponentResourceManager.ApplyResources? Я думаю, больше, чем поиск строки, если нет, это не займет много времени.

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

Какие-либо рекомендации по этому вопросу?

Спасибо!

PS: мы кодируем на C #, .NET 3.5 SP1.

Ответы [ 2 ]

3 голосов
/ 06 августа 2010

Метод ApplyResources использует отражение, чтобы найти свойства, которые будут обновлены со значениями ресурса:

property = value.GetType().GetProperty(name, bindingAttr);

Отражение заведомо медленное. Присвойте значения ресурса вручную свойствам (например, используя ResourceManager.GetString(...)). Это утомительно для кода, но должно улучшить производительность.

1 голос
/ 09 апреля 2010

Я бы взял Reflector и взглянул на метод ApplyResources, чтобы увидеть, что он на самом деле делает.

Я бы также порекомендовал профилирование с помощью JetBrains dotTrace 4 (в настоящее время в EAP, но могут быть загружены пробные версии), поскольку оно также может показывать время, проведенное внутри системных классов. Это делает его намного более прозрачным, когда время фактически потрачено. Например, вы можете узнать, тратится ли время на поиск ключей в словаре, доступ к файлам и т. Д.

Вы также можете сделать микро-тест и измерить время, необходимое для поиска X-ключей в словаре строк Y-размера, где X - это количество локализованных ресурсов в конкретной форме, а Y - общий пул ресурсов. Это, по крайней мере, даст вам представление о том, как быстро вы сможете искать ресурсы, если будете кэшировать их в словаре, что может помочь вам решить, стоит ли писать свой собственный поставщик ресурсов.

...