2015-09-23 24 views
6

Performansın oldukça kritik olduğu bir uygulama yazıyorum. X64 CPU'lar için en verimli veri türü olan biraz kafam karıştı. bitmapleri oluşturmak içinVerimli kod: tamsayı veri türleri vs VB.Net içinde

MDSN Verilerin büyük miktarda kullanıyorum "In some cases, the common language runtime can pack your Short variables closely together and save memory consumption." olduğu değil aynı zamanda bu "The Integer data type provides optimal performance on a 32-bit processor"

söyledi (pürüzlü bir dizi [10 ya da daha fazla] [30] [128.128] 5 milyon değerler etrafında ortalama) Gerçek zamanlı olarak (veri değerlerinin ısı haritaları). Tüm veri noktaları 200 ile 3500 arasında tam sayıdır, dolayısıyla kısa veya tamsayı kullanabilirim. Hangisi daha verimli olur?

Teşekkürler.

+2

"Büyük" ne demektir? Tamsayılarla bir "OutOfMemoryException" alma riski var mı? Aksi takdirde tamsayılar kullanın, bir CPU 32 bit değerlerle verimli çalışmak üzere tasarlanmıştır. –

+0

Bir pürüzlü dizide ortalama 128 * 128 * 30 * 10 veri değerleri (4915200). Hafıza kullanımı tamam, makinemde ortalama yaklaşık 230 MB olan şirket için ortalama özellikler. Sormamın sebebi, görüntüleri gerçek zamanlı olarak değiştirdiğim (tonları değiştirerek vb.) Yapıyorum çünkü bu yüzden olabildiğince verimli olmalıyım. – Absinthe

+0

Ham veriler için daha küçük bir bellek izi istiyorsanız, kısa kullanın. Görüntülerin daha hızlı oluşturulmasını istiyorsanız, başka bir veri türü doğru seçim olabilir, ancak verilerin nasıl kullanıldığını gösteren bir kod yoktur. – dbasnett

cevap

0

Genel bir kural olarak, bir değişkenin kullandığı daha az bellek, daha hızlı işlenecek ve uygulamanız daha az miktarda kullanacağından daha iyi bir bellek yönetimine sahip olacaksınız.

Kısa bellek tamsayı gereksinimlerinin yalnızca yarısına ihtiyacı vardır, yalnızca 16 bitlik bir sayıya ihtiyacınız varsa ve asla daha büyük olmayacağından eminseniz Kısa'ı kullanın.

+1

Cevabınız için teşekkür ederiz. Nedenini açıklamak için buna puan verenlerden hoş olurdu. – Absinthe

1

Int32 tipi, 32 bit ve 64 bit uygulamalarda, döngü sayaçları gibi düzenli değişkenler için en verimli yöntemdir.

Büyük veri dizilerini ele aldığınızda, tek bir değerin okunması/yazılması verimliliği çok önemli değil, verilere erişmek önemli olan şey, mümkün olduğunca az sayıda bellek önbelleği özlüyor olmanızdır. Bir bellek önbellek özeti, önbelleğe alınmış belleğe erişim ile karşılaştırıldığında çok pahalıdır. (Ayrıca, bir sayfa hatası (belleğe takılan bellek) bir bellek önbellek özüne kıyasla çok pahalıdır.)

Önbellek kayıplarını önlemek için verileri olabildiğince küçük bir yerde saklayabilirsiniz ve verileri işlediğinizde Mümkün olduğu kadar doğrusal bir şekilde, eriştiğiniz bellek alanı olabildiğince küçük olmalıdır.

Int16'u kullanmak, çok sayıda önbellek bloğunu genişletecek kadar büyük bir dizi için büyük olasılıkla Int32'dan daha verimli olacaktır ve bir önbellek bloğu genellikle yalnızca birkaç kilobayttır.

Değerlerinizin yalnızca 12 bitte depolanması mümkün olduğundan, verilerin işlenmesi için daha fazla işlem yapılması gerekmesine rağmen, her değeri 1,5 bayt olarak depolamak daha verimli olabilir. Veri boyutunun% 25'inin azaltılması, fazladan işlenmeyi telafi etmekten daha fazla olabilir.

+0

Cevabınız için teşekkür ederiz. Öğeleri yinelemek için dizinin her boyutu için bir döngü (adım 1) kullanıyorum, bu yüzden bunun oldukça doğrusal erişime yol açtığını farz ediyorum. "Her bir değeri 1,5 byte depolamak bile daha verimli olabilir" açıklığa kavuşturabilir misiniz - bunu nasıl yaparsınız? Cevapların çeşitliliği göz önüne alındığında, her bir seçeneği test etmenin en iyisi olduğunu düşünüyorum :) – Absinthe

+0

@Absinthe: Açıkça 1,5 bayt veri türü olmadığından, bir değeri iki baytlık bir kısımda veya daha büyük bir veride birkaç değer saklarsınız yazın. 'A' ve 'b' 12 bit değerlerini üç bayta saklayabilirsiniz: aaaaaaaa aaaabbbb bbbbbbbb'. Beş değeri (60 bit) bir "Int64" (8 bayt) 'da dört kullanılmamış bitle de saklayabilirsiniz. 'Int64' dizisinden 12 bitlik bir değer değeri okumak için '(arr [i/5] >> ((i% 5) * 12)) & 0xFFF' kullanabilirsiniz. – Guffa