在我的客户端遇到一些性能问题之后,我们决定尝试一些性能分析器来尝试找出瓶颈或识别代码的有罪部分。
当然,正如许多性能调查一样,问题来自各种各样的事情,但我发现我的用户控件的ComponentResourceManager.ApplyResources
在构造表单时需要花费太多时间:超过24%的施工时间花费在ApplyResources
内的InitializeComponent()
。
这似乎只是“找到一个资源字符串并将其放入容器中”。
ComponentResourceManager.ApplyResources
完成了什么?我猜的不仅仅是搜索字符串,如果没有,也不会花那么长的时间。
有没有办法提升本地化的表现?我们的软件本地化为多种语言,因此我们需要保留这种多语言功能。
有关此问题的任何建议?
谢谢!
PS:我们使用C#,.NET 3.5 SP1进行编码。
答案 0 :(得分:2)
ApplyResources方法使用反射来查找将使用资源值更新的属性:
property = value.GetType().GetProperty(name, bindingAttr);
反思非常缓慢。手动将资源值分配给属性(例如,使用ResourceManager.GetString(...)
)。编码很繁琐,但应该提高性能。
答案 1 :(得分:1)
我会抓住Reflector并查看ApplyResources方法,看看它实际上做了什么。
我还建议使用JetBrains dotTrace 4进行性能分析(目前在EAP中,但可以下载试用版),因为它还可以显示在系统类中花费的时间。这使得在实际花费时间的地方更加透明。例如,您可以查看是否花费时间在字典中查找密钥,访问文件等等。
您还可以执行微基准测试并测量在Y大小的字符串字典中查找X键所需的时间,其中X是特定表单上的本地化资源的数量,Y是总资源池。它至少会让你知道如果要将它们缓存在字典中,你可以多快地查找资源,这可以帮助你决定是否值得编写自己的资源提供者。