PHPでは、 BCMUL関数は、多数の乗算に対処する一般的な方法です。任意の精密算術算術演算ライブラリ(BC Math)を介して高精度計算関数を提供します。 10進数または多数を正確に計算する必要があるアプリケーションシナリオの場合、 BCMULは間違いなく強力なツールです。ただし、高精度の計算の問題を解決することはできますが、特に頻繁に多数の乗算を計算する必要がある場合は、そのパフォーマンスはそれほど理想的ではないかもしれません。
この記事では、 BCMULのパフォーマンスを最適化するためのいくつかの手法を紹介して、多数の増殖の計算効率を改善し、プログラムの実行時間を短縮します。
BC Mathが提供する精度設定はBCCALE関数によって制御され、デフォルトの精度は0です。高精度が不要な場合は、自分に合った最低精度に設定してください。たとえば、2つの小数点以下を保持する必要がある場合は、以下を使用できます。
<span><span><span class="hljs-title function_ invoke__">bcscale</span></span><span>(</span><span><span class="hljs-number">2</span></span><span>);
</span></span>必要な範囲に精度を制限すると、不必要な計算負担が軽減される可能性があります。
複数の場所で同じ乗算を実行する必要がある場合は、 BCMUL関数への繰り返しの呼び出しを避けるようにしてください。最初に計算結果を変数にキャッシュしてから、複数の場所でキャッシュ変数を参照できます。これにより、計算の数を減らし、パフォーマンスを改善できます。
<span><span><span class="hljs-variable">$result</span></span><span> = </span><span><span class="hljs-title function_ invoke__">bcmul</span></span><span>(</span><span><span class="hljs-variable">$num1</span></span><span>, </span><span><span class="hljs-variable">$num2</span></span><span>, </span><span><span class="hljs-number">10</span></span><span>);
</span><span><span class="hljs-comment">// 使用 $result 他の操作を行います</span></span><span>
</span></span>BC Mathの整数計算のパフォーマンスは、浮動小数点計算よりもはるかに高くなっています。計算のために、浮動小数点数を整数に変換してみてください。たとえば、フローティングポイント番号に複数を掛け、結果を整数に変換して計算し、最後に同じ倍数で除算して元の値を復元します。
<span><span><span class="hljs-variable">$num1</span></span><span> = </span><span><span class="hljs-number">123.45</span></span><span>;
</span><span><span class="hljs-variable">$num2</span></span><span> = </span><span><span class="hljs-number">678.90</span></span><span>;
</span><span><span class="hljs-variable">$scale</span></span><span> = </span><span><span class="hljs-number">100</span></span><span>; </span><span><span class="hljs-comment">// 乗算します100</span></span><span>
</span><span><span class="hljs-variable">$num1_int</span></span><span> = (</span><span><span class="hljs-keyword">int</span></span><span>)(</span><span><span class="hljs-variable">$num1</span></span><span> * </span><span><span class="hljs-variable">$scale</span></span><span>);
</span><span><span class="hljs-variable">$num2_int</span></span><span> = (</span><span><span class="hljs-keyword">int</span></span><span>)(</span><span><span class="hljs-variable">$num2</span></span><span> * </span><span><span class="hljs-variable">$scale</span></span><span>);
</span><span><span class="hljs-variable">$result_int</span></span><span> = </span><span><span class="hljs-title function_ invoke__">bcmul</span></span><span>(</span><span><span class="hljs-variable">$num1_int</span></span><span>, </span><span><span class="hljs-variable">$num2_int</span></span><span>);
</span><span><span class="hljs-variable">$result</span></span><span> = </span><span><span class="hljs-title function_ invoke__">bcdiv</span></span><span>(</span><span><span class="hljs-variable">$result_int</span></span><span>, </span><span><span class="hljs-variable">$scale</span></span><span> * </span><span><span class="hljs-variable">$scale</span></span><span>, </span><span><span class="hljs-number">2</span></span><span>); </span><span><span class="hljs-comment">// 小数を回復します</span></span><span>
</span></span>このようにして、計算の精度を確保しながら、パフォーマンスを向上させることができます。
あなたが扱っている値の範囲が特に大きくなく、PHP整数タイプの範囲を超えない場合は、計算にPHPのネイティブ整数型を直接使用することを検討できます。 BCMULの高精度は多数を処理するように設計されており、通常の整数操作では、ネイティブ整数タイプの動作効率はBCMULの動作効率よりもはるかに高くなっています。
<span><span><span class="hljs-variable">$num1</span></span><span> = </span><span><span class="hljs-number">123456789</span></span><span>;
</span><span><span class="hljs-variable">$num2</span></span><span> = </span><span><span class="hljs-number">987654321</span></span><span>;
</span><span><span class="hljs-variable">$result</span></span><span> = </span><span><span class="hljs-variable">$num1</span></span><span> * </span><span><span class="hljs-variable">$num2</span></span><span>;
</span></span>数値範囲がPHP整数でサポートされている範囲内にある場合、ネイティブ整数操作を直接使用すると、 BCMULを使用するよりも効率的になります。
アプリケーションに多数の乗算操作が含まれ、これらの操作が独立している場合は、マルチスレッドを使用して並行して計算することを検討してください。 PHP自体はマルチスレッドをサポートしていませんが、拡張( pthreadsなど)またはGearmanやRabbitmqなどの外部ツールを活用することにより、タスクを並行して処理できます。このアプローチは複雑ですが、処理パフォーマンスを大幅に改善できます。
アプリケーションで重複するコンピューティングニーズに遭遇した場合は、キャッシュメカニズムを使用して計算結果を保存することを検討してください。たとえば、RedisやMemcachedなどのメモリキャッシュツールを使用して、中間結果を保存できます。キャッシュを使用すると、同じ計算を複数回回避できるため、システムの負担が軽減されます。
<span><span><span class="hljs-variable">$cacheKey</span></span><span> = </span><span><span class="hljs-string">"bcmul_result_<span class="hljs-subst">{$num1}</span></span></span><span>_</span><span><span class="hljs-subst">{$num2}</span></span><span>";
</span><span><span class="hljs-keyword">if</span></span><span> (!</span><span><span class="hljs-variable">$result</span></span><span> = </span><span><span class="hljs-variable">$cache</span></span><span>-></span><span><span class="hljs-title function_ invoke__">get</span></span><span>(</span><span><span class="hljs-variable">$cacheKey</span></span><span>)) {
</span><span><span class="hljs-variable">$result</span></span><span> = </span><span><span class="hljs-title function_ invoke__">bcmul</span></span><span>(</span><span><span class="hljs-variable">$num1</span></span><span>, </span><span><span class="hljs-variable">$num2</span></span><span>);
</span><span><span class="hljs-variable">$cache</span></span><span>-></span><span><span class="hljs-title function_ invoke__">set</span></span><span>(</span><span><span class="hljs-variable">$cacheKey</span></span><span>, </span><span><span class="hljs-variable">$result</span></span><span>);
}
</span></span>いくつかの特別な場合、乗算アルゴリズムを最適化することにより、計算速度を改善できます。たとえば、Karatsubaアルゴリズムなどのパーティションアルゴリズムを使用して、多数の増殖を加速します。この方法は、乗算速度を改善するだけでなく、計算の複雑さも低下させます。
BC Mathはこのアルゴリズムの実装を直接提供していませんが、標準のBCMULをカスタム実装に置き換えることができます。
BCMULは、多数の乗算を処理するためのPHPの強力なツールですが、そのパフォーマンスは多数のコンピューティングニーズに直面するとボトルネックになる可能性があります。精度を合理的に設定し、繰り返し計算を減らし、浮動小数点数の代わりに整数を使用し、ネイティブデータ型を合理的に選択し、マルチスレッド、キャッシュ計算結果、および最適化アルゴリズムを使用して、 BCMUL操作の効率を効果的に改善できます。
これらの最適化手法を習得した後、高性能PHPアプリケーションを開発するときに不必要なパフォーマンス損失を減らし、システム全体の応答速度を改善できます。