@$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
情况下的列表。)
我有非常大的数据结构,需要分配和传递。我还需要进入列表。有时当列表在标量容器中时,$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
的原因。
- String
(注意 .list
方法也存在,它与 .cache
做同样的事情,除了它不记住 Seq
情况下的列表。)