2010-04-09 2 views
2

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

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

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

Любые рекомендации по этой проблеме?

Спасибо!

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

+0

Я обнаружил, что я делаю петлю через все открытые окна и применяя изменение языка для обучения форме. Но некоторые из этих форм были расположены (и долгое время их закрывали). Скорость значительно увеличилась после пропуска через расположенные формы. – TamusJRoyce

ответ

2

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

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

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

+0

Это определенно ускоряет работу, но переведенный код очень утомительный :(Кажется, мне трудно поверить, что предоставленная инфраструктура локализации настолько плоха, что она мудрая ... – srodriguez

1

Я бы захватил отражатель и посмотрел метод ApplyResources, чтобы увидеть, что он на самом деле делает.

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

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

+0

Ну, глядя на отражатель, он действительно не помог: в основном он создает хэш-таблицу и ищет ключ. как только обнаружено, он создает свойство и присваивает значение внутри. ничего, что может занять много времени. Мы использовали профилирование характеристик ANTS, в основном «ApplyRessources» запускает изменения размера элементов (угадайте, чтобы текст и такие элементы правильно заполнили элементы управления). Я считаю, что обернуть пул ресурсов в диспетчере ресурсов может помочь, но он не будет обновлять компоненты, что на самом деле происходит в фоновом режиме с помощью ApplyResources. Чувствует, что это так медленно ... – srodriguez