2014-12-09 2 views
6

Предположим, у меня есть классы foo < handle и bar < foo, baz < foo и, возможно, qux < foo. Есть несколько способов, которыми я могу хранить массив этих объектов:Что лучше для производительности, массивов ячеек объектов или гетерогенных массивов?

  • В массиве ячеек: A = {foo bar baz qux} % A(1) would be a cell, A{1} gives me a foo object

  • Начиная с R2011a, я могу сделать foo <matlab.mixin.Heterogeneous, а затем построить directy массив: A = [foo bar baz qux] % A(1) directly gives me a foo object

как я понимаю, с точки зрения обслуживания, было бы лучше использовать второй метод, а не первый, таким образом, она удаляет неоднозначность о том, как получить доступ к A. А именно, когда нам нужно разыгрывать элементы массива ячеек (ячейка A(1) vs foo объект A{1}, который живет внутри A(1)).

Но есть ли какая-либо память или штраф за производительность (или выгода) за использование одного синтаксиса против другого?

+1

Я был бы удивлен, если бы вы могли видеть разницу в производительности. Создайте оба объекта и сделайте 'whos', чтобы увидеть их соответствующие размеры. – Floris

+1

@Floris Я сделал это, и похоже, что реализация гетерогенных массивов занимает 104 байта, а массив ячеек занимает целую 864! Однако определение объекта 'foo' само по себе, по-видимому, также занимает 104 байта. Поэтому я не понимаю, что происходит внутри гетерогенной реализации ... –

+1

Проклятие matlab.Никто не знает, что происходит за занавеской, и Матлиб никогда не интересовался рассказом людям о своих секретах. – patrik

ответ

1

Я сделал небольшой эксперимент (source) в память и время работы массива ячеек, контейнеров. Карта и гетерогенный массив. В моем методе я предварительно распределял каждый массив с N = 65535 элементов (максимальный размер массива для массива Map и Heterogenic), затем начал присваивать каждому элементу uint32 и измерять время и память. Мой гетерогенный класс был простым классом с единственным открытым свойством и конструктором, который присвоил это свойство. В контейнерах.Map были пары ключ/значение uint32.

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 неточен. Он скрыт за реализацией класса container.Map, большинство из которых соответствует 112 байт, это память, назначенная самой карте, за исключением данных. Я примеряю истинный размер минимум (112 + 65535 * (sizeof (uint32) * 2)) = 524392 байта. Это значение почти в два раза превышает размер hArr, что заставляет меня думать, что это довольно точно, так как карта должна хранить в два раза больше данных (для значения ключа И) как hArr.

Результаты очевидны:

  • Времени: Массив ячеек < Карта < Гетерогенного массив
  • Память: Гетерогенный Массив < Карты < ячейки массив

я повторил эксперимент с N = 30 для тестирования небольших массивов результаты были схожими. Бог знает, почему клетки занимают столько памяти и гетерогенные массивы настолько медленны.