我的数据结构非常大,需要分配和传递。我还需要进入清单。有时当列表位于标量容器中时,$aList.elems
会说1
,因为列表中只有一个元素。要进入列表,(@$aList).elems
将在列表中提供正确数量的元素。
我的问题是:经常使用@$aList
是否存在性能劣势,如果存在性能问题,是否会分配@b = @$aList
并使用@b
来解决问题?即,从列表切换到数组上下文会有加速吗?
谢谢。
$x.elems
和(@$x).elems
应返回相同的数字。所以听起来你的代码中有一个错误你应该修复...可能与Seq
缓存相关的东西,见下文。
至于性能问题,我没有运行基准,但请注意@$x
只是调用$x.cache
,其中...
$x
是List
或子类(包括Array
),只需返回对象本身(没有周围的项容器),这应该很快。$x
是另一种类型的对象,则从中创建一个新的List
并返回该值,这可能会有更多的开销,具体取决于类型。例如。:
String "a"
- >列出("a",)
范围1..10
- >列出(1, 2, 3, 4, 5, 6, 7, 8, 9, 10)
显然,对于巨大的Ranges,强制列表将会产生大量内存和CPU性能成本。
Seq (1, 2).Seq
- >列出(1, 2)
Seq的情况很特殊,因为它记住了第一次调用List
时创建的.cache
对象,并在后续调用中继续返回相同的对象。这就是为什么这个方法首先被称为.cache
。(注意,.list
方法也存在,它与.cache
完全相同,只是它不记得Seq
案例中的List。)