SORU
5 AĞUSTOS 2011, Cuma


() isset vs strlen() - net dize fast/uzunluğu hesaplama

Bu kodu buldum...

if(isset($string[255])) {
    // too long
}

() isset 6 ila 40 daha hızlı

if(strlen($string) > 255) {
    // too long
}

Bu isset için tek dezavantajı() kodu olduğu belirsiz - hemen söyle (pekka cevabı olduğunu gösteriyor. İsset kaydır() fonksiyonu yani strlt içinde ($, 255 string) ama biz o gevşek isset hız yararları().

Nasıl hızlı isset kullanabilir miyiz() kod okunabilirliği korurken işlevi?

EDİT : hızını göstermek için test http://codepad.org/ztYF0bE3

strlen() over 1000000 iterations 7.5193998813629
isset() over 1000000 iterations 0.29940009117126

EDİT2 : neden burada isset() daha hızlıdır

$string = 'abcdefg';
var_dump($string[2]);
Output: string(1) “c”

$string = 'abcdefg';
if (isset($string[7])){
     echo $string[7].' found!';
  }else{
     echo 'No character found at position 7!';
}

Bu strlen kullanarak daha hızlıdır (), “ ... bir işlevi çağıran bir dil kullanmaktan daha pahalı inşa etmek.” http://www.phpreferencebook.com/tips/use-isset-instead-of-strlen/

EDİT3 : her zaman optimizasyon mirco ilgi öğretildi. Bilgisayarlarda kaynakları küçük olduğu bir dönemde öğretildi çünkü muhtemelen. Önemli olmayabilir fikrine açığım, cevapları ona karşı bazı iyi argümanlar var. Yeni bir soru bu... Is micro-optimisation important when coding? keşfetmeye başladım

CEVAP
5 AĞUSTOS 2011, Cuma


Pek isset buna inanırdım beri de testler yaptım TAMAM() yöntemi daha hızlıdır, ama Evet, kesinlikle. Bu isset() yöntemini tutarlı bir şekilde yaklaşık 6 kat daha hızlı.

Ben denedim dizelerle çeşitli boyutlarda ve çalışan bir değişen miktarda yineleme; oranları aynı kalır, ve aynı zamanda toplam çalışan boyla yolu (için dizeleri farklı boyutlarda), çünkü her ikisi de isset() ve strlen() O(1) (mantıklı - isset tek yapması gereken bir aramada bir C dizi ve strlen() döndürür boyutunu saymak tutulur dizesi).

Bunu php kaynak baktım ve kabaca neden olduğunu düşünüyorum. () isset bir işlev değil bir dil inşa çünkü, Çalışabilir VM kendi kodu vardır. Bu nedenle, işlev tabloda görünüyordu olmak istemez ve daha özel parametre ayrıştırma yapabilir. Kod zend_builtin_functions.c strlen() ve zend_compile.c isset(), ilgilenenler için.

Kravat bu, özgün soru, hiç bir şey göremiyorum sorunları ile isset() yöntemi, bir teknik bakış açısı; ama ımo zordur okumak insanlar için kullanılan bu deyim. Ayrıca, isset() yöntemi strlen süre içinde denir. () yöntemi PHP içine inşa işlevleri miktarı değişen zaman O(n) olacaktır. Eğer PHP ve statik olarak birçok işlevleri derleme oluşturmak anlamı, tüm işlev çağrıları (strlen dahil()) daha yavaş olacaktır; ama isset (sabit) olacak. Ancak bu fark pratikte ihmal edilebilir; ben de kaç işaretçi tablo tutulur bilmiyorum, kullanıcı-tanımlı fonksiyonları da bir etkisi var. Farklı bir tablo onlar hatırlıyorum ve bu nedenle bu dava için önemsiz, ama ben son gerçekten bu zamandan beri bir süre oldu.

Bu isset için herhangi bir dezavantajı göremiyorum sonuna() yöntemi. Sayısı patlayacak gibi kasıtlı olarak düşünürsek bir dize uzunluğu ve karmaşık olanları almak için başka yollar ve bunun gibi şeyleri bilmiyorum.

Son olarak, ben de sarma isset yukarıdaki önerinizi test() fonksiyonu içine. Bu bile strlen daha yavaştır() işlevi çağrısı ve bu nedenle başka bir karma tablo arama gerektiğinden yöntemi. Ekstra parametre boyutu karşı kontrol etmek için () yükü ihmal edilebilir; olarak başvuru tarafından geçirilen zaman dize kopyalama.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • André Frizzo

    André Frizz

    16 Aralık 2006
  • eHow

    eHow

    27 NİSAN 2006
  • MattSteffanina 2

    MattSteffani

    28 Kasım 2007