2014-12-09 15 views
6

Bazı sınıflar foo < handle ve bar < foo, baz < foo ve belki de qux < foo varsayalım. Bir hücre dizisi olarakPerformans, nesnelerin hücre dizileri veya heterojen diziler için daha iyi olan nedir?

  • : Ben bu nesnelerin bir diziyi saklayabilir birkaç yolu vardır A = {foo bar baz qux} % A(1) would be a cell, A{1} gives me a foo object

  • R2011a ile başlayarak, ben foo <matlab.mixin.Heterogeneous olun ve sonra bir dizi directy inşa edebilirsiniz: A = [foo bar baz qux] % A(1) directly gives me a foo object

Ben ilk ziyade ikinci yöntemi kullanmak daha iyi olurdu bir bakım perspektifinden, gördüğüm, oerişme hakkında belirsizliği kaldırır bu şekilde. Yani, hücre dizininin (A(1) vs foo nesnesi A{1}, A(1) içinde yaşayan) dereferans elemanlarına ihtiyaç duyduğumuzda.

Ama diğerine karşı bir sözdizimi kullanmak için herhangi bir bellek veya performans cezası (veya parası) var mı?

+1

Performanstaki farkı görebilseydim şaşırırım. Her iki nesneyi oluşturun ve kendi boyutlarını görmek için "whos" yapın. – Floris

+1

@Floris Yukarıdakileri yaptım ve heterojen dizi uygulaması 104 bayt alır gibi görünüyor ve hücre dizisi bir kuyruklu 864 kadar sürer! Bununla birlikte, bir 'foo' nesnesini tek başına tanımlamak da 104 bayt alır. Yani sanırım heterojen uygulama içinde neler olup bittiğini anlamıyorum ... –

+1

Matlabın laneti.Kimse perdenin arkasında ne olup bittiğini gerçekten bilemez ve matlab insanlara sırlarını anlatmakla hiç ilgilenmemiştir. – patrik

cevap

1

Bellek dizisi ve hücre dizisi, kapsayıcılar.Map ve Heterojen bir dizinin çalışma süresi üzerinde küçük bir deneme (source) yaptım. Benim yöntemimde her diziyi N = 65535 elemanları (Harita ve Heterogeneous dizisi için maksimum dizi boyutu) ile önceden ayırdım, sonra her öğeye bir uint32 atamaya başladı ve zaman ve belleği ölçtüm. Heterojen Sınıfım, tek bir genel mülkiyete ve bu özelliği atayan bir kurucuya sahip basit bir sınıftı. Kaplar.Map, uint32 anahtar/değer çiftlerine sahipti.

Maps took 9.17917e-01 seconds. 
Cells took 5.81220e-02 seconds. 
Heterogeneous array took 4.95336e+00 seconds. 

**Name**  **Size**   **Bytes**  **Class** 
map   65535x1   112   containers.Map    
cellArr  65535x1   7602060  cell    
hArr   1x65535   262244  SomeHeterogeneousClass 

mapArray öğesinin boyutunun doğru olmadığını unutmayın. Kapsayıcıların arkasına gizlenmiştir. Sınıf uygulaması, en çok kullanılan 112 bayt, veriler hariç, haritanın kendisine atanan bellektir. En düşük olmak üzere gerçek boyutu en az (112 + 65535 * (sizeof (uint32) * 2)) = 524392 bayt olarak tahmin ediyorum. Bu değer neredeyse tam olarak hArr boyutunun iki katıdır, bu da haritanın oldukça doğru olduğunu düşünür, çünkü harita iki kat daha fazla veri (anahtar VE değer için) hArr olarak depolamalıdır.

sonuç basittir:

  • süre: Ben N = 30 ile deney tekrarlandı Heterojen Dizi < Harita < hücre Dizisi

: Hücre Dizisi < Harita < Heterojen Dizi Hafıza

  • Küçük dizileri test etmek için sonuçlar benzerdi. Tanrı, sadece hücrelerin neden bu kadar çok bellek aldığını ve Heterojen dizilerin neden bu kadar yavaş olduğunu bilir.

  • İlgili konular