gpt4 book ai didi

PHP5 - PHP5 中的 RTTI(获取类名等)的成本是多少?

转载 作者:行者123 更新时间:2023-12-04 07:02:03 24 4
gpt4 key购买 nike

我注意到一些 PHP 框架,例如 Kohana 和 CodeIgniter 会查看类的类名来执行自动加载。传统上,RTTI 对于 C++ 来说是昂贵的;与以下相比,PHP5 的价格是多少:

  1. 私信通话
  2. 在关联数组中查找键
  3. 通过变量进行消息调用 ( $class = 'foobar'; $method = 'foo'; $class->$method() )

最佳答案

一般来说,如果您使用的是 PHP,性能不应该是您最大的担忧,首先编写美观的代码(即可读性和可维护性、 self 记录等),然后根据需要进行分析和优化。如果您一开始就担心速度,PHP 可能不是合适的选择。

但要回答您的问题...get_class 具有相当不错的性能,我认为它在 zend 引擎中得到了很好的优化。尝试调用一个不存在的函数并处理错误的代价要。 (调用一个不存在的函数是一个 fatal error ,除非你在你的基础对象中写一堆胶水代码,否则你无法捕捉到它)

这里有一些基准测试来展示一些确定运行方法能力的不同方法。

基准.php:

<?php

class MyClass {
public function Hello() {
return 'Hello, World!';
}
}

function test_get_class( $instance ) {
$t = get_class( $instance );
}

function test_is_callable( $instance ) {
$t = is_callable( $instance, 'Hello' );
}

function test_method_exists( $instance ) {
$t = method_exists( $instance, 'Hello' );
}

function test_just_call( $instance ) {
$result = $instance->Hello();
}

function benchmark($iterations, $function, $args=null) {
$start = microtime(true);
for( $i = 0; $i < $iterations; $i ++ ) {
call_user_func_Array( $function, $args );
}
return microtime(true)-$start;
}

$instance = new MyClass();

printf( "get_class: %s\n", number_format(benchmark( 100000, 'test_get_class', array( $instance ) ), 5) );
printf( "is_callable: %s\n", number_format(benchmark( 100000, 'test_is_callable', array( $instance ) ), 5) );
printf( "method_exists: %s\n", number_format(benchmark( 100000, 'test_method_exists', array( $instance ) ), 5) );
printf( "just_call: %s\n", number_format(benchmark( 100000, 'test_just_call', array( $instance ) ), 5) );

?>

结果:

get_class:     0.78946
is_callable: 0.87505
method_exists: 0.83352
just_call: 0.85176

关于PHP5 - PHP5 中的 RTTI(获取类名等)的成本是多少?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1697643/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com