floating_vs_decmial_x の性能
測定条件
このレポートは、MoonBit 0.10 への移行前に行った、moonbitlang/x/decimal@0.4.46 と Luna-Flow/floating/decimal_gda@0.7.1 を比較する MoonBit native リリースビルドでの実行を扱います。モジュールは現在 moonbitlang/x@0.5.5 に依存していますが、それでの再実行はしていません。フィクスチャの構築、解析、変換、正しさの検査、書式化は計時領域の外です。exact_overlap は共通の数学的意味論を計測し、x_compatible は小数 28 桁と 0 方向への切り捨ても含みます。
結果
- 加減算:1–256 桁では GDA が優位(
0.23–0.39 µs/op対 X の0.46–0.66 µs/op)。1,024–4,096 桁では X が逆転し、上限側で約1.4–1.8×高速です。 - 乗算:全サイズで X が約
2.1–2.7×高速です。本 workload では定数倍の差を示しますが、計算量クラスの違いを示すものではありません。 - 除算:
exact_overlapでは 1–64 桁で GDA が約1.2–4.1×高速、256–4,096 桁では X が約1.3–3.4×高速です。x_compatibleは 256 桁まで約1.2×以内で、1,024 桁と 4,096 桁では GDA がそれぞれ約1.8×、3.8×高速です。 - 除算の注意: 64 桁以降、
x_compatibleのフィクスチャは GDA のオペランドを除算の精度(高々 51 桁)に丸める一方、X はオペランド全体を割るので、これらの GDA の計時は少ない仕事量を測っています。既知の制限を参照してください。1〜16 桁の点と、一般的な桁数の実行全体は影響を受けません。 - 比較:全サイズで GDA が高速で、1 桁の約
3.4×から 4,096 桁の約14.8×まで差が広がります。符号・係数長・指数による早期判定が影響します。
他実装との位置付け
固定精度 decimal64/128 は範囲内で高速、任意精度の加減算は概ね O(n)、乗除算は BigInt のアルゴリズムと閾値に依存します。成熟した C 実装は limb 配置や SIMD/アセンブリの恩恵を受け、完全な IEEE/GDA コンテキストは丸め・状態フラグ・特殊値のコストを伴います。
結論と限界
この workload では、X は単純な高スループット算術、GDA は明示的な精度・丸め・コンテキスト意味論に適します。倍率は桁数に対して概ね一定で、異なる漸近計算量ではなく定数倍の実装差を示します。大きな BigInt では閾値の影響があり得ます。他の GDA 実装は同様のアルゴリズムなら近いオーバーヘッドですが、limb 配置、キャッシュ、ネイティブコード、固定精度、ハードウェアで定数は変わります。標準はアルゴリズムを規定しません。結果は fixture、target、ビルドモード、ホストに依存します。JSONL と artifacts/ を再確認してください。本ベンチマークは GitHub 専用で Mooncakes には公開しません。
データと図
この分析の図とレポートはリポジトリに保存されています:メイン図、scaling レポート、共通桁レポート。JSONL レコードと Plot IR も同じ場所にあります。