PHP5 - PHP5 RTTI maliyeti (olsun sınıf 'isim vb) nedir?

2 Cevap php

Böyle Kohana ve CodeIgniter gibi bazı PHP çerçeveler, otomatik yükleme gerçekleştirmek için bir sınıfın sınıf adı bakmak olacağını fark. Geleneksel olarak, RTTI C + + için pahalıdır; nasıl pahalı karşılaştırıldığında, PHP5 için:

  1. Bir doğrudan mesaj çağrı
  2. Bir ilişkisel dizi içinde bir anahtarı görünümlü
  3. Değişkenleri yoluyla bir mesaj çağrısı yapıyor (; $ yöntem = 'foo'; $ class = 'filanca' $ class-> $ yöntemi ())

2 Cevap

PHP kullanıyorsanız, genel olarak, performans (yani okunabilir ve sürdürülebilir, kendini belgeleyen vb) ilk iyi görünümlü kod yazmak, sizin en büyük endişe olmamalı sonra profili ve gerektiği gibi optimize. Eğer hız endişesi ile başlarsanız, PHP muhtemelen gitmek için yol değildir.

Ama sorunuza cevap ... get_class oldukça iyi bir performansa sahiptir, i oldukça iyi zend motorun içinde optimize düşünüyorum. Mevcut olmayan bir işlevi çağırmak için çalışıyor ve hata ile ilgili much daha pahalıdır. (Bir olmayan işlevi çağırmak için bir ölümcül hatadır, size temel nesnenin içinde tutkal kod bir demet yazmak sürece onu yakalamak için alamadım)

İşte yöntemini çalıştırmak için yetenek belirleme farklı yöntemlerden bazılarını göstermek için kıyaslama bir parçasıdır.

benchmark.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) );

?>

Sonuçlar:

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

Eğer look-up (örneğin vtable) fazladan bir adım olması gerekir çünkü RTTI C + + pahalı nedenidir. Örnek olarak işlev çağrı atın. Bu fonksiyon kodunu barındıran bir bellek adresine program sayacı kayıt hareket daha yavaş bir sonucu olarak.

Ben PHP motoru uygulanmasını görmedim, ama ben bir sözlü dil olarak, bu "havai" (Bu programı derlemek değil verilmiş, nerede zaten işlevini çağırmak için dışarı anlamaya ihtiyacı) ya bir zorunluluktur şüpheli ya da bir çeviri dilin tüm diğer giderleri ile karşılaştırıldığında minimaldir.

Yani araştırmak için en iyi yolu, basit bir deney yapmak ve sonuçları profil olduğunu söyledi. İki program, işlev çağrıları yapmak için bir kullanımını RTTI ve diğer kullanım doğrudan çağrı var ve iki sonuçlarını karşılaştırabilirsiniz.