Hangi PHP PHP string fonksiyonları veya regex daha verimli?

7 Cevap php

Ben bir dizeyi ayrıştırmak PHP kodu yazıyorum. Bu mümkün olduğunca hızlı olması gerekir, bu nedenle düzenli ifadeler gitmek için yoludur? Ben PHP string fonksiyonları daha pahalı olduğu bir önsezi var, ama bu sadece bir tahmin. Gerçeği nedir?

İşte dize ile ne yapmak gerekir, özellikle bulunuyor:

(Substringin "000000" üçüncü yere göre) ilk yarısını alın ve sonraki 20 bayt olan karma karşılaştırmak, sol bir şey atmadan.

Verilerin tek parça olarak bir sonraki "000000" ile 9 bayt ayrıştırın. Sonra bundan sonra sonraki 19 bayt kapmak, ve 8 içine Sonra tarihlerini içine bu iki 8 bayt dizeleri dönüştürür diğer bazı şeyler yapmak. Ve 8 (1 atmak) olduğunu bölünmüş.

Yani yapmam gereken şey türüdür.

7 Cevap

Bu durumda bağlıdır: Eğer oldukça temel bir şey yapmaya çalışıyorsanız (örneğin: bir dize arama, başka bir şey ile bir alt değiştirin), sonra normal string fonksiyonları gitmek için yoludur. Eğer daha karmaşık bir şey (örneğin: IP adresleri için arama) yapmak istiyorsanız, o zaman Regex işlevleri kesinlikle daha iyi bir seçimdir.

Onlar zamanında daha hızlı olacak diyemeyiz bu yüzden Regexes profilli değil, ama temel işlevleri kullanarak birbirine eşdeğer hack harcanan ekstra zaman buna değer olmaz söyleyebilirim.


Edit with the new information in the OP:

Eğer gerçekten burada küçük dize işlemleri bir dizi yapmak gerekir gibi geliyor. Her biri ayrı ayrı oldukça basit, ve ben bir regex kullanarak bir anda tüm bu adımları (veya bu adımların hatta birkaç) yapmak mümkün olacaktır şüphesiz beri, ben temel fonksiyonları ile gitmek istiyorum:

(Substringin "000000" üçüncü yere göre) ilk yarısını alın ve sonraki 20 bayt olan karma karşılaştırmak, sol bir şey atmadan.

Use: strpos() and substr()
Or : /$(.*?0{6}.*?0{6}.*?)0{6}/

Sonra bundan sonra sonraki 19 bayt kapmak, ve 8 içine (1 atmak) ve 8 ki bölünmüş.

Kullanım: substr() - (I assume you mean 17 bytes here -- 8 + 1 + 8)

$part1 = substr($myStr, $currPos, 8);
$part2 = substr($myStr, $currPos + 9, 8);

Ben yüksek performans istiyorsanız bu çaba en aza indirmek için yardımcı olarak, size regex kaçınmak gerektiğini düşünüyorum, ama hemen hemen her zaman, belirli bir soruna dize rutinleri kullanarak kodunu ayarlayın ve bunun büyük bir performans artışı elde edebilirsiniz olarak en iyi performansa sahip olmayacaktır. Orada büyük bir fark olmayacak gibi ama çok optimize edilemez basit ayrıştırma rutinleri için, hala regex kullanabilirsiniz.

EDIT: Bu özel sorun için ben string işlemleri favorize ediyorum gönderdi, ama ben regex bunu nasıl bilmiyorum çünkü. Bu karma dışında, oldukça düz ileri gibi görünüyor, bu yüzden regex / string fonksiyonları büyük bir fark olmayacağını düşünüyorum.

Ben normal bir ifade PHP string işlevi çağrıları bir demet daha hızlı olan bir eşik olduğuna inanıyorum. Her neyse, ne yaptığınızı çok bağlıdır. Sen dengeyi bulmak zorunda.

Şimdi soru düzenlenmiş olduğunu. Ben başarmak için çalışıyoruz ne için dize işlevlerini kullanmak istiyorum. strpos () ile substr () ilk bakışta akla gelen budur.

Ne yaptığınızı dize işlevlerini kullanarak yapmak için tüm makul ise, bunları kullanmak gerekir. Eğer bir sabit dize 'abc' meydana belirlemede eğer gibi, $value, kesinlikle kontrol etmek istediğiniz strpos($value, 'abc') !== false, değil preg_match('/abc/', $value). Eğer kendinizi bir regex ettik ne gerçekleştirmek için yeniden dağıtımın dize ve dönüşümlerin bir sürü yapıyor bulursanız olsa da, neredeyse kesinlikle performans ve bakımı hem yok rüzgar gidiyoruz.

Hız endişe zaman olsa da, aşağı geldiğinde, saat bu konuda sanmıyorum. time komutu senin arkadaşın.

Genel olarak, string fonksiyonları daha hızlı ve düzenli ifade işlevleri daha esnektir.

Başka bir şey olduğu gibi, sonuçlar değişebilir, kesin bilmek tek yolu her iki yönde ve kriter çalışmaktır.

Yerli string fonksiyonları yolu hızlı. Işleçleri yararı onlarla hemen hemen her şeyi yapabiliyor olmasıdır.

Sizin ihtiyaçlarınıza bağlıdır. En düzenli ifade işlemleri tek düşünürdüm daha hızlı ve hatta bazı önemsiz işlemlerinde dize işlevlerini yerleşik iyi performans olabilir. Ben oldukça yavaş değil yerleşik regex kütüphane, akılda gebelik kütüphane var unutmayın.