@$aList 和 $aList 之间的 perl6 性能差异

perl6 Performance difference between @$aList and $aList

我有非常大的数据结构,需要分配和传递。我还需要进入列表。有时当列表在标量容器中时,$aList.elems 会说 1 因为只有一个元素是列表。要进入列表,(@$aList).elems 将给出列表中正确数量的元素。

我的问题是:频繁使用 @$aList 是否存在性能劣势?如果存在性能问题,分配 @b = @$aList 并使用 @b 是否可以解决问题?即,从列表上下文切换到数组上下文时会出现减速吗?

谢谢。

$x.elems(@$x).elems 应该 return 相同的数字。 所以听起来你的代码中有一个你应该修复的错误......可能与 Seq 缓存有关,见下文。

至于性能问题,我没有 运行 基准测试,但请注意 @$x 只是调用 $x.cache,它...

  • 如果 $x 是一个 List 或子类(包括 Array),只需 return 对象本身(没有周围的项目容器),它应该快点。
  • 如果 $x 是另一种类型的对象,则从它创建一个新的 List 并 return 那个,根据类型的不同,这可能会有更多的开销。例如。:
    • String "a" --> List ("a",)
    • 范围 1..10 --> 列表 (1, 2, 3, 4, 5, 6, 7, 8, 9, 10)
      显然,对于巨大的 Ranges,强制转换为列表会占用大量内存和 CPU 性能成本。
    • Seq (1, 2).Seq --> List (1, 2)
      Seq 的情况很特殊,因为它会记住第一次调用 .cache 时创建的 List 对象,并在后续调用中继续 return 相同的对象。这就是为什么该方法首先被称为 .cache 的原因。

(注意 .list 方法也存在,它与 .cache 做同样的事情,除了它不记住 Seq 情况下的列表。)