2

数値が含まれる場合に、自分の言語でデフォルトのデータ型として bignum を使用するかどうかについて、この問題に遭遇しました。私はこれを自分で評価し、利便性と快適性とパフォーマンスの質問に減らしました。その質問に対する答えは、最適化されていないプログラムでパフォーマンス ヒットがどの程度大きくなるかによって異なります。

fixnum または整数で十分だった場所で bignum を使用した場合のオーバーヘッドはどれくらい小さいでしょうか? 最高の実装でどれくらい小さくできますか? どのような種類の実装が最小のオーバーヘッドに達し、どのような種類の追加のトレードオフが発生しますか?

言語をデフォルトで bignum に設定した場合、全体的な言語パフォーマンスの結果にどのような影響を期待できますか?

4

7 に答える 7

4

おそらく、Lisp がどのようにそれを行うかを見ることができます。ほとんどの場合、正確に 正しいことを行い、必要に応じて暗黙的に型を変換します。これには、fixnums (「通常の」整数)、bignums、ratios (2 つの整数のセットとして表される縮小された適切な分数)、および floats (異なるサイズ) があります。浮動小数点のみが精度エラーを持ち、伝染性があります。つまり、計算に浮動小数点が含まれると、結果も浮動小数点になります。「Practical Common Lisp」には、この動作の適切な説明があります。

于 2008-11-06T21:45:05.783 に答える
3

正直なところ、「試してみてください」というのが一番の答えです。

明らかに bignum は、通常 1 つの CPU レジスタに収まるネイティブ型ほど効率的ではありませんが、すべてのアプリケーションは異なります。整数演算の負荷全体を実行しない場合、オーバーヘッドは無視できる可能性があります。

于 2008-11-06T21:39:25.623 に答える
2

考えてみれば…パフォーマンスのヒットはあまりないと思います。

bignum は本質的に非常に大きな基数を持つため、たとえば 65536 以上の基数は、通常、従来の fixnum と整数の最大可能値です。

bignum のベースをどのくらいの大きさに設定するかはわかりませんが、fixnum や整数の代わりに使用するときに十分な大きさに設定すると、最初の bignum 桁を超えないため、操作通常の fixnums/int とほぼ同じになります。

これにより、最初の bignum 桁を超えて大きくならない bignum の最適化の機会が開かれ、それらを超高速の 1 桁演算に置き換えることができます。

そして、2 番目の bignum-digit が必要な場合は、n-digit アルゴリズムに切り替えます。

これは、ビットフラグとすべての算術演算の検証操作で実装できます。大まかに考えると、データブロックの最上位ビットが0に設定されている場合、最上位ビットを使用してbignumを表すことができ、それらを次のように処理しますそれらが通常の fixnum/int であるが、1 に設定されている場合は、ブロックを bignum 構造として解析し、そこから bignum アルゴリズムを使用します。

これにより、単純なループ イテレータ変数によるパフォーマンス ヒットを回避できるはずです。これは、パフォーマンス ヒットの最初の原因であると考えられます。

それは私の大雑把な考えにすぎません。あなたは私よりもよく知っているはずなので、提案です:-)

ps 申し訳ありませんが、bignum-digit と bignum-base の技術用語が何であるかを忘れていました

于 2008-11-06T22:00:12.583 に答える
0

それが非常にドメイン固有でない限り、私はそれが価値があるだろうと完全に疑っています。

最初に頭に浮かぶのは、プログラム全体の小さなforループですが、小さなイテレータ変数はすべてbignumになるのでしょうか。それが怖いです!

しかし、あなたの言語がかなり機能的であるなら...それならそうではないかもしれません。

于 2008-11-06T21:50:25.570 に答える
0

あなたの削減は正しいですが、選択は言語のパフォーマンス特性に依存するため、私たちが知ることはできません!

言語を実装したら、パフォーマンスの違いを測定し、おそらくプログラマーにデフォルトを選択する指示を与えることができます

于 2008-11-06T21:37:58.010 に答える
0

結果は言語ごと、言語リビジョンごと、CPU ごとに異なるため、独自のベンチマークを作成するまで、実際のパフォーマンス ヒットはわかりません。32 ビット整数は 16 ビット整数の 2 倍のメモリを使用するという明らかな事実を除いて、これを測定する言語に依存しない方法はありません。

于 2008-11-06T21:40:13.733 に答える
0

fixnum または整数で十分だった場所で bignum を使用した場合のオーバーヘッドはどれくらい小さいでしょうか? 小さく表示するのはせいぜい実装でしょうか?

悪いニュースは、可能な限り最高のソフトウェア実装であっても、BigNum は組み込み演算よりも桁違いに遅くなるということです (つまり、係数 10 から係数 1000 までのすべて)。

私は正確な数を持っていませんが、そのような状況では正確な数があまり役に立たないと思います: 大きな数が必要な場合は、それらを使用してください。そうでない場合は、しないでください。あなたの言語がデフォルトでそれらを使用している場合 (どの言語ですか? 一部の動的言語はそうです...)、別の言語に切り替えることの欠点がパフォーマンスの向上によって補われるかどうかを考えてください (それはめったにあるべきではありません)。

(これは大まかに次のように言い換えることができます: 大きな違いがありますが、それは問題ではありません。問題がある場合(およびその場合のみ)、別の言語を使用してください。仕事。)

于 2008-11-06T21:41:45.337 に答える