Php 优化此功能
我有一个脚本,它调用这个函数超过10万次,所以我希望无论如何都能从中获得更高的性能 你能推荐一种用PHP计算标准偏差的优化方法或替代方法吗Php 优化此功能,php,optimization,micro-optimization,Php,Optimization,Micro Optimization,我有一个脚本,它调用这个函数超过10万次,所以我希望无论如何都能从中获得更高的性能 你能推荐一种用PHP计算标准偏差的优化方法或替代方法吗 function calcStandardDev($samples){ $sample_count = count($samples); for ($current_sample = 0; $sample_count > $current_sample; ++$current_sample) $sample_square[$cur
function calcStandardDev($samples){
$sample_count = count($samples);
for ($current_sample = 0; $sample_count > $current_sample; ++$current_sample) $sample_square[$current_sample] = pow($samples[$current_sample], 2);
return sqrt(array_sum($sample_square) / $sample_count - pow((array_sum($samples) / $sample_count), 2));
}
会比以前快
pow($samples[$current_sample], 2)
因为它没有函数调用的开销
然后你也可以简化
pow((array_sum($samples) / $sample_count), 2));
防止再次调用pow()函数
为了避免数组_sum($samples)由于该更改而被调用两次,请计算一次并在循环之前存储到一个var,然后在公式中引用该var
编辑
function calcStandardDev($samples){
$sample_count = count($samples);
$sumSamples = array_sum($samples);
for ($current_sample = 0; $sample_count > $current_sample; ++$current_sample)
$sample_square[$current_sample] = $samples[$current_sample] * $samples[$current_sample];
return sqrt(array_sum($sample_square) / $sample_count - ( ($sumSamples / $sample_count) *
($sumSamples / $sample_count)
)
);
}
通过自己计算相应的值来替换对
array\u sum
的两个调用。这样,您只需遍历阵列一次,而不是三次
function calcStandardDev($samples){
$sample_count = count($samples);
$sum = 0;
$sum_sqaure = 0;
for ($current_sample = 0; $sample_count > $current_sample; ++$current_sample) {
$sum_square += pow($samples[$current_sample], 2);
$sum += $samples[$current_sample];
}
return sqrt( $sum_square / $sample_count - pow( $sum / $sample_count, 2));
}
foreach by reference比for快,因为您已经有了一个循环,您可以在这个循环中计算“sum”。$x*$x比pow快得多($x,2); 有一些功能比较。希望对你有所帮助 您的函数microtime=~0.526 第二个函数=~0.290
<?php
function calcStandardDev($samples)
{
$sample_count = count($samples);
for ($current_sample = 0; $sample_count > $current_sample; ++$current_sample)
$sample_square[$current_sample] = pow($samples[$current_sample], 2);
return sqrt(array_sum($sample_square) / $sample_count - pow((array_sum($samples) / $sample_count), 2));
}
function calcStandardDev2($samples)
{
$sample_count = count($samples);
$sum_sample_square = 0;
$sum_sample = 0;
foreach ($samples as &$sample)
{
$sum_sample += $sample;
$sum_sample_square += $sample * $sample;
}
return sqrt($sum_sample_square / $sample_count - pow($sum_sample / $sample_count,2));
}
function calcStandardDev3($samples)
{
$sample_count = count($samples);
$sum_sample_square = 0;
$sum_sample = 0;
foreach ($samples as &$sample)
{
$sum_sample += $sample;
$sum_sample_square += pow($sample ,2);
}
return sqrt($sum_sample_square / $sample_count - pow($sum_sample / $sample_count,2));
}
echo "<pre>";
$samples = range(2,100000);
$start = microtime(true);
echo calcStandardDev($samples)."\r\n";
$end = microtime(true);
echo $end - $start ."\r\n";
echo "-------\r\n";
$start = microtime(true);
echo calcStandardDev2($samples)."\r\n";
$end = microtime(true);
echo $end - $start."\r\n";
echo "-------\r\n";
$start = microtime(true);
echo calcStandardDev3($samples)."\r\n";
$end = microtime(true);
echo $end - $start;
echo "-------\r\n";
?>
您正在计算两次array\u sum($sample\u square)/$sample\u count
。@OliCharlesworth第二次是array\u sum($samples)/$sample\u count
。所以没有重复。可能更快?我不认为每个循环中的$samples
都是相同的call@Vytautas-我在任何地方都看不到$samples在改变,谢谢!在所有的解决方案中,发布为calcStandardDev2()的是最快的,我们已经计算出版本2是最快的,但是作为回报,您仍然有一个pow(),这会不会更快地替换返回行中对pow的调用?我的测试结果是否定的,但差别很小——思想?
<?php
function calcStandardDev($samples)
{
$sample_count = count($samples);
for ($current_sample = 0; $sample_count > $current_sample; ++$current_sample)
$sample_square[$current_sample] = pow($samples[$current_sample], 2);
return sqrt(array_sum($sample_square) / $sample_count - pow((array_sum($samples) / $sample_count), 2));
}
function calcStandardDev2($samples)
{
$sample_count = count($samples);
$sum_sample_square = 0;
$sum_sample = 0;
foreach ($samples as &$sample)
{
$sum_sample += $sample;
$sum_sample_square += $sample * $sample;
}
return sqrt($sum_sample_square / $sample_count - pow($sum_sample / $sample_count,2));
}
function calcStandardDev3($samples)
{
$sample_count = count($samples);
$sum_sample_square = 0;
$sum_sample = 0;
foreach ($samples as &$sample)
{
$sum_sample += $sample;
$sum_sample_square += pow($sample ,2);
}
return sqrt($sum_sample_square / $sample_count - pow($sum_sample / $sample_count,2));
}
echo "<pre>";
$samples = range(2,100000);
$start = microtime(true);
echo calcStandardDev($samples)."\r\n";
$end = microtime(true);
echo $end - $start ."\r\n";
echo "-------\r\n";
$start = microtime(true);
echo calcStandardDev2($samples)."\r\n";
$end = microtime(true);
echo $end - $start."\r\n";
echo "-------\r\n";
$start = microtime(true);
echo calcStandardDev3($samples)."\r\n";
$end = microtime(true);
echo $end - $start;
echo "-------\r\n";
?>