2009-05-13 21 views
6

Başparmak kuralı, küçük yapıları değerlere göre iletmenin tamam olup, daha büyük olanların da işaretçiler tarafından yapılması gerektiğidir.Değere göre büyük yapılar ne kadar verimli geçebilir?

Sorum şu: Tam olarak bu kesme noktası nerede? Yapılmadan önce yapının ne kadar büyük olması, onları işaretçiden geçirmekten daha iyidir.

bu platformlar arasında değişir biliyorum, ama bazı kaba tahminler verilebilir varsayalım. Bir ya da iki yıl önce bunu PPC mimarisinde anlamaya çalıştım ve çok değerli verileri çok verimli bir şekilde verebileceğimi şaşırdım. PPC'deki çok sayıda kayıt olduğundan, 10 adet çift değer düşünün. İşaretçiye aslında bellekte daha fazla kopyalama ve bellek dahil.

Ancak şimdi intel üzerinde ve ben her şeyin farklı olabileceğini düşünüyoruz. CPU, geleneksel olarak pek çok yazmaçlara sahip olmadığından, belki de 64bit veya kayan nokta kayıtlarında farklı mıdır?

+4

Bağımlıdır .... Karşılaştırmalı olmanız gerekir ... –

+1

Mitch doğrudur, bilmenin tek yolu ölçüt etmektir. Ve cevabınız, test ettiğiniz platforma bağlı olarak değişecektir. –

+0

Sanırım problemim, doğru şekilde nasıl işaretleyeceğimi bilmem. Bunun basit bir örneği derleyici tarafından çok kolay bir şekilde optimize edileceğinden ve gerçek kullanımı yansıtmayacağından korkuyorum. Erken optimizasyon yapmak aptalca görünebilir, ancak bu, iyi bir performansa sahip olmakla uğraştığım bir şeydi, bu yüzden gereksiz aptalca bir seçim yapmak istemiyorum. Tüm API tasarımımı etkileyecek, bu yüzden daha sonra değiştirmek zorunda kalmak istemiyorum. –

cevap

1

Tamam, bu yüzden tavsiyelere uymaya ve kodlarımı işaretçiler ve değer kullanarak profillemeye çalıştım. Ayrıca montaj koduna da baktım. X86'daki performans özelliklerinin PPC'den oldukça farklı olduğu görülmektedir. PPC'de, C'ye giden ikili arabirim argümanların kayıtlara alınacağını belirtmişti (ancak seçilmesi gereken çok şey vardı), ancak 64bit x86'da bile yığına konulacak argümanlar gerektiğini düşünüyor.

Bu nedenle, x86'da işaretçiden geçenlerin neden daha hızlı olduğu açıklanmaktadır. Ancak derleyicinin inline için çok hevesli olduğunu fark ettim. Yani hangi şekilde yaptım önemli değil. Yani sanırım sonuç, sizin için uygun olan geçişi kullanmaktır.

Değerlerin kopyaları üzerinde çalışmanın daha güvenli olduğu için, bu iyiliğin değerden geçtiğini düşünüyorum. Benim test vakam 4 çift kişilik bir yapıydı (bu yüzden çoğu platformda 32 bayt yapar sanırım).

4

Eğer referans ve değere göre geçme bayt büyüklüğünde bazı kurallar bulacaksınız web arama. Hiçbirine çok güvenmezdim. tek yolu

O

Bu bir sorun olduğunu% 100 biliyorum tek yoludur Profile belirli yapı sorunun olduğunu biliyoruz.

Muhaliflere Geçiş yapmadan önce

. Evet orada bazı bariz durumlar vardır. Örneğin 100 üye olsaydı, değere göre bir yapı geçmezdim. Ancak bu performans sorunları için olmaz, yığın alanı problemleri için daha fazla olurdu.

+0

Downvote. Bu bir cevap değil - insanlara internette arama yapmalarını söyleme. Gerçekleri yayınlayın ve onlara başvurun. –

0

hizalama sizin test oynadığı rol ihmal etmeyin. Eğer şamandıraları geçiyor ya da ikiye katlanıyorsanız ve yapılarınız uygun sınırlar içinde hizalanmıyorsa, işlemci değerinizin bir kısmını almayı, kaydırmayı, sonra da saklamadan önce geri kalanını YAĞLAMAKTIR. Çoğu modern derleyicinin DTRT (yapıyı bildirildiğinde hizalayarak) olacağını düşünüyorum, ancak alan için optimizasyon yapıyorsanız, bu muhtemelen bir sorun olacaktır. Ben Pentium Pro beri x86 kemerin üzerinde herhangi düşük seviyeli kodlama yapmadım olarak

Hmmm, mademki bunu düşünüyorum,

0

Bazı derleyiciler may ..., inanmayarak bunu al sizin için en uygun boyut belirlemesini yapın. Doğru olarak hatırlarsam, TI28xx derleyici, yapı belirli bir boyutun üzerindeyse, referans olarak geçmek için otomatik olarak geçiş değerini dönüştürür.

2

C++, herşeyi herşeyi const referans listesinde geçemez çünkü performans aslında daha kötü olamaz. istisnalar listesi:

  • temel türleri (int vs.),
  • işaretçileri,
  • boş türleri (etiket türleri),
  • fonksiyon benzeri türleri (funktorlar) ve
  • yineleyiciler.

Bunun doğrudan C'ye uygulanabileceğinden emin değilim (C'nin sahip olmadığı belirgin türlerin dışında), ancak belki de benzer bir kılavuz geçerlidir.

+0

C++ programlama yaparken bu modeli takip ediyorum, fakat kesinlikle konuşuyorum, her zaman en uygun olduğundan emin değilim. Bildiğim kadarıyla MyClass & var const, const pointer olarak uygulanmaktadır. Ve küçük nesneler için (örneğin, 2-3 çift), işaretçiden geçmek, değere göre geçişten daha yavaştır. –

+0

Tabii ki imleçlere erişim, bir ek yüke sahiptir, ancak işlemci üreticileri işaretçilerin gerekliliğinin farkındadır. Bu nedenle, önlem alırlar. AMD optimizasyon kılavuzu, örneğin, açıklayıcı, bu tür kullanım akılda tutulduğu için burada işaretçilerin kullanılmasını tavsiye eder. Uzun lafın kısası: Küçük yapılar için bile, işaretçiler değerden daha hızlı olabilir. Inlining elbette bu davranışı daha da değiştirebilir. –

+0

Gönderdiğiniz istisnalar listesinin herhangi bir "resmi" kaynağı var mı? Ben bir soru hava yazmak için yazıyordum ilköğretim türlerini referans ile geçmek için mantıklı. –

-1

Genellikle ilkel tipler Değere göre değer veririm, her şey referans olarak. Bu benim başparmak kuralım.

+4

Soru, kurallarla ilgili değil, performansla ilgilidir. – stepancheg

İlgili konular