1

我创建了一个新的 Windows Forms .NET v3.5 解决方案,并使用Visual Studio 上的Package Manager Console使用以下命令添加了 Patterns and Practices Unity引用:

安装包 Unity - 版本 2.1.505.2

为了简化,这个小应用程序除了尝试在它的加载方法中实例化一个UnityContainer 之外什么都不做:

private void Form1_Load(object sender, EventArgs e)
{
    Stopwatch stopwatch = Stopwatch.StartNew();
    new UnityContainer();
    stopwatch.Stop();
    Debug.WriteLine(String.Format("Winforms Unity initialization took {0}", stopwatch.Elapsed));
    this.Close();
}

在 Windows 7 上,它运行迅速,进程在不到一秒的时间内退出。秒表日志显示实例化 Unity 不到一毫秒。

带有 SP2 的 Windows XP 64 位中,我经历了30 秒的时间,直到这个小应用程序退出,但调试日志仍然显示实例化 Unity 的时间不到一毫秒

所以我认为可能很长一段时间与 JIT 编译器从 Unity 的 IL 代码生成本机代码有关:

我使用ANTS Performance Profiler来确定哪些方法执行时间过长,发现 Form1_Load 方法总共需要 32 秒,

其中包含大约 30 秒的 JIT 开销,其中包含 30 秒的“等待同步”。

将鼠标悬停在它上面会显示一个工具提示,上面写着:

该节点显示正在执行的线程被阻塞了一段时间。例如,线程可能一直在休眠,或等待访问共享资源。

我想这意味着在 Windows XP 上加载/JITing Unity 需要很长时间。我也尝试使用 NGEN 创建小应用程序的原生镜像,但情况与不使用原生镜像相同。

有人知道 Unity 在 XP 中加载需要这么长时间吗?

DLL 是三个:

Microsoft.Practices.ServiceLocation.dll 30 KB

Microsoft.Practices.Unity.Configuration.dll 85 KB

Microsoft.Practices.Unity.dll 122 KB

它们正在发布,x86(这就是我从包管理器中获得它们的方式)

4

0 回答 0