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 も同じ場所にあります。