.NET Framework 4.6 で WCF を使用して XML SOAP メッセージを送信するときのパフォーマンスの問題

適用先
.NET Framework 4.6.2

現象

コンピューターが Microsoft .NET Framework 4.6 にアップグレードされているとします。 Windows Communication Framework (WCF) を使用して XML SOAP メッセージを送信するアプリケーションを使用する場合、エンコードに若干時間がかかることがあります。 場合によっては、サーバー アプリケーションが要求を処理する速度に影響する可能性があります。

原因

この問題は、RyuJIT という名前の新しい Just-In-Time (JIT) コンパイラが原因で発生します。 このコンパイラは、従来の JIT64 コンパイラとは異なる最適化を使用します。 XmlDictionaryWriter で文字列をエンコードするためのホット コード パス上のメソッドは、新しい JIT コンパイラ用に最適化されていないため、生成されたネイティブ命令の実行速度が遅くなり、エンコードに時間がかかります。 SOAP メッセージにエンコードする文字列が多数含まれている場合、この低速コードがより頻繁に使用され、エンコード時間に影響を与える可能性があります。

解決策

この問題を回避するには、System.Runtime.Serialization.dll アセンブリでの ngen の使用を無効にし、レガシ JIT エンジンを使用するようにアプリケーションを構成します。 これを行うには、以下のいずれかの方法を使用します。

  • 次の環境変数を設定します。

    COMPLUS_useLegacyJit=1
    COMPLUS_DisableNativeImageLoadList=System.Runtime.Serialization

  • レジストリで、次のいずれかのサブキーを作成します。

    HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\.NETFramework
    HKEY_CURRENT_USER\SOFTWARE\Microsoft\.NETFramework

    次に、次の値を追加します。

    • キー名: useLegacyJit
      型: REG_WORD
      値: 1
    • キー名: DisableNativeImageLoadList
      種類: REG_SZ
      値: System.Runtime.Serialization
  • <app>.exe.config ファイルに次のテキストを追加します。 指定されたセクションがまだ存在しない場合は、作成します。<構成>
              <ランタイム>
                   <useLegacyJit enabled="1">
                  <disableNativeImageLoad>
                      <assemblyIdentity name="System.Runtime.Serialization" />
                  </disableNativeImageLoad>
               </runtime>
          </configuration>

        
.NET Framework 4.6 の既知の問題の詳細については、「 .NET Framework 4.6 の既知の問題」を参照してください。

追加情報

.NET Framework 4.6 での製品のバージョン管理の変更とその影響の詳細については、「.NET Framework 4.6 のアプリケーション互換性」を参照してください。