.net - 自编译 Roslyn 构建性能 : Not as fast as originally shipped Roslyn version

标签 .net msbuild roslyn

我在做什么用一句话

查看分行 Update-1来自 Roslyn github repository ,构建 csc.exe,并使用我自己构建的 csc.exe 版本编译随机解决方案。

预期结果

我希望性能与 VS 2015 Update 1 随附的原始 Roslyn 版本相当,位于路径:C:\Program Files (x86)\MSBuild\14.0\Bin
实际结果

与原始版本相比,我自己构建的 Roslyn 版本的构建性能要差得多。在我在测试中使用的解决方案中:大约 30 秒与 65 秒。

我的程序更详细

  • 克隆 https://github.com/dotnet/roslyn.git并 checkout 分支 update-1
  • 使用 Release 构建 Roslyn配置(对解决方案平台尝试了 Mixed Configurationx64。)
  • 为了编译测试解决方案,我更改了所有项目文件以使用 csc 路径的特定位置:
    <CscToolPath>C:\Path\To\Output\Location\Of\Roslyn\Binaries\</CscToolPath>
  • 出于测试目的,我正在从命令行构建测试解决方案
    MSBuild.exe /t:Rebuild /m:1 /verbosity:m MySolutionName.sln
  • 我目前也在做清洁工作:
    MSBuild.exe /t:Clean /m:1 /verbosity:m MySolutionName.sln
  • 为了针对 VS 2015 Update 1 附带的原始编译器进行测试,我将项目文件中的配置更改为:
    <CscToolPath>C:\Program Files (x86)\MSBuild\14.0\Bin\</CscToolPath>

  • 问题
  • 我可以做些什么来实现与我的自编译 Roslyn 版本类似的性能,就像最初发布的 Roslyn dll 一样?
  • 在构建 Roslyn 本身时是否需要考虑其他事项(如优化等)?
  • 最佳答案

    除了完全正确的 Kevin 的回答之外,这里还有一些关于签名/NGEN 编译 Roslyn 二进制文件的更多细节,因为这对其他人来说可能很有趣。

  • 要 NGEN 编译二进制文件,它们必须有一个强名称,这意味着它们必须签名
  • 通常,Roslyn 二进制文件是使用 Microsoft 私钥延迟签名的,正如 Kevin 还指出的那样。
  • 所以我们必须使用我们自己的 key 对来签名
  • 相应的配置可以在文件的Roslyn repo中找到。构建\目标\VSL.Imports.targets
  • 出于测试目的,我们可以替换此部分:

  • <Choose>
        <When Condition="'$(SignAssembly)' == 'true'">
          <Choose>
            <!-- Shipping binaries in an "official" build are delay-signed with the MS key; later, the signing
                 system will finish the strong-name signing. -->
            <When Condition="'$(NonShipping)' != 'true'">
              <PropertyGroup>
                <AssemblyOriginatorKeyFile>$(VSLToolsPath)\Strong Name Keys\35MSSharedLib1024.snk</AssemblyOriginatorKeyFile>
                <DelaySign>true</DelaySign>
                <PublicKey>0024000004800000940000000602000000240000525341310004000001000100b5fc90e7027f67871e773a8fde8938c81dd402ba65b9201d60593e96c492651e889cc13f1415ebb53fac1131ae0bd333c5ee6021672d9718ea31a8aebd0da0072f25d87dba6fc90ffd598ed4da35e44c398c454307e8e33b8426143daec9f596836f97c8f74750e5975c64e2189f45def46b2a2b1247adc3652bf5c308055da9</PublicKey>
                <PublicKeyToken>31BF3856AD364E35</PublicKeyToken>
              </PropertyGroup>
            </When>
    
            <!-- Non-shipping binaries are simply signed with the Roslyn internal key. -->
            <Otherwise>
              <PropertyGroup>
                <AssemblyOriginatorKeyFile>$(VSLToolsPath)\Strong Name Keys\RoslynInternalKey.Private.snk</AssemblyOriginatorKeyFile>
                <DelaySign>false</DelaySign>
                <PublicKey>$(RoslynInternalKey)</PublicKey>
                <PublicKeyToken>fc793a00266884fb</PublicKeyToken>
              </PropertyGroup>
            </Otherwise>
          </Choose>
        </When>
    </Choose>
    

    例如,这个:
    <Choose>  
    <When Condition="'$(SignAssembly)' == 'true'">
      <PropertyGroup>
        <AssemblyOriginatorKeyFile>C:\path\to\keyfile\TestKey.snk</AssemblyOriginatorKeyFile>
        <DelaySign>false</DelaySign>
        <PublicKey>0024000004800000940000000602000000240000525341310004000001000100B15B00E697DB995031A740A3E07A0B1DBE16AAEA61E615A013E0381B4D875F97F1792965D58810893F6D4B1C10CBD991FB8E9F1118D9C0C6F0EBCB50462FC25056E194667CB59822C18E9CB0C17DBC573291F05F7C87B51C48B377C9EEE12F6D5B331B235E5D6E3669737B210F7BE245A76B118C23EAD90FC392E4ED9F6CDFAB/PublicKey>
        <PublicKeyToken>6E0B9EF75D28854E</PublicKeyToken>
      </PropertyGroup>
    </When>
    </Choose>
    
  • ...使用您的 拥有 key 文件、公钥以及公钥 token 。
  • key 文件可以在 Visual Studio 中创建,也可以在 sn.exe 的帮助下创建。工具。
  • sn.exe也可用于导出公钥以及提取公钥 token (例如,从您可以使用 key 测试签名的程序集中)
  • 那么NGEN可以这样调用:
    ngen.exe install "C:\path\to\Roslyn\Release\csc.exe"

  • (例如位于 C:\Windows\Microsoft.NET\Framework64\v4.0.30319\ngen.exe )

    关于.net - 自编译 Roslyn 构建性能 : Not as fast as originally shipped Roslyn version,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34853273/

    相关文章:

    c++ - 包装 C# C++

    git - 如何将 Git 添加到 MSBuild 脚本?

    c# - 如何使用 roslyn 获得一种方法体的 il?

    c# - 为什么 Action.Method.IsStatic 对于某些 lambda 表达式在 Visual Studio 2013 和 2015 之间不同

    msbuild - TeamCity MSTest 和 TestList?

    c# - 获取隐式对象创建表达式的类型

    c# - 未关闭的sql连接

    .net - 在多线程环境中使用TraceSource

    c# - 无法连接到 .Net 中的 SQL Server 2008

    asp.net-mvc - Visual Studio 2012 - 将 "Views"和 "Content"复制到项目输出路径