MSEに投稿されたベンチマーク結果を取り込んで分析するにはどうすればよいですか?

Nov 26 2020

ここに投稿されているようなMathematicaStack Exchange(MSE)に投稿されたMathematica / WLベンチマーク結果を取り込むにはどうすればよいですか?

仮定:

  • ベンチマークが投稿された複数の回答があります

  • ベンチマーク結果には、特定の明確な「ルールのリスト」フォームがあります

見る:

Needs["Benchmarking`"]
Benchmark[]

(* {"MachineName" -> "macbook-pro", "System" -> "Mac OS X x86 (64-bit)", "BenchmarkName" -> "WolframMark", "FullVersionNumber" -> "12.1.1", "Date" -> "November 26, 2020",
 "BenchmarkResult" -> 3.028, "TotalTime" -> 4.571, "Results" -> {{"Data Fitting", 0.291}, {"Digits of Pi", 0.249}, {"Discrete Fourier Transform", 0.363}, {"Eigenvalues of a Matrix", 0.297},
   {"Elementary Functions", 0.375}, {"Gamma Function", 0.356}, {"Large Integer Multiplication", 0.323}, {"Matrix Arithmetic", 0.227}, {"Matrix Multiplication", 0.218}, {"Matrix Transpose", 0.404},
   {"Numerical Integration", 0.463}, {"Polynomial Expansion", 0.068}, {"Random Number Sort", 0.449}, {"Singular Value Decomposition", 0.221}, {"Solving a Linear System", 0.267}}} *)

回答

12 AntonAntonov Nov 26 2020 at 18:23

摂取

XMLオブジェクトでMSEディスカッションからすべての回答を取得します。

xmlObject = 
  Import["https://mathematica.stackexchange.com/questions/234881/benchmarking-with-mathematica-v-12-for-up-to-date-comparision-of-mathematica-acr/235384#235384", "XMLObject"];

コードXML要素を取得します。

lsRes1 = Cases[xmlObject, XMLElement["code", {}, code_] :> code, \[Infinity]];

(この時点でコード文字列が取得されることに注意してください。)

Benchmark計算コマンドを削除し、コード文字列をWLコードに変換します。

lsRes2 = Map[
   ToExpression@
     StringReplace[#, {"BenchmarkReport[]" -> "", "Benchmark[]" -> ""}] &, lsRes1];
Length[lsRes2]

(*16*)

ルールのリストであるコード(ブロック)を選択します。

lsRes3 = Select[Flatten /@ lsRes2, MatchQ[#, {_Rule ..}] && Length[#] > 1 &];
Length[lsRes3]

(*10*)

コードブロックごとに、メタデータとベンチマークの結果を関連付けにフラット化します。

lsRes4 = Map[Association@ Cases[Flatten[# /.  HoldPattern["Results" -> r_] :> (Rule @@@ r)], _Rule] &, lsRes3];
Length[lsRes4]

(*10*)

すべての関連付けに同じキーがあることを確認してください。

lsRes5 = 
 Block[{lsAllKeys = Union[Flatten[Keys /@ lsRes4]]}, 
  Map[Join[AssociationThread[lsAllKeys, "NA"], #] &, lsRes4]
 ];
Length[lsRes5]

(*10*)

(そうしないと、取得したデータセットを一部の計算で使用するのが難しい場合があります。)

比較データセットを作成します。

dsBenchmarks = Dataset[lsRes5];
dsBenchmarks = dsBenchmarks[SortBy[#BenchmarkResult &]]

基本的な分析

データセットを要約します。

ResourceFunction["RecordsSummary"][dsBenchmarks]

(棒)プロット結果:

Multicolumn@
 KeyValueMap[
  If[VectorQ[#2, NumericQ], 
    BarChart[#2, PlotLabel -> #1, PlotTheme -> "Detailed"], 
    Nothing
  ] &, 
  Normal@Transpose@dsBenchmarks
]

内訳統計

システムごとのパーティションベンチマーク結果(または他の基準):

aRes = GroupBy[Normal@dsBenchmarks, #System &, Dataset];
aRes = Map[#[All, Select[#, NumericQ] &] &, aRes];

全体的なベンチマーク結果をベンチマークコンポーネントの結果から分離します。

aRes2 = Map[#[All, KeyTake[#, {"BenchmarkResult", "TotalTime"}] &] &, aRes];
aRes3 = Map[#[All, KeyDrop[#, {"BenchmarkResult", "TotalTime"}] &] &, aRes];

全体的なベンチマーク結果を表示します。

aRes2

システムごとの分布統計プロットを表示します。

aResPlots3 = 
  BoxWhiskerChart[Transpose[Normal[#[Values]]], 
     PlotLabel -> Row[{"Number of benchmarks:", Spacer[2], Length[#]}], 
     ChartStyle -> 56, ImageSize -> Medium, PlotTheme -> "Detailed", 
     ChartLegends -> Keys[Normal@#[[1]]]] & /@ aRes3;
Grid[List @@@ Normal[aResPlots3], Dividers -> All, FrameStyle -> GrayLevel[0.7]]

(システムごとに利用可能なベンチマークの数に注意する必要があることに注意してください。これらの数はここでは小さすぎます...)