diff_bench

diff_bench には Luna-Flow の MoonBit パッケージに対する差分による正しさと性能のベンチマークがあります。各ベンチマークは同じ入力で二つの十進ライブラリを動かし、両者を独立した BigInt オラクルで検査し、結果が正しい場合に限って Mare Mark で計測します。Luna-Flow 側の対象は floating の decimal_gda パッケージです。

このリポジトリは GitHub でのみ公開される参照用プロジェクトです。mooncakes には公開されておらず、実行時依存として使うことは想定していません。

パッケージ

パッケージ役割APIチュートリアル設計
diff_bench(ルート)テンプレートのプレースホルダーAPIチュートリアル設計
dzmingli_vs_floatingDzmingLi/decimal@0.2.2 対 floating GDA、厳密なオラクル、19 演算APIチュートリアル設計
dzmingli_vs_floating/benchスケーリング用実行ファイル、1〜20,000 桁APIチュートリアル設計
dzmingli_vs_floating/bench_common一般的な桁数用実行ファイル、1〜28 桁APIチュートリアル設計
floating_vs_decmial_xmoonbitlang/x/decimal 対 floating GDA、二つの意味論グループAPIチュートリアル設計
floating_vs_decmial_x/benchスケーリング用実行ファイル、1〜4,096 桁APIチュートリアル設計
floating_vs_decmial_x/bench_common一般的な桁数用実行ファイル、1〜28 桁APIチュートリアル設計

性能の章では両方の比較の計測結果を報告しています(DzmingLi、X)。

読み進め方

はじめての方。 dzmingli_vs_floating のチュートリアルを読んでください。十数行で除算一つをオラクルと照合し、その後公開された実行を再現します。

結果を読み解く。 まず性能のページを、次に数値の意味について設計のページを読んでください。精度契約、対応のある統計、X との比較の意味論グループです。

貢献する。 二つの設計ページを読み、次に貢献ガイドラインを読んでください。新しい演算には、計時の前にオラクルの規則、証明付きの精度の上界、テストが必要です。

手法の要約

各入力は固定のシードから中立な十進数 (c,s)↦c⋅10−s(c, s) \mapsto c \cdot 10^{-s} として具体化され、計時の外で各ライブラリの表現に変換され、厳密な結果を保持できることが証明された精度で計算されます。結果は正準化され、オラクルと厳密な等価で比較されます。二つのライブラリの計時サンプルはデータセット、繰り返し、ブロックで対応付けられ、中央値で要約されます。

成果物とツール

生の JSONL レコード、HTML レポート、Plot IR、PNG・PDF・SVG の図はマニュアルの外の artifacts/<package>/ に置かれています。tools/ ディレクトリには Python の図のレイアウト(plot_dzmingli_benchmark.py、plot_dzmingli_supplementary_benchmark.py、layout_x_decimal.py。共通部分は mare_plot_ir.py)と公式の decTest 監査(run_dzmingli_dectest_audit.sh)があります。

ツールチェーン

コードは moon.mod と moon.pkg のマニフェストを使う MoonBit moonc 0.10 以降を対象としています。ライブラリパッケージはすべてのターゲットでビルドでき、実行ファイルと非同期の Mare Mark の実行には native が必要です(非同期ランナーは js でも動きます)。公開された計測は native のリリースビルドでの実行です。

moon check --target all
moon test --target native

native と js では一つのテストが失敗します。division precision follows the requested semantic contract は 4097 を期待していますが、これは moonbitlang/core の BigInt::from_string が長い入力を誤って解析する wasm-gc で記録された値です。正しい値は 4099 です。floating_vs_decmial_x の設計を参照してください。