C# 为什么预生成的序列化程序集会增加.NET启动时间?

C# 为什么预生成的序列化程序集会增加.NET启动时间?,c#,winforms,performance,serialization,.net-4.0,C#,Winforms,Performance,Serialization,.net 4.0,我有一个相当大和复杂的winforms应用程序。为了减少启动时间,我使用以下批处理文件预生成了序列化程序集 ;删除任何现有的序列化程序集 del*XmlSerializers.dll ; 生成新的序列化程序集 对于(*.dll)中的%%a,执行sgen/assembly:%%a ; delete.deleted文件(为不允许序列化的程序集生成) del*.dll.deleted* 然而,令我惊讶的是,启动时间实际上从4.6秒增加到了6.1秒——跳跃了1.5秒。无论是冷启动还是热启动,这都是正确

我有一个相当大和复杂的winforms应用程序。为了减少启动时间,我使用以下批处理文件预生成了序列化程序集

;删除任何现有的序列化程序集
del*XmlSerializers.dll
; 生成新的序列化程序集
对于(*.dll)中的%%a,执行sgen/assembly:%%a
; delete.deleted文件(为不允许序列化的程序集生成)
del*.dll.deleted*
然而,令我惊讶的是,启动时间实际上从4.6秒增加到了6.1秒——跳跃了1.5秒。无论是冷启动还是热启动,这都是正确的

因此,问题是:

  • 为什么我的应用程序在序列化程序集就绪时启动较慢
  • 当应用程序生成序列化程序集时,是否有办法通过Perfmon或其他工具查看
  • 我是否正确生成序列化程序集

  • 由于.NET必须检查签名是否有效

    ,因此您应该分析应用程序,以了解启动时间增加的原因。Perfview将是一个很好的工具


    如果在JITtting花费太多时间,请考虑NGEN的应用程序。如果加载了太多的页面,如果在.NET 4.5

    下运行,请考虑使用MPGO优化,所以您说生成序列化程序集比检查有效的签名要快吗?请看,当你这样说时,它听起来很疯狂。启动时,必须检查它是否有效。@这比生成序列化程序集慢1.5秒?除非有人知道如何启用批处理文件语法高亮显示,我们只需将其保留为
    lang none
    。您正在生成多少序列化程序…如果数量很大…也许您可以将它们与ILMerge合并?您是否在64位Windows上运行?您是否在项目中添加对预生成的序列化DLL的引用?您是否可以使用/Type选项仅为要序列化的类型生成序列化代码…而不是DLL中的所有公共类型。当您可以运行探查器并知道真正的答案时,猜测这一点没有多大意义。那么您是否正在运行此WinForms应用程序作为64位…而您编译为AnyCPU?似乎是64位抖动中的一个问题。。。还建议使用FusionLog,比较应用程序以32位运行和以64位运行时的行为……甚至可能是Process Explorer……并查看进程中特定于.NET的数据点。