自编Roslyn构建性能:没有最初发布的Roslyn版本

时间:2016-01-18 11:09:54

标签: .net msbuild roslyn

我用一句话做什么

Roslyn github repository检出分支Update-1,构建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并签出分支更新-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本身时还有其他事情(比如优化等)吗?

2 个答案:

答案 0 :(得分:7)

最大的区别是Visual Studio在NGEN中安装的官方编译器是作为安装的一部分编译的。

然而,即使你是NGEN,你也不会得到完全相同的结果,因为微软有配置文件引导的训练数据来支持部分NGEN,以便在二进制大小和JIT时间之间取得良好的平衡。 ; t部分公共回购(类似于使用官方Microsoft私钥签名)。

答案 1 :(得分:2)

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

  • 要NGEN编译二进制文件,它们必须具有强名称,这意味着它们必须签名
  • 正如凯文所指出的那样,正常情况下,Roslyn二进制文件会使用Microsoft私钥进行延迟签名。
  • 因此我们必须使用自己的密钥对进行签名
  • 相应的配置可在文件 build \ Targets \ VSL.Imports.targets
  • 中的Roslyn repo中找到
  • 出于测试目的,我们可以替换此部分:
<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>
  • ...使用您的自己的密钥文件,公钥以及公钥令牌。
  • 密钥文件可以在Visual Studio中创建,也可以在sn.exe工具的帮助下创建。
  • sn.exe也可用于导出公钥以及提取公钥令牌(例如,您可以使用密钥测试签名的程序集)
  • 然后可以像这样调用NGEN:

    ngen.exe install "C:\path\to\Roslyn\Release\csc.exe"

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