big.Int が 0 かどうかをテストするための Cmp(zero) の代替
big.Int を使用して値をテストする場合0 は一般的なタスクです。 Cmp(zero) を使用して big.Int をゼロ値と比較することは実行可能なオプションですが、この方法が常に最も速いとは限りません。この記事では、この特定のシナリオでパフォーマンスを向上できる代替方法を検討します。
Raw バイト表現へのアクセス
big.Int は、アクセスするための Int.Bits() メソッドを公開します。その表現の生のバイト。このスライスは、元の big.Int と共有される整数の内部表現への直接アクセスを提供します。これは、ビットに直接アクセスすることがパフォーマンスの高い操作であることを意味します。
0 のテスト
ドキュメントで述べたように、big.Int のゼロ値は値を表します。 0. したがって、対応するスライスは空になります。このスライスの長さをチェックすることで、big.Int が 0 であるかどうかを効率的に判断できます。
if len(i1.Bits()) == 0 { // i1 is 0 }
または、Int.BitLen() 関数は big.Int のビット長を返します。 0 のビット長も 0 であるため、この方法は同様に使用できます。
if i1.BitLen() == 0 { // i1 is 0 }
ベンチマーク結果
提案された方法のパフォーマンスをベンチマークすると、大幅な改善が示されました。従来の Cmp(zero) アプローチよりも:
BenchmarkCompare-8 76975251 13.3 ns/op BenchmarkBits-8 1000000000 0.656 ns/op BenchmarkBitLen-8 1000000000 1.11 ns/op
明らかなように、ビットとスライス長を 0 と比較する場合は Cmp(zero) よりも約 20 倍高速ですが、Int.BitLen() を使用する場合は約 10 倍高速です。
結論
Int.Bits() メソッドとその Int.BitLen() との共有実装を利用すると、big.Int が 0 であるかどうかを効率的にテストできます。パフォーマンスを犠牲にします。これらの代替手段は、大きな整数の 0 チェックを頻繁に行う必要があるアプリケーションに速度上の大きな利点をもたらします。
以上がbig.Int が Cmp(zero) よりもゼロかどうかを確認するより速い方法はありますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。