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

我有一个脚本,它调用这个函数超过10万次,所以我希望无论如何都能从中获得更高的性能

你能推荐一种用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));

}
会比以前快

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";
?>