Baidu 엔지니어들이 PHP 기능의 구현 원리와 성능 분석에 대해 이야기합니다. (1)_php 기술
머리말
모든 언어에서 함수는 가장 기본적인 구성 요소입니다. PHP 함수의 특징은 무엇입니까? 함수 호출은 어떻게 구현되나요? PHP 기능의 성능은 어떻습니까? 사용법에 대한 제안이 있습니까? 이 기사에서는 구현을 이해하면서 PHP 프로그램을 더 잘 작성하기 위해 원리를 분석하고 이를 실제 성능 테스트와 결합하여 이러한 질문에 대답하려고 합니다. 동시에 몇 가지 일반적인 PHP 기능이 소개됩니다.
PHP 기능 분류
PHP에서는 함수를 가로로 나누면 사용자 함수(내장 함수)와 내부 함수(내장 함수) 두 가지로 구분됩니다. 전자는 프로그램 내에서 사용자가 맞춤화한 일부 함수와 메소드이고, 후자는 PHP 자체에서 제공하는 다양한 라이브러리 함수(예: sprintf, array_push 등)입니다. 사용자는 나중에 소개될 확장 메서드를 통해 라이브러리 함수를 작성할 수도 있습니다. 사용자 기능은 함수(function)와 메소드(class method)로 나눌 수 있습니다. 본 글에서는 이 세 가지 기능을 각각 분석하고 테스트하겠습니다.
PHP 기능 구현
PHP 함수는 최종적으로 어떻게 실행되나요?
이 질문에 대답하기 위해 먼저 PHP 코드를 실행하는 과정을 살펴보겠습니다.
그림 1에서 볼 수 있듯이 PHP는 일반적인 동적 언어 실행 프로세스를 구현합니다. 코드 조각을 얻은 후 어휘 분석 및 구문 분석과 같은 단계를 거친 후 소스 프로그램이 명령어(opcode)로 변환됩니다. 그런 다음 ZEND 가상 머신은 이러한 명령을 순서대로 실행하여 작업을 완료합니다. PHP 자체가 C로 구현되어 있기 때문에 최종적으로 호출되는 함수는 모두 C 함수입니다. 사실 PHP는 C로 개발된 소프트웨어라고 볼 수 있습니다. 위의 설명에서 PHP의 함수 실행이 호출을 위한 opcode로 변환된다는 것을 보는 것은 어렵지 않습니다.
각 기능에 대해 zend는 다음 데이터 구조로 설명됩니다
typedef Union _zend_function {
zend_uchar 유형; /* 이 구조체의 첫 번째 요소여야 합니다. */
구조체 {
zend_uchar 유형; /* 사용되지 않음 */
char *함수_이름
zend_class_entry *범위
zend_uint fn_flags
Union _zend_function *프로토타입
zend_uint num_args
zend_uint 필수_num_args
zend_arg_info *arg_info
zend_bool pass_rest_by_reference
부호 없는 문자 반환_참조
} 일반적;
zend_op_array op_array
zend_internal_function 내부_함수
} zend_function;
typedef struct _zend_function_state {
해시테이블 *function_symbol_table
zend_function *함수
무효 *예약됨[ZEND_MAX_RESERVED_RESOURCES]
} zend_function_state;
유형은 함수 유형(사용자 함수, 내장 함수, 오버로드 함수)을 나타냅니다. 공통에는 함수 이름, 매개변수 정보, 함수 플래그(일반 함수, 정적 메서드, 추상 메서드) 등 함수의 기본 정보가 포함됩니다. 또한, 사용자 기능에 대해서는 내부 변수 등을 기록하는 기능 심볼 테이블도 있는데 이에 대해서는 뒤에서 자세히 설명한다. Zend는 대규모 해시 테이블인 전역 function_table을 유지 관리합니다. 함수가 호출되면 먼저 함수 이름을 기반으로 테이블에서 해당 zend_function을 찾습니다. 함수를 호출할 때 가상 머신은 유형에 따라 호출 방법을 결정합니다. 함수 유형에 따라 실행 원칙이 다릅니다.
내장 기능
내장 함수는 본질적으로 실제 C 함수입니다. 각 내장 함수에 대해 PHP는 최종 컴파일 후에 zif_xxxx라는 함수로 확장됩니다. 예를 들어, 공통 sprintf는 맨 아래 계층의 zif_sprintf에 해당합니다. Zend가 실행 중일 때 내장 함수를 찾으면 단순히 전달 작업을 수행합니다.
Zend는 매개변수 획득, 배열 작업, 메모리 할당 등을 포함하여 호출을 위한 일련의 API를 제공합니다. 내장 함수의 매개변수는 zend_parse_parameters 메소드를 통해 얻습니다. 배열, 문자열 등의 매개변수에 대해 zend는 얕은 복사를 구현하므로 이 효율성이 매우 높습니다. PHP 내장 함수의 경우 추가 전달 호출만 제외하면 효율성은 해당 C 함수의 효율성과 거의 동일하다고 말할 수 있습니다.
내장 함수는 이를 통해 PHP에 동적으로 로드됩니다. 사용자는 필요에 따라 해당 기능을 작성할 수도 있는데, 이를 흔히 확장이라고 부릅니다. ZEND는 확장을 위한 일련의 API를 제공합니다
사용자 기능
PHP를 통해 구현되는 사용자 정의 함수는 내장 함수에 비해 실행 프로세스와 구현 원리가 전혀 다릅니다. 위에서 언급했듯이 우리는 PHP 코드가 실행을 위해 opcode로 변환된다는 것을 알고 있으며 사용자 함수도 예외는 아닙니다. 실제로 각 함수는 opcode 세트에 해당하며 이 명령 세트는 zend_function에 저장됩니다. 따라서 사용자 함수 호출은 궁극적으로 일련의 opcode 실행에 해당합니다.
》》지역변수 저장 및 재귀 구현
함수 재귀는 스택을 통해 완성된다는 것을 알고 있습니다. PHP에서는 이를 달성하기 위해 유사한 방법이 사용됩니다. Zend는 활성 기호 테이블(active_sym_table)을 각 PHP 함수에 할당하여 현재 함수의 모든 지역 변수 상태를 기록합니다. 모든 기호 테이블은 함수가 호출될 때마다 새로운 기호 테이블이 할당되어 스택에 푸시되는 형태로 유지됩니다. 호출이 끝나면 현재 기호 테이블이 스택에서 팝됩니다. 이는 상태 보존 및 재귀를 달성합니다.
스택 유지 관리를 위해 zend는 여기에서 최적화를 수행했습니다. 스택을 시뮬레이션하기 위해 길이 N의 정적 배열을 사전 할당합니다. 정적 배열을 통해 동적 데이터 구조를 시뮬레이션하는 이 방법은 각 호출로 인한 메모리 할당을 방지하는 데도 사용됩니다. ZEND는 함수 호출이 끝날 때 현재 스택의 맨 위에 있는 기호 테이블 데이터를 정리합니다. 정적 배열의 길이가 N이기 때문에 함수 호출 수준이 N을 초과하면 프로그램은 스택 오버플로를 일으키지 않습니다. 이 경우 zend는 심볼 테이블을 할당하고 파괴하므로 성능이 많이 저하됩니다. zend에서 N의 현재 값은 32입니다. 따라서 PHP 프로그램을 작성할 때 함수 호출 수준이 32개를 초과하지 않는 것이 가장 좋습니다. 물론 웹 애플리케이션이라면 함수 호출 수준 자체가 깊을 수도 있다.
》》매개변수 전송 매개변수를 얻기 위해 zend_parse_params를 호출하는 내장 함수와 달리 사용자 함수의 매개변수 획득은 명령어를 통해 완료됩니다. 함수가 갖는 매개변수의 수는 명령어의 수에 해당합니다. 구현에 있어서는 일반적인 변수 할당입니다. 위의 분석에서 알 수 있듯이 내장 함수와 비교하면 스택 테이블이 자체적으로 유지되고 각 명령이 C 함수로 실행되므로 사용자 함수의 성능이 상대적으로 훨씬 저하됩니다. 구체적인 비교 분석은 나중에. 따라서 함수에 해당 PHP 내장 함수가 있는 경우 이를 구현하기 위해 함수를 직접 다시 작성하지 마십시오.

핫 AI 도구

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

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

Undress AI Tool
무료로 이미지를 벗다

Clothoff.io
AI 옷 제거제

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

인기 기사

뜨거운 도구

메모장++7.3.1
사용하기 쉬운 무료 코드 편집기

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

스튜디오 13.0.1 보내기
강력한 PHP 통합 개발 환경

드림위버 CS6
시각적 웹 개발 도구

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

뜨거운 주제











5월 15일, Baidu Apollo는 우한 Baidu Carrot Auto Robot Zhixing Valley에서 Apollo Day 2024를 개최하여 지난 10년 동안 Baidu의 자율 주행 분야의 주요 발전을 종합적으로 시연하고 대형 모델을 기반으로 한 기술 도약과 승객 안전에 대한 새로운 정의를 가져왔습니다. 세계 최대 자율주행차 운영 네트워크 바이두는 사람이 운전하는 것보다 자율주행을 더 안전하게 만들었습니다. 덕분에 더 안전하고, 더 편안하고, 친환경적이고, 저탄소 여행 방식이 이상에서 현실로 바뀌고 있습니다. 바이두 그룹 부사장이자 지능형 운전 비즈니스 그룹 사장인 왕윤펑(Wang Yunpeng)은 현장에서 "자율주행차를 만드는 우리의 원래 의도는 더 나은 여행에 대한 사람들의 점점 커지는 갈망을 충족시키는 것입니다. 사람들의 만족은 우리의 원동력입니다. 왜냐하면 안전, 너무 아름다워요, 만나서 반가워요

7일 해당 사이트 소식에 따르면 지난 5월 6일 바이두 창업자이자 회장 겸 CEO인 로빈 리가 팀을 이끌고 베이징에 있는 중국국영석유공사(이하 '페트로차이나')를 방문해 중국 국영기업 이사들을 만났다. 중국국영석유공사(China National Petroleum Corporation) 회장 겸 당 서기 Dai Houliang이 회담을 가졌습니다. 양측은 협력을 강화하고 에너지 산업과 디지털 인텔리전스의 심층적 통합을 촉진하기 위해 심도 있는 교류를 가졌습니다. PetroChina는 디지털 China Petroleum Corporation의 건설을 가속화하고 Baidu Group과의 협력을 강화하며 에너지 산업과 디지털 인텔리전스의 심층적 통합을 촉진하고 국가 에너지 안보 보장에 더 큰 기여를 할 것입니다. 로빈 리(Robin Li)는 대형 모델이 보여주는 '지능적 출현'과 이해, 생성, 논리, 기억의 핵심 역량이 첨단 기술과 석유 및 가스 사업의 결합을 위한 더 넓은 상상력의 공간을 열었다고 말했습니다. 언제나

DeepSeek은 웹 버전과 공식 웹 사이트의 두 가지 액세스 방법을 제공하는 강력한 지능형 검색 및 분석 도구입니다. 웹 버전은 편리하고 효율적이며 설치없이 사용할 수 있습니다. 개인이든 회사 사용자이든, DeepSeek를 통해 대규모 데이터를 쉽게 얻고 분석하여 업무 효율성을 향상시키고 의사 결정을 지원하며 혁신을 촉진 할 수 있습니다.

Java 성능 분석 도구를 사용하여 Java 기능의 성능을 분석하고 최적화할 수 있습니다. 성능 분석 도구 선택: JVisualVM, VisualVM, JavaFlightRecorder(JFR) 등 성능 분석 도구 구성: 샘플링 속도 설정, 이벤트 활성화. 함수 실행 및 데이터 수집: 프로파일링 도구를 활성화한 후 함수를 실행합니다. 성능 데이터 분석: CPU 사용량, 메모리 사용량, 실행 시간, 핫스팟 등과 같은 병목 현상 지표를 식별합니다. 기능 최적화: 최적화 알고리즘, 코드 리팩터링, 캐싱 및 기타 기술을 사용하여 효율성을 향상시킵니다.

31일 뉴스에 따르면 블로거 @ibinguniverse는 오늘 삼성 갤럭시 S24 시리즈 휴대폰 중국 버전 '서치 인 서클(Search in Circle)'이 구글 검색을 지원한다는 소식을 전했습니다. 블로거는 구체적인 출시 시간을 공개하지 않았습니다. 삼성의 이전 소개에 따르면 삼성 갤럭시 S24 시리즈는 입력, 번역, 녹음, 메모, 카메라 등 AI 기반의 실용적인 기능과 높은 수준의 AI 기능을 탑재해 사용자에게 보다 편리하고 효율적인 종합 서비스를 제공한다. 경험. 해외 버전과 달리 삼성 갤럭시 S24 시리즈의 AI 기능은 대부분 바이두 등 국내 제조사에서 제공하고 있다. 이전에 보고된 Galaxy AI는 Baidu Wenxin 대형 모델의 여러 기능을 심층적으로 통합하여 최종 지원 통화 및 번역 기능은 물론 생성 AI가 제공하는 지능형 요약을 제공할 수 있습니다.

PHP와 Flutter 함수의 주요 차이점은 선언, 구문 및 반환 유형입니다. PHP 함수는 암시적 반환 유형 변환을 사용하는 반면, Flutter 함수는 반환 유형을 명시적으로 지정합니다. PHP 함수는 ?를 통해 선택적 매개변수를 지정할 수 있으며, Flutter 함수는 필수 및 선택적 매개변수를 지정하기 위해 =를 사용하여 매개변수 이름을 전달합니다. Flutter 함수는 {}를 사용하여 명명된 매개변수를 지정합니다.

이 기사에서는 Douyin Doubao, Wenxin Yige, Tencent Zhiying, Baidu Feipiao EasyDL, Baidu AI Studio 및 iFlytek Spark Cognitive Large Model을 포함한 6가지 인기 AI 도구를 소개합니다. 이러한 도구는 텍스트 생성, 이미지 생성, 비디오 편집 및 AI 모델 개발과 같은 다양한 기능을 다룹니다. 올바른 AI 도구를 선택하려면 기능 요구 사항, 기술 수준, 비용 예산과 같은 요소를 고려해야 합니다. 이러한 도구는 AI 지원이 필요한 개인과 기업에 편리하고 효율적인 솔루션을 제공합니다.

DeepSeek-R1은 Baidu Library 및 NetDisk에 권한을 부여합니다. 심도있는 사고와 행동의 완벽한 통합은 단 한 달 만에 많은 플랫폼에 빠르게 통합되었습니다. 대담한 전략적 레이아웃을 통해 Baidu는 DeepSeek을 타사 모델 파트너로 통합하여이를 생태계에 통합하여 "큰 모델 검색"생태 전략의 주요 진전을 나타냅니다. Baidu Search 및 Wenxin Intelligent Intelligent 플랫폼은 DeepSeek 및 Wenxin Big Model의 깊은 검색 기능에 처음으로 연결하여 사용자에게 무료 AI 검색 경험을 제공합니다. 동시에 "Baidu로 갈 때 알게 될 것입니다"라는 클래식 슬로건과 새로운 버전의 Baidu 앱은 Wenxin의 큰 모델과 DeepSeek의 기능을 통합하여 "AI Search"및 "Wide Network Information Refinement"를 시작합니다.
