2015-09-17 22 views
5

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?

+0

Kaç bayttan bahsediyoruz? lol –

+0

@AdamBuchananSmith Ne? –

+0

Umm ... Bellek. –

cevap

6

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.

+0

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. –

+1

@ 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

+0

Hm, bu hileyi açıklayan bir bağlantınız var mı? Kulağa ilginç geliyor. –

İlgili konular