我有非常大的数据结构,需要分配和传递。我也需要进入名单。有时,当一个列表在标量容器中时,$aList.elems会说1,因为只有一个元素是list。要进入列表,(@$aList).elems将给出列表中正确的元素数。
我的问题是:频繁使用@$aList是否存在性能缺陷,如果存在性能问题,分配@b = @$aList和使用@b会解决这个问题吗?也就是说,在从列表切换到数组上下文的过程中会出现速度下降吗?
谢谢。
发布于 2017-12-29 09:37:27
$x.elems和(@$x).elems应该返回相同的数字。听起来你的代码里有个bug你应该修复..。可能与Seq缓存相关,请参见下面的内容。
至于性能问题,我还没有运行基准测试,但是请注意,@$x只调用了$x.cache,这.
$x是一个List或子类(其中包括Array),那么只返回对象本身(没有周围的项容器),这应该是快速的。$x是另一种类型的对象,那么从它创建一个新的List并返回它,这可能会有更多的开销,这取决于类型。例如:"a" --> List ("a",)1..10 -> List (1, 2, 3, 4, 5, 6, 7, 8, 9, 10)
显然,对于大范围,胁迫到一个列表将有一个很大的内存和CPU性能成本。(1, 2).Seq -> List (1, 2)
Seq的情况是特殊的,因为它会记住第一次调用List时创建的.cache对象,并在随后的调用中继续返回相同的对象。这就是为什么这个方法首先被称为.cache。
(请注意,.list方法也存在,它执行与.cache相同的操作,只是它不记得Seq情况下的列表。)
https://stackoverflow.com/questions/48019666
复制相似问题