GenerateResource / CoreResGen突然花费了近30倍的时间

时间:2010-08-08 12:28:20

标签: vb.net optimization visual-studio-2010 .net-2.0 resx

几个星期前开始,编译项目(VB.NET,.NET 2.0,VS 2010)已经花了好几倍的时间。在任务管理器中,我注意到ResXtoResources.exe占用了大量CPU。我终于能够使用MSBuild的'Diagnostic'输出设置获得一些数据,并将该输出与几个月前我在分支中看到的输出进行比较。最引人注目的是最后的线条,它们给出了时间。之前:

Target Performance Summary:
[..]
     1395 ms  CoreResGen                                 1 calls
     1930 ms  CompileLicxFiles                           1 calls
     2135 ms  GenerateApplicationManifest                1 calls
     2844 ms  CoreCompile                                1 calls

Task Performance Summary:
[..]
     1391 ms  GenerateResource                           1 calls
     1929 ms  LC                                         1 calls
     2134 ms  GenerateApplicationManifest                1 calls
     2843 ms  Vbc                                        1 calls

Build succeeded.

Time Elapsed 00:00:09.50
========== Rebuild All: 5 succeeded, 0 failed, 0 skipped ==========

后:

Target Performance Summary:
     1348 ms  CompileLicxFiles                           1 calls
     1747 ms  GenerateApplicationManifest                1 calls
     2595 ms  CoreCompile                                1 calls
    39575 ms  CoreResGen                                 1 calls

Task Performance Summary:
     1347 ms  LC                                         1 calls
     1745 ms  GenerateApplicationManifest                1 calls
     2593 ms  Vbc                                        1 calls
    39570 ms  GenerateResource                           1 calls

Build succeeded.

Time Elapsed 00:00:47.34
========== Rebuild All: 5 succeeded, 0 failed, 0 skipped ==========

两个项目都在同一系统上使用相同的设置进行编译。我们已经做了很多改变,但是没有任何规模可以证明这种时间变化是合理的(并且只适用于这一项任务!)。我认为资源生成正在陷入某些问题 - 循环引用,缺失引用等等。但是,我无法找到有关如何将这样的问题追溯到我认为只是单个资源文件的任何有用的东西。

如果没有查看数以千计的签到或暂时从项目中删除某些表单(以及它们的资源文件),我还能做些什么来找出问题吗?我似乎无法找到单个资源文件的时间。

到目前为止的结果:

我创建了一个新的空项目,其中包含所有相同的.resx个文件。

  • 该问题在.NET 4.0中无法重现:编译完全相同的测试项目只需不到一秒钟。
  • 只要我还添加了原始项目中的一个表单,这个问题在.NET 2.0中就可以重现;显然,它将不会“正确”地编译资源。
  • 删除单个.resx文件会“按比例”减少时间;那就是:遗憾的是我找不到一个单一的文件是罪魁祸首。

2 个答案:

答案 0 :(得分:1)

看起来this blog entry给出了答案。

在一个坚果中,搜索.resx文件中的实际不存在的程序集引用(例如System.Windows.Forms, Version 4.0.0.0),并将其替换为(Version 2.0.0.0)。我使用grepWin来完成此任务。

我的CoreResGen / GenerateResource时间现在大致与以往相同。 CruiseControl.NET表示构建时间从92秒减少到40秒。:))

答案 1 :(得分:0)

我在这里找到了原因......资源包含一个以特殊Adobe Fireworks格式(PNG)保存的png文件。我将文件导出到png(没有图层信息),现在编译需要6秒。