PHP'de, hem uzunluk hem de arabellek boyutunu depoladıkları akıllı dizge (smart_str?) Adlı dahili bir veri yapısına sahipler. Yani, birleştirme uzunluğunu artırmak için dizenin uzunluğundan daha fazla bellek ayrılır. Neden bu veri yapısı gerçek PHP dizeleri için kullanılmıyor? Bu daha az bellek ayırma ve daha iyi performansa neden olmaz mıydı?PHP neden dizeler için dahili akıllı dize kullanmıyor?
cevap
Normal PHP dizeleri (PHP 7'den itibaren), hem dizenin uzunluğunu hem de karakter veri dizisini içeren zend_string
türüyle temsil edilir. zend_string
s genellikle karakter verisine tam olarak uyacak şekilde tahsis edilmiştir (hizalama buna rağmen): Ek karakterler eklemek için yer bırakmazlar.
smart_str
yapısı, zend_string
işaretçisini ve bir ayırma boyutunu içerir. Bu kez zend_string
, numaralı numaralı telefonun kesin olarak ayrılmasını sağlayacaktır. Bunun yerine, tahsis çok büyük olacak, böylece pahalı yeniden tahsisatlar olmadan ek karakterler eklenebilir.
için yeniden ayrıştırma ilkesi şu şekildedir: İlk olarak, 256 baytlık bir toplam boyutuna sahip olacak şekilde tahsis edilecektir (eksi zend_string üstbilgisi, eksi ayırıcı ek yükü). Bu boyut aşılırsa, 4096 bayta (eksi yükü) yeniden tahsis edilecektir. Bundan sonra, boyut 4096 baytlık artışlarla artacaktır.
Şimdi, tüm dizeleri smart_str
ings ile değiştirdiğimizi düşünün. Bu, tek bir karakter dizisinin bile en az 256 baytlık bir ayırma boyutuna sahip olacağı anlamına gelir. Kullanımdaki çoğu dizenin küçük olduğu göz önüne alındığında, bu kabul edilemez bir ek yüktür.
Temel olarak, bu klasik bir performans/bellek alıştırmasıdır. Varsayılan olarak bellek-kompakt bir gösterim kullanıyoruz ve ondan en çok yararlanan durumlarda daha küçük, ancak daha az bellek etkin bir temsile geçiyoruz, yani büyük parçaların küçük parçalardan oluştuğu durumlarda.
Elbette, ancak normal PHP dizgisi kullanımının ihtiyacına daha iyi uyacak şekilde smart_str işlevini ayarlayabilirsiniz. Küçük boyutla başlayıp her seferinde birleştirme gerçekleşir. Özellikle string buffer'ların PHP (!) Içerisinde uygulanmaları imkansız olduğu için. Ve özellikle de bellek CPU döngülerinden daha bol olduğu için. –
@ OlleHärstedt Evet, kapasiteyi hiç saklamaya başladığınızda bazı makul tahsisat politikasını bulmak olasıdır. Özellikle burada smart_str hakkında cevap veriyordum. Yapılması gereken nispeten güvenli bir şey, ayırıcı ile bütünleşmek ve (küçük tümevler için), yine de kullanılacak olan bir sonraki en büyük kova boyutunu seçmektir. Biraz hile ile, kapasiteyi depolamak için ek bir bellek yükü (pseudo-float kodlaması kullanarak) koymak bile mümkün olabilirdi. Bu HHVM'nin yaptığı şeydir;) – NikiC
Hm, bu hileyi açıklayan bir bağlantınız var mı? Kulağa ilginç geliyor. –
- 1. Yineleyicimde dizeler neden birleştiriliyor?
- 2. IntelliJ neden sekmeleri kullanmıyor?
- 3. Neden kimse INotifyPropertyChanging kullanmıyor?
- 4. Neden insanlar gökyüzü kutuları için tetrahedron kullanmıyor?
- 5. MongoDB belgeleri neden DBREF kullanmıyor?
- 6. MongoDB neden doğru dizini kullanmıyor?
- 7. Neden CakePHP 2.0 AppController kullanmıyor?
- 8. Postgresql'deki görünümüm neden dizini kullanmıyor?
- 9. Neden bölünmüş ('') akıllı olmaya çalışıyor?
- 10. Python: Bir listeden alt dizeler için bir dize nasıl denetlenir?
- 11. PHP: çok baytlı dizeler için implode() işlevi güvenli midir?
- 12. PHP dize
- 13. PHP Dize
- 14. Neden ItemsControl My ItemTemplate Kullanmıyor mu?
- 15. Neden .sln dosyaları .NET'te XML formatı kullanmıyor?
- 16. Wordpress veritabanı şeması neden yabancı anahtarları kullanmıyor?
- 17. mysql: neden sol dizini bir dizin kullanmıyor?
- 18. Neden Eclipse İçeriği Statik içe aktarma kullanmıyor
- 19. ParalelStream mevcut paralelliklerin tamamını neden kullanmıyor?
- 20. Algoritma fikirlerin benzerliğini karşılaştırmak için (dizeler olarak)
- 21. Neden bu dizeler python'daki normal ifademden kaçıyor?
- 22. uyarı: dize dönüştürme dizisi php için
- 23. Cygwin, PHP'nin sürümünü kullanmıyor
- 24. Bu dize neden 0?
- 25. Neden style özniteliği android kullanmıyor? Neden isim alanı öneki
- 26. Belirli dizeler için özel nesnelerle ArrayList'te arama
- 27. JSON nesnesi php için bir dize dönüştürme
- 28. dize dilimleme, php
- 29. PHP Dize eşdeğeri dizgi
- 30. phpmyadmin config.inc.php içinde auth_type kullanmıyor
Kaç bayttan bahsediyoruz? lol –
@AdamBuchananSmith Ne? –
Umm ... Bellek. –