>  기사  >  백엔드 개발  >  PHP 매직 함수의 성능을 자세히 설명하는 샘플 코드

PHP 매직 함수의 성능을 자세히 설명하는 샘플 코드

黄舟
黄舟원래의
2017-03-13 16:37:561537검색

라루앙스 형제가 "마술법"을 사용하는 것은 권장하지 않는다고 언급한 적이 있습니다. 사진 찍으려고? 지난 1~2년 동안 일하느라 바빠서 새로운 지식을 배우느라 이 길에 대한 깊이 있는 탐구를 하지 못하고 올해는 깊이 공부해야 할 한 해였습니다. , 이제 이 문제에 대해 조사를 좀 해야 합니다. 먼저 Bird Brother Laruence가 자신의 블로그에서 언급한 내용을 살펴보겠습니다.

회사 동료들과 PPT를 공유할 때 마법의 방법도 허용되지 않는지 궁금해하시는 분들이 계실 것입니다.

최적화 제안은 사람들이 악용하고 무분별하게 사용하는 것을 방지하기 위한 제안입니다. 코드를 작성할 때 무엇이 ​​느리고 무엇이 빠른지 깨달아 불필요한 매직 메서드 호출을 피할 수 있다면 이것이 바로 최적화입니다. 원하는 효과를 얻으려면 권장됩니다

혼란

  1. 매직 메소드는 정말 성능이 좋지 않나요?

  2. PHP7의 매직 메소드 성능에 여전히 문제가 있나요?

  3. 매직 메소드를 어떻게 합리적으로 사용해야 할까요?

계획

의심에 직면한 내 계획은 다음과 같습니다.

  • 마술 방법을 사용하는 것과 사용하지 않는 것의 통계적 비교 매직 메소드 스크립트의 실행 시간 차이

  • PHP5.6.26-1에서 스크립트가 n번 연속 실행

  • 평균 /최소 통계 실행 시간 값/최대 값

  • PHP7.0.12-2에서 스크립트 n번 연속 실행

  • 평균 통계/ 최소/최대 실행 시간 값

현재 제 개인 능력이 한계가 있어서 이 방법밖에 못 쓰겠습니다. 더 좋은 계획이나 제안이 있으면 알려주시면 감사하겠습니다. 하하. ~

테스트

construct

우선 constructorconstruct의 실험을 살펴보겠습니다.

<?php
/**
 * 魔术方法性能探索
 *
 * 构造函数
 *
 * @author TIGERB <http://www.php.cn/;
 */

require(&#39;./function.php&#39;);
if (!isset($argv[1])) {
    die(&#39;error: variable is_use_magic is empty&#39;);
}
$is_use_magic = $argv[1];

/**
 * 构造函数使用类名
 */
class ClassOne
{
    public function classOne()
    {
        # code...
    }
}

/**
 * 构造函数使用魔术函数construct
 */
class ClassTwo
{
    public function construct()
    {
        # code...
    }
}

$a = getmicrotime();
if ($is_use_magic === &#39;no_magic&#39;) {
    new ClassOne();
}else {
    new ClassTwo();
}
$b = getmicrotime();

echo  ($b-$a) . "\n";
  • PHP5.6 매직 방식을 적용하지 않은 데이터는 다음과 같으며, 단위는 마이크로초 μm

// PHP5.6中连续调用脚本10000次
sh test 10000 no_magic php5 construct

// 运行数据统计脚本
sh analysis ./logs/construct_no_magic_php5.log 10000

// 结果
avg: 34μm
max: 483μm
min: 26μm
  • PHP5입니다. 6 매직 메소드를 사용한 데이터는 다음과 같으며, 단위는 마이크로초 μm

// PHP5.6中连续调用脚本10000次
sh test 10000 magic php5 construct

// 运行数据统计脚本
sh analysis ./logs/construct_magic_php5.log 10000

// 结果
avg: 28μm
max: 896μm
min: 20μm
  • PHP7.0에서는 매직 메소드 데이터를 사용하지 않습니다. 단위는 마이크로초 μm

// PHP7.0中连续调用脚本10000次
sh test 10000 no_magic php construct

// 运行数据统计脚本
sh analysis ./logs/construct_no_magic_php.log 10000

// 结果
avg: 19μm
max: 819μm
min: 13μm
  • PHP7.0은 매직을 사용합니다. 메소드 데이터는 마이크로초 단위 μm

// PHP7.0中连续调用脚本10000次
sh test 10000 magic php construct

// 运行数据统计脚本
sh analysis ./logs/construct_magic_php.log 10000

// 结果
avg: 14μm
max: 157μm
min: 10μm

위의 데이터에서 다음과 같습니다.

생성자로 구문을 사용하는 스크립트의 평균 실행 시간은 더 빠릅니다. 클래스 이름을 생성자로 사용하는 경우 약 5~6 마이크로초 더 빠릅니다. 둘 다 php5.6에서 그렇습니다. 그리고 php7.0.

call

다음으로 호출 실험을 살펴보겠습니다. php 스크립트는 다음과 같습니다.

<?php
/**
 * 魔术方法性能探索
 *
 * 构造函数
 *
 * @author TIGERB <http://www.php.cn/;
 */

require(&#39;./function.php&#39;);
if (!isset($argv[1])) {
    die(&#39;error: variable is_use_magic is empty&#39;);
}
$is_use_magic = $argv[1];

/**
 * 构造函数使用类名
 */
class ClassOne
{
    public function construct()
    {
        # code...
    }

    public function test()
    {
        # code...
    }
}

/**
 * 构造函数使用魔术函数construct
 */
class ClassTwo
{
    public function construct()
    {
        # code...
    }

    public function call($method, $argus)
    {
        # code...
    }
}

$a = getmicrotime();
if ($is_use_magic === &#39;no_magic&#39;) {
    $instance = new ClassOne();
    $instance->test();
}else {
    $instance = new ClassTwo();
    $instance->test();
}
$b = getmicrotime();

echo  ($b-$a) . "\n";
  • PHP5.6은 사용하지 않습니다. 매직 메소드 데이터는 다음과 같습니다. 단위는 마이크로초 μm

// PHP5.6中连续调用脚本10000次
sh test 10000 no_magic php5 call

// 运行数据统计脚本
sh analysis ./logs/call_no_magic_php5.log 10000

// 结果
avg: 27μm
max: 206μm
min: 20μm
  • PHP5.6은 매직 메소드 데이터를 다음과 같이 사용합니다. 단위는 마이크로초 μm

// PHP5.6中连续调用脚本10000次
sh test 10000 magic php5 call

// 运行数据统计脚本
sh analysis ./logs/call_magic_php5.log 10000

// 结果
avg: 29μm
max: 392μm
min: 22μm
  • PHP7.0은 매직 방식을 사용하지 않습니다. 데이터는 마이크로초 μm

// PHP7.0中连续调用脚本10000次
sh test 10000 no_magic php call

// 运行数据统计脚本
sh analysis ./logs/call_no_magic_php.log 10000

// 结果
avg: 16μm
max: 256μm
min: 10μm
  • PHP7.0은 매직 방식을 사용합니다. 데이터는 마이크로초 단위입니다.

  • // PHP7.0中连续调用脚本10000次
    sh test 10000 magic php call
    
    // 运行数据统计脚本
    sh analysis ./logs/call_magic_php.log 10000
    
    // 结果
    avg: 18μm
    max: 2459μm
    min: 11μm
위의 데이터에서 확인할 수 있습니다.

호출을 사용하는 스크립트의 평균 실행 시간은 호출이 없는 경우보다 느립니다. php5.6이든 php7.0이든

약 2배 더 느린 마이크로초입니다.

callStatic

다음으로 callStatic 실험을 살펴보겠습니다. php 스크립트는 다음과 같습니다.

<?php
/**
 * 魔术方法性能探索
 *
 * 静态重载函数
 *
 * @author TIGERB <http://www.php.cn/;
 */

require(&#39;./function.php&#39;);
if (!isset($argv[1])) {
    die(&#39;error: variable is_use_magic is empty&#39;);
}
$is_use_magic = $argv[1];

/**
 * 存在test静态方法
 */
class ClassOne
{
    public function construct()
    {
        # code...
    }

    public static function test()
    {
        # code...
    }
}

/**
 * 使用重载实现test
 */
class ClassTwo
{
    public function construct()
    {
        # code...
    }

    public static function callStatic($method, $argus)
    {
        # code...
    }
}

$a = getmicrotime();
if ($is_use_magic === &#39;no_magic&#39;) {
    ClassOne::test();
}else {
    ClassTwo::test();
}
$b = getmicrotime();

echo  ($b-$a) . "\n";

  • PHP5.6은 사용하지 않습니다. 매직 메소드 데이터는 다음과 같습니다. 단위 마이크로초 μm

  • // PHP5.6中连续调用脚本10000次
    sh test 10000 no_magic php5 callStatic
    
    // 运行数据统计脚本
    sh analysis ./logs/callStatic_no_magic_php5.log 10000
    
    // 结果
    avg: 25μm
    max: 129μm
    min: 19μm
  • PHP5.6은 매직 메소드 데이터를 다음과 같이 사용하며, 단위 마이크로초 μm

  • // PHP5.6中连续调用脚本10000次
    sh test 10000 magic php5 callStatic
    
    // 运行数据统计脚本
    sh analysis ./logs/callStatic_magic_php5.log 10000
    
    // 结果
    avg: 28μm
    max: 580μm
    min: 20μm
  • PHP7.0은 매직 방식을 사용하지 않습니다. 데이터는 마이크로초 μm

  • // PHP7.0中连续调用脚本10000次
    sh test 10000 no_magic php callStatic
    
    // 运行数据统计脚本
    sh analysis ./logs/callStatic_no_magic_php.log 10000
    
    // 结果
    avg: 14μm
    max: 130μm
    min: 9μm
    PHP7.0은 매직 방식을 사용합니다. 마이크로초 단위는 다음과 같습니다.
  • // PHP7.0中连续调用脚本10000次
    sh test 10000 magic php callStatic
    
    // 运行数据统计脚本
    sh analysis ./logs/callStatic_magic_php.log 10000
    
    // 结果
    avg: 14μm
    max: 159μm
    min: 10μm
  • 위의 데이터에서 확인할 수 있습니다.

평균 실행 시간 의 php5.6에서 callStatic을 사용하는 스크립트는 사용하지 않는 것보다 느립니다.

약 3마이크로초 더 느립니다

;php7.0에서 callStatic을 사용하는 스크립트의 평균 실행 시간은 callStatic을 사용하지 않는 것과 대략 같습니다. set

다음으로 set의 실험을 살펴보겠습니다. php 스크립트는 다음과 같습니다.

<?php
/**
 * 魔术方法性能探索
 *
 * 设置私有属性set
 *
 * @author TIGERB <http://www.php.cn/;
 */

require(&#39;./function.php&#39;);
if (!isset($argv[1])) {
    die(&#39;error: variable is_use_magic is empty&#39;);
}
$is_use_magic = $argv[1];

/**
 * 实现公共方法设置私有属性
 */
class ClassOne
{
    /**
     * 私有属性
     *
     * @var string
     */
    private $someVariable = &#39;private&#39;;

    public function construct()
    {
        # code...
    }

    public function setSomeVariable($value = &#39;&#39;)
    {
        $this->someVariable = $value;
    }
}

/**
 * 使用_set设置私有属性
 */
class ClassTwo
{
    /**
     * 私有属性
     *
     * @var string
     */
    private $someVariable = &#39;private&#39;;

    public function construct()
    {
        # code...
    }

    public function set($name = &#39;&#39;, $value = &#39;&#39;)
    {
        $this->$name = $value;
    }
}

$a = getmicrotime();
if ($is_use_magic === &#39;no_magic&#39;) {
    $instance = new ClassOne();
    $instance->setSomeVariable(&#39;public&#39;);
}else {
    $instance = new ClassTwo();
    $instance->someVariable = &#39;public&#39;;
}
$b = getmicrotime();

echo  ($b-$a) . "\n";

    PHP5.6은 사용하지 않습니다. 매직 메소드는 다음과 같습니다. 마이크로초 단위
  • // PHP5.6中连续调用脚本10000次
    sh test 10000 no_magic php5 set
    // 运行数据统计脚本
    sh analysis ./logs/set_no_magic_php5.log 10000
    
    // 结果
    avg: 31μm
    max: 110μm
    min: 24μm
    PHP5.6은 매직 메소드를 사용합니다. 🎜>
  • // PHP5.6中连续调用脚本10000次
    sh test 10000 magic php5 set
    // 运行数据统计脚本
    sh analysis ./logs/set_magic_php5.log 10000
    
    // 结果
    avg: 33μm
    max: 138μm
    min: 25μm

PHP7.0은 마법 방식을 사용하지 않습니다. Second μm
  • // PHP7.0中连续调用脚本10000次
    sh test 10000 no_magic php set
    // 运行数据统计脚本
    sh analysis ./logs/set_no_magic_php.log 10000
    
    // 结果
    avg: 15μm
    max: 441μm
    min: 11μm

PHP7 .0은 다음과 같이 매직 메소드 데이터를 사용합니다. 단위는 마이크로초 μm
  • // PHP7.0中连续调用脚本10000次
    sh test 10000 magic php set
    // 运行数据统计脚本
    sh analysis ./logs/set_magic_php.log 10000
    
    // 结果
    avg: 17μm
    max: 120μm
    min: 11μm

    가 위에 전달됩니다. 데이터에서 볼 수 있습니다.
다음을 사용하는 스크립트의 평균 실행 시간 set은 php5.6에서든 php7.0에서든 사용하지 않는 것보다

약 2마이크로초 더 느립니다

.

get

다음으로 get 실험을 살펴보겠습니다. php 스크립트는 다음과 같습니다.

<?php
/**
 * 魔术方法性能探索
 *
 * 读取私有属性get
 *
 * @author TIGERB <http://www.php.cn/;
 */

require(&#39;./function.php&#39;);
if (!isset($argv[1])) {
    die(&#39;error: variable is_use_magic is empty&#39;);
}
$is_use_magic = $argv[1];

/**
 * 实现公共方法获取私有属性
 */
class ClassOne
{
    /**
     * 私有属性
     *
     * @var string
     */
    private $someVariable = &#39;private&#39;;

    public function construct()
    {
        # code...
    }

    public function getSomeVariable()
    {
        return $this->someVariable;
    }
}

/**
 * 使用_get获取私有属性
 */
class ClassTwo
{
    /**
     * 私有属性
     *
     * @var string
     */
    private $someVariable = &#39;private&#39;;

    public function construct()
    {
        # code...
    }

    public function get($name = &#39;&#39;)
    {
        return $this->$name;
    }
}

$a = getmicrotime();
if ($is_use_magic === &#39;no_magic&#39;) {
    $instance = new ClassOne();
    $instance->getSomeVariable();
}else {
    $instance = new ClassTwo();
    $instance->someVariable;
}
$b = getmicrotime();

echo  ($b-$a) . "\n";
  • PHP5.6不使用魔术方法数据如下,单位微秒μm

// PHP5.6中连续调用脚本10000次
sh test 10000 no_magic php5 get
// 运行数据统计脚本
sh analysis ./logs/get_no_magic_php5.log 10000

// 结果
avg: 28μm
max: 590μm
min: 20μm
  • PHP5.6使用魔术方法数据如下,单位微秒μm

// PHP5.6中连续调用脚本10000次
sh test 10000 magic php5 get
// 运行数据统计脚本
sh analysis ./logs/get_magic_php5.log 10000

// 结果
avg: 28μm
max: 211μm
min: 22μm
  • PHP7.0不使用魔术方法数据如下,单位微秒μm

// PHP7.0中连续调用脚本10000次
sh test 10000 no_magic php get
// 运行数据统计脚本
sh analysis ./logs/get_no_magic_php.log 10000

// 结果
avg: 16μm
max: 295μm
min: 10μm
  • PHP7.0使用魔术方法数据如下,单位微秒μm

// PHP7.0中连续调用脚本10000次
sh test 10000 magic php get
// 运行数据统计脚本
sh analysis ./logs/get_magic_php.log 10000

// 结果
avg: 19μm
max: 525μm
min: 12μm

通过上面的数据我们可以看出:

在php5.6中使用get的脚本执行的平均时间是要大致等于不使用get的;在php7.0中使用get的脚本执行的平均时间是要慢于不使用, 大概慢3微秒

结语

这里主要测试了construct(), call(), callStatic(), get(), set()这五个常用的且可有其他实现方式代替的魔法函数。通过上面的测试再回来解答我的疑惑

  1. 魔术方法真的性能比较差吗?

答:除了使用construct之外,这里使用其他的魔法方法的时间大致慢10微妙以内。

  1. PHP7里使用魔术方法的性能还是存在问题吗?

答:在PHP7中使用与不使用魔术方法之间的差异和在PHP5.6中近乎一致。

  1. 我们应该如何合理的使用魔术方法?

答:通过整个测试我们可以看出使不使用魔法方法这之间的执行时间差异大致都是在10微妙以内的,所以如果魔法方法可以很好的节省我们的开发成本和优化我们的代码结构,我们应该可以考虑牺牲掉这不到10微妙。而construct是要快的,所以使用construct应该没什么异议。

위 내용은 PHP 매직 함수의 성능을 자세히 설명하는 샘플 코드의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.