4

BenchmarkDotNet を使用して F# コードのベンチマークを行っています。コンソール アプリケーションからベンチマークを実行すると、すべて正常に動作します。

[<EntryPoint>]
let main argv = 
    let summary = BenchmarkRunner.Run<BinomialBenchmark>();

いくつかの簡単なテストのために、F# インタラクティブ ウィンドウからベンチマークを実行したかったのですが、ここで次の例外が発生します。

System.MissingMethodException: Method not found: 'System.Collections.Immutable.ImmutableArray`1<Byte> System.Reflection.Metadata.MetadataReader.GetBlobContent(System.Reflection.Metadata.BlobHandle)'.

歴史的に、このコンストラクターは削除されて Collections.Immutable ライブラリに追加されたようですが、私は最新バージョン (1.3) を使用しており、含まれている必要があります。参照: ImmutableArray はどこにありますか?

さらに、これはコンソール アプリケーションの実行時に正常に機能します。問題は参照ライブラリのバージョンにあるのではないかと考えたので、コンソール アプリケーションですべての BenchmarkDotNet 関連の参照を調べ、FSX で同じものを参照していることを確認しました。

#r "../packages/BenchmarkDotNet/lib/net45/BenchmarkDotNet.dll"
#r "../packages/BenchmarkDotNet.Core/lib/net45/BenchmarkDotNet.Core.dll"
#r "../packages/BenchmarkDotNet.Toolchains.Roslyn/lib/net45/BenchmarkDotNet.Toolchains.Roslyn.dll"
#r "../packages/BenchmarkDotNet.Diagnostics.Windows/lib/net45/BenchmarkDotNet.Diagnostics.Windows.dll"

#r "../packages/Microsoft.CodeAnalysis.CSharp/lib/net45/Microsoft.CodeAnalysis.CSharp.dll"
#r "../packages/Microsoft.CodeAnalysis.Common/lib/net45/Microsoft.CodeAnalysis.dll" 

#r "../packages/System.Reflection.Metadata/lib/netstandard1.1/System.Reflection.Metadata.dll"
#r "../packages/System.Collections.Immutable/lib/netstandard1.0/System.Collections.Immutable.dll"
#r "../packages/System.Threading.Tasks.Extensions/lib/netstandard1.0/System.Threading.Tasks.Extensions.dll"

コンソール アプリケーションで正確なバージョンが使用されていることを確認しました。F# インタラクティブ ランタイムで使用される一部のライブラリは、コンソール アプリケーションで使用されていたものと同じではないようです。

LinqPad でも同様の問題が発生しているようです: https://github.com/dotnet/BenchmarkDotNet/issues/66

任意のヒントが適用されます。

4

0 に答える 0