6

假设我有一些课程foo < handle, and bar < foo, baz < foo, and maybe qux < foo。有几种方法可以存储这些对象的数组:

  • 作为元胞数组:A = {foo bar baz qux} % A(1) would be a cell, A{1} gives me a foo object

  • 从 R2011a 开始,我可以 make foo <matlab.mixin.Heterogeneous,然后直接构建一个数组:A = [foo bar baz qux] % A(1) directly gives me a foo object

在我看来,从维护的角度来看,使用第二种方法而不是第一种方法会更好,这样可以消除关于如何访问的歧义A。即,当我们需要取消引用单元格数组的元素时(单元格A(1)foo对象A{1},位于内部A(1))。

但是,使用一种语法与另一种语法相比,是否存在任何类型的内存或性能损失(或好处)?

4

1 回答 1

2

我对单元格数组、containers.Map 和异构数组的内存和运行时间做了一个小实验(source)。在我的方法中,我为每个数组预先分配了 N=65535 个元素(Map 和异构数组的最大数组大小),然后开始为每个元素分配一个 uint32,并测量时间和内存。我的异构类是一个具有单个公共属性的简单类,以及分配该属性的构造函数。container.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 的大小不准确。它隐藏在containers.Map 类实现之后,最可能报告的112 字节是分配给地图本身的内存,不包括数据。我将真实大小近似为最小(112+65535*(sizeof(uint32)*2)) = 524392 字节。这个值几乎是 hArr 大小的两倍,这让我认为它非常准确,因为映射必须存储两倍于 hArr 的数据(对于键 AND 值)。

结果很简单:

  • 时间:cell Array < Map < Heterogeneous Array
  • 内存:异构数组 < 映射 < 单元数组

我重复了 N=30 的实验来测试小阵列,结果相似。天知道为什么cells占用这么多内存,而Heterogeneous arrays这么慢。

于 2015-01-15T01:19:51.973 回答