လက်ရှိတည်နေရာ: ပင်မစာမျက်နှာ> နောက်ဆုံးရဆောင်းပါးများစာရင်း> PHP ၏ cosh function ကို loop တွက်ချက်မှုအတွက် PHP ၏ Cosh function ကိုအသုံးပြုသောအခါစွမ်းဆောင်ရည်မြှင့်တင်ရေးကိုဖြေရှင်းနည်း အချို့သောအကောင်းဆုံးအကြံပြုချက်များကားအဘယ်နည်း။

PHP ၏ cosh function ကို loop တွက်ချက်မှုအတွက် PHP ၏ Cosh function ကိုအသုံးပြုသောအခါစွမ်းဆောင်ရည်မြှင့်တင်ရေးကိုဖြေရှင်းနည်း အချို့သောအကောင်းဆုံးအကြံပြုချက်များကားအဘယ်နည်း။

gitbox 2025-06-12

在进行数值计算密集型操作时, 即使是诸如cosh ()这样的标准数学函数, 这样的标准数学函数, 也可能成为性能瓶颈的来源။ cosh ()是 php php, 广泛用于物理模拟, 金融建模或其他科学计算中, 金融建模或其他科学计算中, 就有可能出现性能下降的问题, 就有可能出现性能下降的问题။

本文将以本文将以()函数为例, 分析在 php 中如何排查性能瓶颈, 并给出相应的优化建议, 并给出相应的优化建议။

一, 性能瓶颈排查方法

1 ။ 使用 Microtime () 精准测量耗时

最基础的方式是使用Microtime (True)对循环进行包裹, 测量函数运行前后时间差, 测量函数运行前后时间差: 例如:

 <span><span><span class="hljs-meta"><?php</span></span><span>
</span><span><span class="hljs-variable">$start</span></span><span> = </span><span><span class="hljs-title function_ invoke__">microtime</span></span><span>(</span><span><span class="hljs-literal">true</span></span><span>);

</span><span><span class="hljs-keyword">for</span></span><span> (</span><span><span class="hljs-variable">$i</span></span><span> = </span><span><span class="hljs-number">0</span></span><span>; </span><span><span class="hljs-variable">$i</span></span><span> < </span><span><span class="hljs-number">1000000</span></span><span>; </span><span><span class="hljs-variable">$i</span></span><span>++) {
    </span><span><span class="hljs-variable">$result</span></span><span> = </span><span><span class="hljs-title function_ invoke__">cosh</span></span><span>(</span><span><span class="hljs-variable">$i</span></span><span> * </span><span><span class="hljs-number">0.0001</span></span><span>);
}

</span><span><span class="hljs-variable">$end</span></span><span> = </span><span><span class="hljs-title function_ invoke__">microtime</span></span><span>(</span><span><span class="hljs-literal">true</span></span><span>);
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">"&#25191;&#34892;&#26102;&#38388;: "</span></span><span> . (</span><span><span class="hljs-variable">$end</span></span><span> - </span><span><span class="hljs-variable">$start</span></span><span>) . </span><span><span class="hljs-string">" &#31186;"</span></span><span>;
</span><span><span class="hljs-meta">?></span></span><span>
</span></span>

通过这种方式可以初步判断是否cosh ()函数成为了主要的性能消耗源။

2 ။ 使用 xdebug + webrit 可视化分析

xdebug 是 php 的强大调试和性能分析工具, 通过它配合 webritgrit 或 QCCRCRAGRITH, 可以详细分析函数调用的耗时။

安装完 xdebug 后,

 <span><span><span class="hljs-attr">xdebug.mode</span></span><span>=profile
</span><span><span class="hljs-attr">xdebug.output_dir</span></span><span>=</span><span><span class="hljs-string">"/tmp"</span></span><span>
</span></span>

运行目标脚本后, 会生成.caccachreind文件, 然后通过 webrit 打开分析, 查看cosh ()函数在整个调用栈中所占时间比例။

更多信息可以参考: https://gitbox.net/docs/php-xdebug-Profiler-upiler

3 ။ 分析内存占用与 CPU 使用情况

如果你运行的是长时间执行的 php 脚本 (如 cli 任务), 可以使用Top , HTPH php php 进程的 CPU 和内存使用状况။ 也可以在脚本中使用Memory_Get_usage ()进行内存快照记录။

二, 优化建议

1 ။ 减少不必要的cosh ()调用

如果cosh ()函数的参数是重复的或可以被缓存, 可以使用数组缓存其结果, 避免重复计算: 避免重复计算:

 <span><span><span class="hljs-meta"><?php</span></span><span>
</span><span><span class="hljs-variable">$cache</span></span><span> = [];
</span><span><span class="hljs-keyword">for</span></span><span> (</span><span><span class="hljs-variable">$i</span></span><span> = </span><span><span class="hljs-number">0</span></span><span>; </span><span><span class="hljs-variable">$i</span></span><span> < </span><span><span class="hljs-number">1000000</span></span><span>; </span><span><span class="hljs-variable">$i</span></span><span>++) {
    </span><span><span class="hljs-variable">$arg</span></span><span> = </span><span><span class="hljs-variable">$i</span></span><span> * </span><span><span class="hljs-number">0.0001</span></span><span>;
    </span><span><span class="hljs-keyword">if</span></span><span> (!</span><span><span class="hljs-keyword">isset</span></span><span>(</span><span><span class="hljs-variable">$cache</span></span><span>[</span><span><span class="hljs-variable">$arg</span></span><span>])) {
        </span><span><span class="hljs-variable">$cache</span></span><span>[</span><span><span class="hljs-variable">$arg</span></span><span>] = </span><span><span class="hljs-title function_ invoke__">cosh</span></span><span>(</span><span><span class="hljs-variable">$arg</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-variable">$arg</span></span><span>];
}
</span><span><span class="hljs-meta">?></span></span><span>
</span></span>

2 ။ 精简精度, 换用近似算法

对于一些应用场景, 特别是图形渲染或实时性要求较高的系统, 可以考虑用双曲余弦的泰勒级数近似实现来替代内置函数, 可以考虑用双曲余弦的泰勒级数近似实现来替代内置函数။

 <span><span><span class="hljs-meta"><?php</span></span><span>
</span><span><span class="hljs-function"><span class="hljs-keyword">function</span></span></span><span> </span><span><span class="hljs-title">cosh_approx</span></span><span>(</span><span><span class="hljs-params"><span class="hljs-variable">$x</span></span></span><span>, </span><span><span class="hljs-variable">$terms</span></span><span> = </span><span><span class="hljs-number">5</span></span><span>) {
    </span><span><span class="hljs-variable">$sum</span></span><span> = </span><span><span class="hljs-number">0</span></span><span>;
    </span><span><span class="hljs-keyword">for</span></span><span> (</span><span><span class="hljs-variable">$n</span></span><span> = </span><span><span class="hljs-number">0</span></span><span>; </span><span><span class="hljs-variable">$n</span></span><span> < </span><span><span class="hljs-variable">$terms</span></span><span>; </span><span><span class="hljs-variable">$n</span></span><span>++) {
        </span><span><span class="hljs-variable">$sum</span></span><span> += </span><span><span class="hljs-title function_ invoke__">pow</span></span><span>(</span><span><span class="hljs-variable">$x</span></span><span>, </span><span><span class="hljs-number">2</span></span><span> * </span><span><span class="hljs-variable">$n</span></span><span>) / </span><span><span class="hljs-title function_ invoke__">gmp_intval</span></span><span>(</span><span><span class="hljs-title function_ invoke__">gmp_fact</span></span><span>(</span><span><span class="hljs-number">2</span></span><span> * </span><span><span class="hljs-variable">$n</span></span><span>));
    }
    </span><span><span class="hljs-keyword">return</span></span><span> </span><span><span class="hljs-variable">$sum</span></span><span>;
}
</span></span>

注意这种方式适用于参数范围较小的情形, 且结果精度需评估။

3 ။ 使用多进程或多线程处理

在 cli 环境中, 如果要并行处理大量数据, 可以使用pcntl_fork ()或者palallel或者, 提升整体吞吐量, 提升整体吞吐量: 提升整体吞吐量။

 <span><span><span class="hljs-meta"><?php</span></span><span>
</span><span><span class="hljs-variable">$processes</span></span><span> = </span><span><span class="hljs-number">4</span></span><span>;
</span><span><span class="hljs-variable">$segment</span></span><span> = </span><span><span class="hljs-number">250000</span></span><span>;

</span><span><span class="hljs-keyword">for</span></span><span> (</span><span><span class="hljs-variable">$i</span></span><span> = </span><span><span class="hljs-number">0</span></span><span>; </span><span><span class="hljs-variable">$i</span></span><span> < </span><span><span class="hljs-variable">$processes</span></span><span>; </span><span><span class="hljs-variable">$i</span></span><span>++) {
    </span><span><span class="hljs-variable">$pid</span></span><span> = </span><span><span class="hljs-title function_ invoke__">pcntl_fork</span></span><span>();
    </span><span><span class="hljs-keyword">if</span></span><span> (</span><span><span class="hljs-variable">$pid</span></span><span> === </span><span><span class="hljs-number">0</span></span><span>) {
        </span><span><span class="hljs-keyword">for</span></span><span> (</span><span><span class="hljs-variable">$j</span></span><span> = </span><span><span class="hljs-variable">$i</span></span><span> * </span><span><span class="hljs-variable">$segment</span></span><span>; </span><span><span class="hljs-variable">$j</span></span><span> < (</span><span><span class="hljs-variable">$i</span></span><span> + </span><span><span class="hljs-number">1</span></span><span>) * </span><span><span class="hljs-variable">$segment</span></span><span>; </span><span><span class="hljs-variable">$j</span></span><span>++) {
            </span><span><span class="hljs-variable">$result</span></span><span> = </span><span><span class="hljs-title function_ invoke__">cosh</span></span><span>(</span><span><span class="hljs-variable">$j</span></span><span> * </span><span><span class="hljs-number">0.0001</span></span><span>);
        }
        </span><span><span class="hljs-keyword">exit</span></span><span>;
    }
}
</span><span><span class="hljs-keyword">while</span></span><span> (</span><span><span class="hljs-title function_ invoke__">pcntl_waitpid</span></span><span>(</span><span><span class="hljs-number">0</span></span><span>, </span><span><span class="hljs-variable">$status</span></span><span>) !== -</span><span><span class="hljs-number">1</span></span><span>);
</span><span><span class="hljs-meta">?></span></span><span>
</span></span>

4 ။ 考虑调用更高效的 c 扩展或通过 ffi

对于极限性能需求, 可以考虑将部分计算用 c 编写为扩展模块, php php 7.4+ 的 ffi 功能, 调用外部的高性能数学库, 调用外部的高性能数学库။

更多示例详见https://gitbox.net/artet/artet/artnices/php-ffi-pormance-math

三, 结语

虽然 php 并非为高性能科学计算设计, 但通过合理的优化策略, 仍然可以在某些场景下发挥其潜力။ 在使用如cosh (ch,这类数学函数进行大规模循环计算时, 这类数学函数进行大规模循环计算时, 务必借助性能分析工具找出瓶颈, 并采用缓存, 并采用缓存, 并行处理或本地扩展等方式加以优化, 并行处理或本地扩展等方式加以优化, 并行处理或本地扩展等方式加以优化, 并行处理或本地扩展等方式加以优化။