2010-03-13 27 views
10

Yapım yapıyorum; Bazı kitaplarda, 16 baytlık'dan daha küçük bir örnek boyutu varsa, yapı oluşturulmasını önerir.Yapı, 16 bayttan daha az olan neden daha iyi

Neden?

Herhangi bir yanıt için teşekkürler.

+0

http://stackoverflow.com/questions/1082311/why-should-a-net-struct-be-less-than-16-bytes dosyasının bir kopyası –

+0

Ayrıca http://stackoverflow.com/questions adresinin bir kopyası bulunmaktadır./2407691/c-struct-design-why-16-byte-is Önerilen boyut/2407869 # 2407869 – slugster

cevap

28

Çünkü 16 bayt, derleyicinin, bir veya iki basit hareket yönergesi kullanmak yerine, yapıları bir blok bellek olarak kopyalamaya başladığı eşiktir.

Derleyici, yapıların küçük olduklarında kopyalarını optimize eder. Örneğin sekiz baytlık bir yapı, tek bir 64 bit değer olarak kopyalanabilir. 16 baytlık bir yapı, bir veya iki tekil değer olarak kopyalanabilir (işlemci mimarisine bağlı olarak). Yapı 16 bayttan daha büyük olduğunda, derleyici hareketi daha fazla optimize etmeyi denemez ve geri dönüş bir bellek bloğunu kopyalayan bir yöntemi çağırmaktır.

(Not: 16 bayt eşiği, derleyicinin sürümüne bağlı olarak farklılık gösterebilir, aslında daha yeni sürümlerde bu noktanın ötesine geçmeye çalıştığı için görünür, ancak en iyileştirilmiş kod yine de çok sayıda hareket yönergesi olacaktır. yine de tek bir taşıma işlemi olan bir nesneye bir başvuru kopyalama için) Düzen

.

struct 4 : 272 ms. 
struct 8 : 235 ms. 
struct 16 : 317 ms. 
struct 32 : 625 ms. 
struct 64 : 1280 ms. 
struct 128 : 4659 ms. 
struct 256 : 8020 ms. 
: Burada
yarım milyar kere benim 64 bit sistem kopyalama yapılar üzerinde yaptığı bir testin sonucudur

Gördüğünüz gibi, 16 bayttan daha az zaman, lineer değil, 16 b ytes 4 bayt kadar dört kat, dört kat daha uzun sürmez. 16 baytın üstünde zaman doğrusaldır, bu yüzden boyutu iki katına çıkarmak iki katına çıkar. Birden fazla hamle kullanmaya başlayacak yer burası. 64 byte'ın üzerinde bir atlama var, bu zaman boyutu iki katına çıktığında aniden dört katına çıkıyor. Geri dönüşün kullanılmaya başlandığı yer burası.

+0

Eğer bir bakış açısı – Ricky

+0

getirmek senin noktanız nereden geliyor? – Ricky

+0

@Ricky: Yıllar boyunca bazı testler yaptım. Yukarıdaki geçerli bir test sonucunu ekledim. – Guffa

1

Tam olarak 16 bayt değil, ancak struct değerleri değerlere (bir yönteme verdiğinizde kopyaladığınız, atadığınız vb.) Geçirildiği için çok büyük olmamalıdır. Eğer öyleyse, referans olarak gönderilmesi daha ucuzdur.

4 yıl sonra: .NET hakkında çok az şey bilerek bunu yanıtladı (hala bu konuda fazla bir şey bilmiyorum). Guffa'nın cevabı "16 bayttan daha fazla veya daha az" ile ilgilenirken açıkça daha doğrudur, çünkü bu boyutta biraz kopyalama önemli olmamalıdır. Cevabım, büyük yapılar oluştururken akılda tutulması gereken bir şey olabilir.

+0

64 bitlik bir gösterici 128 bit yapısından daha ucuzdur. Bu cevap gerçekten anlam ifade etmiyor. – slugster

+2

"64 bit işaretçi, 128 bit yapısından daha ucuzdur". Neden öyle diyorsun? Bir işaretçiyi almak genellikle .NET üzerinde pahalı olan yığın ayırma ve çöp toplama anlamına gelir. Bir işaretçiyi yazmak, .NET'te de pahalı olan bir yazma engeli oluşmasını ima eder. –

+0

@slugster: Bir 8 bayt referansı 16 baytlık bir yapıdan daha ucuz kopyalanabilir, ancak bir referansın yararlı olması için yığındaki bir nesneyi tanımlaması gerekir. 16 baytlık veri içeren bir yığın nesne oluşturmak ve ona bir referansı milyonlarca kez kopyalamak, bir 16 baytlık yapıyı bir milyon kez kopyalamaktan daha ucuz olabilir, ancak 16 baytlık bir nesne oluşturmak, referansı iki kez kopyalamak ve onu terk etmek 16 baytlık bir yapıyı iki kez kopyalamaktan çok daha pahalıdır (veya muhtemelen bu konu için yirmi kez bile). – supercat

İlgili konular