对性能,对象的单元阵列或异构数组有什么好处?

Dan*_*hoa 6 oop performance matlab heterogeneous

假设我有一些课程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,然后直接构建一个数组:A = [foo bar baz qux] % A(1) directly gives me a foo object

我从维护的角度来看,最好使用第二种方法而不是第一种方法,这样就消除了如何访问的模糊性A.也就是说,当我们需要取消引用单元格数组的元素(单元格A(1)foo对象A{1},它们居住在内部A(1)).

但是使用一种语法与另一种语法有什么样的内存或性能损失(或好处)?

Gou*_*uda 2

我对元胞数组、containers.Map 和异构数组的内存和运行时间做了一个小实验(源代码)。在我的方法中,我为每个数组预先分配了 N=65535 个元素(Map 和异构数组的最大数组大小),然后开始为每个元素分配一个 uint32,并测量时间和内存。我的异构类是一个简单的类,具有单个公共属性和分配该属性的构造函数。该containers.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   
Run Code Online (Sandbox Code Playgroud)

请立即注意,mapArray 的大小不准确。它隐藏在containers.Map类实现的后面,报告的112字节很可能是分配给地图本身的内存,不包括数据。我估计真实大小至少为( 112+65535*(sizeof(uint32)*2)) = 524392 字节。这个值几乎是 hArr 大小的两倍,这让我认为它非常准确,因为映射必须存储 hArr 两倍的数据(对于键和值)。

结果很简单:

  • 时间:元胞数组 < 地图 < 异构数组
  • 内存:异构数组 < Map < 元胞数组

我用N=30重复实验来测试小阵列,结果相似。只有上帝才知道为什么单元会占用这么多内存而异构数组却如此缓慢。