知識マップ: C#/C++/Java/Goの実行速度を公平に比較する方法
記事「C#/C++/Java/Goの実行速度を公平に比較する方法」の主張を、概念と関係(エッジ)に分解した知識グラフの全体です。各関係には根拠・確認日・確度が付いています。
この記事はC#・C++・Java・Goの実行速度を1本の数字で比較することの危うさを指摘し、公平な比較のための測定設計を整理している。C#とJavaはJITコンパイルとTiered Compilationの影響でcoldとwarmの差が大きく、C++とGoは通常AOTで事前コンパイルされるため、両者を同じ表に混ぜないことを求める。C++ではコンパイラが未使用の計算を消してしまうデッドコード除去への対策としてGoogle Benchmarkやchecksumによる正しさ確認が必要になり、言語内の測定にはBenchmarkDotNet・JMH・go test -bench・Google Benchmarkといった専用ハーネスを使い、言語をまたぐ比較は外側の共通ランナーで実行順序のランダム化とchecksum検証を行う2層構成が推奨される。さらに平均だけでなく中央値やp95/p99のようなテールレイテンシの分布まで見ることが、結果を正しく解釈する条件として整理されている。
flowchart LR
accTitle: C#/C++/Java/Go言語横断ベンチマークの知識マップ
accDescr: C#とJavaのJITコンパイルとTiered Compilation、C++とGoの事前コンパイルという違いがcoldとwarmの区別を要求すること、C++のデッドコード除去対策としてのGoogle Benchmarkとchecksum検証、言語別ハーネスと外側の共通ランナーによる2層構成、テールレイテンシの分布評価までの関係を示す図。
cross_language_benchmarking["言語横断ベンチマーク設計"]
csharp["C#"]
jit_compilation["JIT(Just-In-Time)コンパイル"]
java_lang["Java"]
cpp["C++"]
ahead_of_time_compilation["AOT(事前)コンパイル"]
golang["Go"]
tiered_compilation["Tiered Compilation"]
gomaxprocs["GOMAXPROCS"]
cgo["cgo"]
benchmarkdotnet["BenchmarkDotNet"]
jmh["JMH(Java Microbenchmark Harness)"]
go_benchmark_testing["go test -bench と benchstat"]
google_benchmark["Google Benchmark"]
warm_up_measurement["ウォームアップ後の安定状態計測(warm)"]
dead_code_elimination["デッドコード除去(最適化による処理の消滅)"]
checksum_verification["checksumによる正しさ確認"]
tail_latency_percentile["テールレイテンシのパーセンタイル(p95/p99)"]
garbage_collection["ガベージコレクション(GC)"]
csharp -.->|"利用する"| jit_compilation
java_lang -.->|"利用する"| jit_compilation
cpp -->|"利用する"| ahead_of_time_compilation
golang -->|"利用する"| ahead_of_time_compilation
csharp -->|"利用する"| tiered_compilation
golang -->|"利用する"| gomaxprocs
golang -.->|"利用する"| cgo
csharp -.->|"利用する"| benchmarkdotnet
java_lang -.->|"利用する"| jmh
golang -.->|"利用する"| go_benchmark_testing
cpp -.->|"利用する"| google_benchmark
benchmarkdotnet -->|"利用する"| warm_up_measurement
jmh -->|"利用する"| warm_up_measurement
google_benchmark -.->|"防止する"| dead_code_elimination
cpp -.->|"原因になり得る"| dead_code_elimination
checksum_verification -->|"防止する"| dead_code_elimination
cross_language_benchmarking -->|"利用する"| tail_latency_percentile
csharp -->|"利用する"| garbage_collection
java_lang -->|"利用する"| garbage_collection
golang -->|"利用する"| garbage_collection
cross_language_benchmarking -.->|"利用する"| warm_up_measurement
cross_language_benchmarking -->|"利用する"| checksum_verification
cross_language_benchmarking -->|"利用する"| jit_compilation
cross_language_benchmarking -->|"利用する"| ahead_of_time_compilation
概念間の関係(全24件)
図と同じ関係を文章でも列挙します。表示している文と機械可読な意味データ(RDFa)は同じ要素に載っています。確度が「確立した関係」のものは直接の関係として、「条件付きの関係」のものは成立条件つきの言明(rdf:Statement)として表現しています。
- C#はJIT(Just-In-Time)コンパイルを利用します。
- JavaはJIT(Just-In-Time)コンパイルを利用します。
- C++はAOT(事前)コンパイルを利用します。
- GoはAOT(事前)コンパイルを利用します。
- C#はTiered Compilationを利用します。
- GoはGOMAXPROCSを利用します。
- Goはcgoを利用します。
- C#はBenchmarkDotNetを利用します。
- JavaはJMH(Java Microbenchmark Harness)を利用します。
- Goはgo test -bench と benchstatを利用します。
- C++はGoogle Benchmarkを利用します。
- BenchmarkDotNetはウォームアップ後の安定状態計測(warm)を利用します。
- JMH(Java Microbenchmark Harness)はウォームアップ後の安定状態計測(warm)を利用します。
- Google Benchmarkはデッドコード除去(最適化による処理の消滅)を防ぎます。
- C++はデッドコード除去(最適化による処理の消滅)の原因になることがあります。
- checksumによる正しさ確認はデッドコード除去(最適化による処理の消滅)を防ぎます。
- 言語横断ベンチマーク設計はテールレイテンシのパーセンタイル(p95/p99)を利用します。
- C#はガベージコレクション(GC)を利用します。
- Javaはガベージコレクション(GC)を利用します。
- Goはガベージコレクション(GC)を利用します。
- 言語横断ベンチマーク設計はウォームアップ後の安定状態計測(warm)を利用します。
- 言語横断ベンチマーク設計はchecksumによる正しさ確認を利用します。
- 言語横断ベンチマーク設計はJIT(Just-In-Time)コンパイルを利用します。
- 言語横断ベンチマーク設計はAOT(事前)コンパイルを利用します。
主要概念の定義
機械可読データ
このページはサイトの知識グラフ(_data/knowledge/)から自動生成されています。誤りの指摘はお問い合わせからお願いします。