性能测试

以下性能测试更新于2020/01/20.

测试机:

  • Intel(R) Xeon(R) Platinum 8255C CPU @ 2.50GHz (腾讯云标准型S5)
  • Linux version 4.15.0-54-generic (buildd@lgw01-amd64-014) (gcc version 7.4.0 (Ubuntu 7.4.0-1ubuntu1~18.04.1)) #58-Ubuntu SMP Mon Jun 24 10:55:24 UTC 2019
  • PHP 7.2.24-0ubuntu0.18.04.2 (cli) (built: Jan 13 2020 18:39:59) ( NTS )

单位:秒

标识 未加密 推荐 PHP 5.2 最大保护 最大性能
simple 0.022 4.387 4.056 4.552 2.414
encrypted_call_encrypted(10000) / 30.883 42.355 23.515 28.635
encrypted_call_unencrypted(10000) / 0.221 0.420 0.231 0.214
unencrypted_call_encrypted(10000) / 30.876 40.878 23.178 28.488
call_system 0.002 0.022 0.022 0.021 0.012
mandel 0.080 19.002 19.875 83.853 9.626
mandel2 0.089 18.979 20.257 88.623 12.450
ackermann(4) 0 38.845 53.054 43.567 32.894
ary(50000) 0.006 0.346 0.537 0.357 0.185
ary2(50000) 0.004 0.121 0.145 0.145 0.110
ary3(2000) 0.045 8.154 7.951 26.530 5.504
fibo(15) 0 6.801 9.706 6.531 5.954
hash1(50000) 0.011 1.548 2.487 1.582 1.410
hash2(500) 0.008 1.608 1.018 3.041 0.567
heapsort(1000) 0.001 3.441 4.763 3.475 3.073
matrix(20) 0.024 2.993 2.997 7.926 1.833
nestedloop(12) 0.041 7.644 7.545 8.008 3.976
sieve(30) 0.014 3.893 2.732 10.243 1.669
strcat(200000) 0.004 19.296 21.254 19.791 18.702

测试代码:

<?php
if (function_exists("date_default_timezone_set")) {
    date_default_timezone_set("UTC");
}
function simple() {
  $a = 0;
  for ($i = 0; $i < 1000000; $i++)
    $a++;
  $thisisanotherlongname = 0;
  for ($thisisalongname = 0; $thisisalongname < 1000000; $thisisalongname++)
    $thisisanotherlongname++;
}
/****/
function call_system() {
  for ($i = 0; $i < 10000; $i++)
    strlen("hallo");
}
/****/
function hallo($a) {
}
function encrypted_call_encrypted($n) {
  for ($i = 0; $i < $n; $i++)
    hallo("hallo");
}
/****/
function encrypted_call_unencrypted($n) {
  for ($i = 0; $i < $n; $i++)
    hallo2("hallo");
}
/**
 * @Z5NotEncrypt
 */
function unencrypted_call_encrypted($n) {
  for ($i = 0; $i < $n; $i++)
    hallo("hallo");
}
/**
 * @Z5NotEncrypt
 */
function hallo2($a) {
}
/****/
function mandel() {
  $w1=50;
  $h1=150;
  $recen=-.45;
  $imcen=0.0;
  $r=0.7;
  $s=0;  $rec=0;  $imc=0;  $re=0;  $im=0;  $re2=0;  $im2=0;
  $x=0;  $y=0;  $w2=0;  $h2=0;  $color=0;
  $s=2*$r/$w1;
  $w2=40;
  $h2=12;
  for ($y=0 ; $y<=$w1; $y=$y+1) {
    $imc=$s*($y-$h2)+$imcen;
    for ($x=0 ; $x<=$h1; $x=$x+1) {
      $rec=$s*($x-$w2)+$recen;
      $re=$rec;
      $im=$imc;
      $color=1000;
      $re2=$re*$re;
      $im2=$im*$im;
      while( ((($re2+$im2)<1000000) && $color>0)) {
        $im=$re*$im*2+$imc;
        $re=$re2-$im2+$rec;
        $re2=$re*$re;
        $im2=$im*$im;
        $color=$color-1;
      }
      if ( $color==0 ) {
        print "_";
      } else {
        print "#";
      }
    }
    print "<br>";
    flush();
  }
}
/****/
function mandel2() {
  $b = " .:,;!/>)|&IH%*#";
  //float r, i, z, Z, t, c, C;
  for ($y=30; printf("\n"), $C = $y*0.1 - 1.5, $y--;){
    for ($x=0; $c = $x*0.04 - 2, $z=0, $Z=0, $x++ < 75;){
      for ($r=$c, $i=$C, $k=0; $t = $z*$z - $Z*$Z + $r, $Z = 2*$z*$Z + $i, $z=$t, $k<5000; $k++)
        if ($z*$z + $Z*$Z > 500000) break;
      echo $b[$k%16];
    }
  }
}
/****/
function Ack($m, $n){
  if($m == 0) return $n+1;
  if($n == 0) return Ack($m-1, 1);
  return Ack($m - 1, Ack($m, ($n - 1)));
}
function ackermann($n) {
  $r = Ack(3,$n);
  print "Ack(3,$n): $r\n";
}
/****/
function ary($n) {
  for ($i=0; $i<$n; $i++) {
    $X[$i] = $i;
  }
  for ($i=$n-1; $i>=0; $i--) {
    $Y[$i] = $X[$i];
  }
  $last = $n-1;
  print "$Y[$last]\n";
}
/****/
function ary2($n) {
  for ($i=0; $i<$n;) {
    $X[$i] = $i; ++$i;
    $X[$i] = $i; ++$i;
    $X[$i] = $i; ++$i;
    $X[$i] = $i; ++$i;
    $X[$i] = $i; ++$i;
    $X[$i] = $i; ++$i;
    $X[$i] = $i; ++$i;
    $X[$i] = $i; ++$i;
    $X[$i] = $i; ++$i;
    $X[$i] = $i; ++$i;
  }
  for ($i=$n-1; $i>=0;) {
    $Y[$i] = $X[$i]; --$i;
    $Y[$i] = $X[$i]; --$i;
    $Y[$i] = $X[$i]; --$i;
    $Y[$i] = $X[$i]; --$i;
    $Y[$i] = $X[$i]; --$i;
    $Y[$i] = $X[$i]; --$i;
    $Y[$i] = $X[$i]; --$i;
    $Y[$i] = $X[$i]; --$i;
    $Y[$i] = $X[$i]; --$i;
    $Y[$i] = $X[$i]; --$i;
  }
  $last = $n-1;
  print "$Y[$last]\n";
}
/****/
function ary3($n) {
  for ($i=0; $i<$n; $i++) {
    $X[$i] = $i + 1;
    $Y[$i] = 0;
  }
  for ($k=0; $k<1000; $k++) {
    for ($i=$n-1; $i>=0; $i--) {
      $Y[$i] += $X[$i];
    }
  }
  $last = $n-1;
  print "$Y[0] $Y[$last]\n";
}
/****/
function fibo_r($n){
    return(($n < 2) ? 1 : fibo_r($n - 2) + fibo_r($n - 1));
}
function fibo($n) {
  $r = fibo_r($n);
  print "$r\n";
}
/****/
function hash1($n) {
  for ($i = 1; $i <= $n; $i++) {
    $X[dechex($i)] = $i;
  }
  $c = 0;
  for ($i = $n; $i > 0; $i--) {
    if ($X[dechex($i)]) { $c++; }
  }
  print "$c\n";
}
/****/
function hash2($n) {
  for ($i = 0; $i < $n; $i++) {
    $hash1["foo_$i"] = $i;
    $hash2["foo_$i"] = 0;
  }
  for ($i = $n; $i > 0; $i--) {
    foreach($hash1 as $key => $value) $hash2[$key] += $value;
  }
  $first = "foo_0";
  $last  = "foo_".($n-1);
  print "$hash1[$first] $hash1[$last] $hash2[$first] $hash2[$last]\n";
}
/****/
function gen_random ($n) {
    global $LAST;
    return( ($n * ($LAST = ($LAST * IA + IC) % IM)) / IM );
}
function heapsort_r($n, &$ra) {
    $l = ($n >> 1) + 1;
    $ir = $n;
    while (1) {
    if ($l > 1) {
        $rra = $ra[--$l];
    } else {
        $rra = $ra[$ir];
        $ra[$ir] = $ra[1];
        if (--$ir == 1) {
        $ra[1] = $rra;
        return;
        }
    }
    $i = $l;
    $j = $l << 1;
    while ($j <= $ir) {
        if (($j < $ir) && ($ra[$j] < $ra[$j+1])) {
        $j++;
        }
        if ($rra < $ra[$j]) {
        $ra[$i] = $ra[$j];
        $j += ($i = $j);
        } else {
        $j = $ir + 1;
        }
    }
    $ra[$i] = $rra;
    }
}
function heapsort($N) {
  global $LAST;
  define("IM", 139968);
  define("IA", 3877);
  define("IC", 29573);
  $LAST = 42;
  for ($i=1; $i<=$N; $i++) {
    $ary[$i] = gen_random(1);
  }
  heapsort_r($N, $ary);
  printf("%.10f\n", $ary[$N]);
}
/****/
function mkmatrix ($rows, $cols) {
    $count = 1;
    $mx = array();
    for ($i=0; $i<$rows; $i++) {
    for ($j=0; $j<$cols; $j++) {
        $mx[$i][$j] = $count++;
    }
    }
    return($mx);
}
function mmult ($rows, $cols, $m1, $m2) {
    $m3 = array();
    for ($i=0; $i<$rows; $i++) {
    for ($j=0; $j<$cols; $j++) {
        $x = 0;
        for ($k=0; $k<$cols; $k++) {
        $x += $m1[$i][$k] * $m2[$k][$j];
        }
        $m3[$i][$j] = $x;
    }
    }
    return($m3);
}
function matrix($n) {
  $SIZE = 30;
  $m1 = mkmatrix($SIZE, $SIZE);
  $m2 = mkmatrix($SIZE, $SIZE);
  while ($n--) {
    $mm = mmult($SIZE, $SIZE, $m1, $m2);
  }
  print "{$mm[0][0]} {$mm[2][3]} {$mm[3][2]} {$mm[4][4]}\n";
}
/****/
function nestedloop($n) {
  $x = 0;
  for ($a=0; $a<$n; $a++)
    for ($b=0; $b<$n; $b++)
      for ($c=0; $c<$n; $c++)
        for ($d=0; $d<$n; $d++)
          for ($e=0; $e<$n; $e++)
            for ($f=0; $f<$n; $f++)
             $x++;
  print "$x\n";
}
/****/
function sieve($n) {
  $count = 0;
  while ($n-- > 0) {
    $count = 0;
    $flags = range (0,8192);
    for ($i=2; $i<8193; $i++) {
      if ($flags[$i] > 0) {
        for ($k=$i+$i; $k <= 8192; $k+=$i) {
          $flags[$k] = 0;
        }
        $count++;
      }
    }
  }
  print "Count: $count\n";
}
/****/
function strcat($n) {
  $str = "";
  while ($n-- > 0) {
    $str .= "hello\n";
  }
  $len = strlen($str);
  print "$len\n";
}
/*****/

/**
 * @Z5NotEncrypt
 */
function gethrtime()
{
  $hrtime = microtime(true);
  return $hrtime;
}

/**
 * @Z5NotEncrypt
 */
function start_test()
{
    ob_start();
  return gethrtime();
}

/**
 * @Z5NotEncrypt
 */
function end_test($start, $name)
{
  global $total;
  $end = gethrtime();
  ob_end_clean();
  $total += $end-$start;
  $num = number_format($end-$start,3);
  $pad = str_repeat(" ", 50-strlen($name)-strlen($num));
  echo $name.$pad.$num."\n";
    ob_start();
  return gethrtime();
}

/**
 * @Z5NotEncrypt
 */
function total()
{
  global $total;
  $pad = str_repeat("-", 50);
  echo $pad."\n";
  $num = number_format($total,3);
  $pad = str_repeat(" ", 50-strlen("Total")-strlen($num));
  echo "Total".$pad.$num."\n";
}
echo "Start test...\n";
$t0 = $t = start_test();
simple();
$t = end_test($t, "simple");
encrypted_call_encrypted(10000);
$t = end_test($t, "encrypted_call_encrypted(10000)");
encrypted_call_unencrypted(10000);
$t = end_test($t, "encrypted_call_unencrypted(10000)");
unencrypted_call_encrypted(100000);
$t = end_test($t, "unencrypted_call_encrypted(10000)");
call_system();
$t = end_test($t, "call_system");
mandel();
$t = end_test($t, "mandel");
mandel2();
$t = end_test($t, "mandel2");
ackermann(4);
$t = end_test($t, "ackermann(4)");
ary(50000);
$t = end_test($t, "ary(50000)");
ary2(50000);
$t = end_test($t, "ary2(50000)");
ary3(2000);
$t = end_test($t, "ary3(2000)");
fibo(15);
$t = end_test($t, "fibo(15)");
hash1(50000);
$t = end_test($t, "hash1(50000)");
hash2(500);
$t = end_test($t, "hash2(500)");
heapsort(1000);
$t = end_test($t, "heapsort(1000)");
matrix(20);
$t = end_test($t, "matrix(20)");
nestedloop(12);
$t = end_test($t, "nestedloop(12)");
sieve(30);
$t = end_test($t, "sieve(30)");
strcat(200000);
$t = end_test($t, "strcat(200000)");
total();