백엔드 개발 PHP 튜토리얼 PHP代码优化之成员变量获取速度对比_PHP教程

PHP代码优化之成员变量获取速度对比_PHP教程

Jul 13, 2016 am 10:36 AM
PHP 코드 최적화 PHP 최적화 PHP 성능 최적화

有如下4个代码示例,你认为他们创建对象,并且获得成员变量的速度排序是怎样的?

1:将成员变量设置为public,通过赋值操作给成员变量赋值,直接获取变量

复制代码 代码如下:

class Foo {
    public $id;
}
$data = new Foo;
$data->id = 10;
echo $data->id;
?>

2:将成员变量设置为public,通过构造函数设置成员变量的值,直接获取变量
复制代码 代码如下:

class Foo2 {
 public $id;
 public function __construct($id) {
  $this->id = $id;
 }
}

$data = new Foo2(10);
echo $data->id;
?>


3:将成员变量设置为protected,通过构造函数设置成员变量的值,通过魔术方法获取变量
复制代码 代码如下:

class Foo3 {
 protected $id;
 public function __construct($id) {
  $this->id = $id;
 }

 public function getId() {
  return $this->id;
 }
}
$data = new Foo3(10);
echo $data->getId();
?>


4:将成员变量设置为protected,通过构造函数设置成员变量的值,通过成员方法获取变量
class Foo4 {
  protected $id;
  public function __construct($id) {
   $this->id = $id;
  }

  public function __get($key) {
   return $this->id;
  }
}
$data = new Foo4(10);
echo $data->id;
?>
按执行速度快慢排序: 1243
咱们先看其opcode:
1:

复制代码 代码如下:

1  ZEND_FETCH_CLASS 4  :4  'Foo'
2  NEW         $5 :4
3  DO_FCALL_BY_NAME   0         
4  ASSIGN         !0, $5
5  ZEND_ASSIGN_OBJ   !0, 'id'
6  ZEND_OP_DATA    10
7  FETCH_OBJ_R   $9 !0, 'id'
8  ECHO            $9

2:
复制代码 代码如下:

1  ZEND_FETCH_CLASS 4  :10 'Foo2'
2  NEW               $11 :10
3  SEND_VAL           10
4  DO_FCALL_BY_NAME  1
5  ASSIGN        !1, $11
6  FETCH_OBJ_R   $14 !1, 'id'
7  ECHO            $14

3:
复制代码 代码如下:

1  ZEND_FETCH_CLASS 4  :15 'Foo3'
2  NEW            $16 :15
3  SEND_VAL        10
4  DO_FCALL_BY_NAME   1         
5  ASSIGN         !2, $16
6  ZEND_INIT_METHOD_CALL !2, 'getId'
7  DO_FCALL_BY_NAME  0  $20    
8  ECHO           $20

4:
复制代码 代码如下:

1  ZEND_FETCH_CLASS 4  :21 'Foo4'
2  NEW            $22 :21
3  END_VAL         10
4  DO_FCALL_BY_NAME  1         
5  ASSIGN           !3, $22
6  FETCH_OBJ_R    $25 !3, 'id'
7   ECHO      $25


根据上面的opcode,参照其在zend_vm_execute.h文件对应的opcode实现,我们可以发现什么?

一、PHP内核创建对象的过程分为三步:

ZEND_FETCH_CLASS 根据类名获取存储类的变量,其实现为一个hashtalbe EG(class_table) 的查找操作
NEW 初始化对象,将EX(call)->fbc指向构造函数指针。
调用构造函数,其调用和其它的函数调用是一样,都是调用zend_do_fcall_common_helper_SPEC

二、魔术方法的调用是通过条件触发的,并不是直接调用,如我们示例中的成员变量id的获取

(zend_std_read_property),其步骤为:
获取对象的属性,如果存在,转第二步;如果没有相关属性,转第三步
从对象的properties查找是否存在与名称对应的属性存在,如果存在返回结果,如果不存在,转第三步
如果存在__get魔术方法,则调用此方法获取变量,如果不存在,报错
回到排序的问题:

一、第一个和第二个的区别是什么?

第二个的opcode比第一个要少,反而比第一个要慢一些,因为构造函数多了参数,多了一个参数处理的opcode。参数处理是一个比较费时的操作,当我们在做代码优化时,一些不必要的参数能去掉就去掉;当一个函数有多个参数时,可以考虑通过一个数组将其封装后传递进来。

二、为啥第三个最慢?

因为其获取参数其本质上是一次对象成员方法的调用,方法的调用成本高于变量的获取

三、为啥第四个比第三个要快?

因为第四个的操作实质上获取变量,只不过其内部实现了魔术方法的调用,相对于用户定义的方法,内部函数的调用的效率会高。因此,当我们有一些PHP内核实现的方法可以调用时就不要重复发明轮子了。
四、为啥第四个比第二个要慢?
因为在PHP的对象获取变量的过程中,当成员变量在类的定义不在在时,会去调用PHP特有的魔术方法__get,多了一次魔术方法的调用。

总结一下:

1.使用PHP内置函数
2.并不是事必面向对象(OOP),面向对象往往开销很大,每个方法和对象调用都会消耗很多内存。
3.尽量少用魔术方法 -- 除非有必要,不要用框架,因为框架都有大量的魔术方法使用。
4.在性能优先的应用场景中,将成员变量不失为一种比较好的方法,当你需要用到OOP时。
5.能使用PHP语法结构的不要用函数,能使用内置函数的不要自己写,能用函数的不要用对象

www.bkjia.comtruehttp://www.bkjia.com/PHPjc/736832.htmlTechArticle有如下4个代码示例,你认为他们创建对象,并且获得成员变量的速度排序是怎样的? 1:将成员变量设置为public,通过赋值操作给成员变量...
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.

핫 AI 도구

Undresser.AI Undress

Undresser.AI Undress

사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover

AI Clothes Remover

사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool

Undress AI Tool

무료로 이미지를 벗다

Clothoff.io

Clothoff.io

AI 옷 제거제

Video Face Swap

Video Face Swap

완전히 무료인 AI 얼굴 교환 도구를 사용하여 모든 비디오의 얼굴을 쉽게 바꾸세요!

뜨거운 도구

메모장++7.3.1

메모장++7.3.1

사용하기 쉬운 무료 코드 편집기

SublimeText3 중국어 버전

SublimeText3 중국어 버전

중국어 버전, 사용하기 매우 쉽습니다.

스튜디오 13.0.1 보내기

스튜디오 13.0.1 보내기

강력한 PHP 통합 개발 환경

드림위버 CS6

드림위버 CS6

시각적 웹 개발 도구

SublimeText3 Mac 버전

SublimeText3 Mac 버전

신 수준의 코드 편집 소프트웨어(SublimeText3)

PHP를 사용하여 Baidu Wenxinyiyan API 인터페이스를 개발 및 구현하기 위한 성능 최적화 기술 PHP를 사용하여 Baidu Wenxinyiyan API 인터페이스를 개발 및 구현하기 위한 성능 최적화 기술 Aug 26, 2023 pm 10:39 PM

PHP를 사용하여 Baidu Wenxin Yiyan API 인터페이스를 개발하고 구현하기 위한 성능 최적화 기술 인터넷의 인기로 인해 점점 더 많은 개발자가 타사 API 인터페이스를 사용하여 애플리케이션 콘텐츠를 풍부하게 합니다. Baidu Wenxin Yiyan API 인터페이스는 인기 있는 데이터 인터페이스로 영감을 주고 철학적이거나 따뜻한 문장을 무작위로 반환할 수 있으며 이를 통해 프로그램 인터페이스를 아름답게 꾸미고 사용자 경험을 향상시킬 수 있습니다. 그러나 Baidu Wenxinyiyan API 인터페이스를 사용할 때 몇 가지 성능 고려 사항도 직면합니다. API 호출 속도

APCu 캐싱 기술을 사용하여 PHP 애플리케이션의 성능을 최적화하는 방법은 무엇입니까? APCu 캐싱 기술을 사용하여 PHP 애플리케이션의 성능을 최적화하는 방법은 무엇입니까? Jun 20, 2023 pm 09:47 PM

현재 PHP는 인터넷 개발에서 가장 인기 있는 프로그래밍 언어 중 하나가 되었으며, PHP 프로그램의 성능 최적화도 가장 시급한 문제 중 하나가 되었습니다. 대규모 동시 요청을 처리할 때 1초의 지연은 사용자 경험에 큰 영향을 미칠 수 있습니다. 오늘날 APCu(AlternativePHPCache) 캐싱 기술은 PHP 애플리케이션 성능을 최적화하는 중요한 방법 중 하나가 되었습니다. 이 기사에서는 APCu 캐싱 기술을 사용하여 PHP 애플리케이션의 성능을 최적화하는 방법을 소개합니다. 1. APC

Memcached 캐싱 기술을 사용하여 PHP 애플리케이션 CPU 사용량을 최적화하는 방법은 무엇입니까? Memcached 캐싱 기술을 사용하여 PHP 애플리케이션 CPU 사용량을 최적화하는 방법은 무엇입니까? Jun 21, 2023 pm 05:07 PM

인터넷이 발전하면서 PHP 애플리케이션은 인터넷 애플리케이션 분야에서 점점 더 보편화되었습니다. 그러나 PHP 애플리케이션의 동시 액세스가 높으면 서버의 CPU 사용량이 높아져 애플리케이션 성능에 영향을 줄 수 있습니다. PHP 애플리케이션의 성능을 최적화하기 위해서는 Memcached 캐싱 기술이 좋은 선택이 되었습니다. 이 기사에서는 Memcached 캐싱 기술을 사용하여 PHP 애플리케이션의 CPU 사용량을 최적화하는 방법을 소개합니다. Memcached 캐싱 기술 소개 Memcached는

PHP 코드 사양을 통해 성능 최적화를 표준화하는 방법 PHP 코드 사양을 통해 성능 최적화를 표준화하는 방법 Aug 11, 2023 pm 03:51 PM

PHP 코드 사양을 통해 성능 최적화를 표준화하는 방법 소개: 인터넷의 급속한 발전으로 인해 점점 더 많은 웹사이트와 애플리케이션이 PHP 언어를 기반으로 개발되고 있습니다. PHP 개발 프로세스에서 성능 최적화는 중요한 측면입니다. 고성능 PHP 코드는 웹사이트의 응답 속도와 사용자 경험을 크게 향상시킬 수 있습니다. 이 기사에서는 PHP 코드 사양을 통해 성능 최적화를 표준화하는 방법을 살펴보고 참조할 수 있는 몇 가지 실용적인 코드 예제를 제공합니다. 1. 데이터베이스 쿼리를 줄입니다. 빈번한 데이터베이스 쿼리는 개발 프로세스 중 일반적인 기능입니다.

PHP를 사용하여 SuiteCRM의 클라이언트 측 성능을 최적화하는 방법 PHP를 사용하여 SuiteCRM의 클라이언트 측 성능을 최적화하는 방법 Jul 20, 2023 am 10:00 AM

PHP를 사용하여 SuiteCRM의 클라이언트 측 성능을 최적화하는 방법 개요: SuiteCRM은 강력한 오픈 소스 CRM(고객 관계 관리) 시스템이지만 대량의 데이터와 동시 사용자를 처리할 때 성능 문제가 발생할 수 있습니다. 이 기사에서는 PHP 프로그래밍 기술을 통해 SuiteCRM 클라이언트 성능을 최적화하는 몇 가지 방법을 소개하고 해당 코드 예제를 첨부합니다. 적절한 데이터 쿼리 및 인덱스 사용 데이터베이스 쿼리는 CRM 시스템의 핵심 작업 중 하나입니다. 쿼리 성능을 향상시키기 위해 적절한 데이터 쿼리

PHP의 데이터베이스 연결 및 쿼리 성능을 최적화하는 방법은 무엇입니까? PHP의 데이터베이스 연결 및 쿼리 성능을 최적화하는 방법은 무엇입니까? Jun 29, 2023 am 10:25 AM

PHP의 데이터베이스 연결 및 쿼리 성능을 최적화하는 방법은 무엇입니까? 데이터베이스는 웹 개발의 필수적인 부분이며 널리 사용되는 서버 측 스크립팅 언어로서 PHP의 데이터베이스 연결 및 쿼리 성능은 전체 시스템 성능에 매우 중요합니다. 이 문서에서는 PHP 데이터베이스 연결 및 쿼리 성능을 최적화하기 위한 몇 가지 팁과 제안을 소개합니다. 영구 연결 사용: PHP에서는 데이터베이스 쿼리가 실행될 때마다 데이터베이스 연결이 설정됩니다. 영구 연결은 여러 쿼리에서 동일한 데이터베이스 연결을 재사용할 수 있으므로

PHP로 웹사이트 성능과 로딩 속도를 최적화하는 방법 PHP로 웹사이트 성능과 로딩 속도를 최적화하는 방법 Sep 12, 2023 am 10:13 AM

PHP를 사용하여 웹사이트 성능과 로딩 속도를 최적화하는 방법 인터넷의 급속한 발전으로 인해 웹사이트 성능과 로딩 속도가 점점 더 많은 관심을 받고 있습니다. 널리 사용되는 서버측 스크립팅 언어인 PHP는 웹사이트 성능과 로딩 속도를 최적화하는 데 중요한 역할을 합니다. 이 기사에서는 PHP를 사용하여 웹사이트의 성능과 로딩 속도를 향상시키는 몇 가지 팁과 방법을 소개합니다. 캐싱 메커니즘 사용 캐싱은 웹 사이트 성능을 향상시키는 효과적인 방법입니다. PHP는 파일 캐싱, 메모리 캐싱, 데이터 캐싱과 같은 다양한 캐싱 메커니즘을 제공합니다.

다양한 PHP 버전의 함수 성능을 최적화하는 방법은 무엇입니까? 다양한 PHP 버전의 함수 성능을 최적화하는 방법은 무엇입니까? Apr 25, 2024 pm 03:03 PM

다양한 PHP 버전에 대한 함수 성능을 최적화하는 방법에는 함수 병목 현상을 식별하기 위한 분석 도구 사용, opcode 캐싱 활성화 또는 외부 캐싱 시스템 사용, 성능 향상을 위한 유형 주석 추가, PHP 버전에 따른 적절한 문자열 연결 및 정렬 선택이 포함됩니다.

See all articles