Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/typescript/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Typescript 过滤Immutable.js列表:过滤器vs skipUntil vs findIndex/takeLast_Typescript_Algorithm_Performance_Filtering_Immutable.js - Fatal编程技术网

Typescript 过滤Immutable.js列表:过滤器vs skipUntil vs findIndex/takeLast

Typescript 过滤Immutable.js列表:过滤器vs skipUntil vs findIndex/takeLast,typescript,algorithm,performance,filtering,immutable.js,Typescript,Algorithm,Performance,Filtering,Immutable.js,我需要筛选一个已排序的。为了比较三种不同的方法,我执行了以下基准测试(基于): 从“benny”导入b 从“不可变”导入{Range} 常量元素计数=100000 常量列表=范围(0,elementCount).toList() 常量谓词=(e:number):布尔=>e>elementCount/2 b、 套房( “筛选排序的Immutable.js列表”, b、 添加('通过过滤器',()=>{ list.filter(谓词) }), b、 添加('via skipUntil',()=>{

我需要筛选一个已排序的。为了比较三种不同的方法,我执行了以下基准测试(基于):

从“benny”导入b
从“不可变”导入{Range}
常量元素计数=100000
常量列表=范围(0,elementCount).toList()
常量谓词=(e:number):布尔=>e>elementCount/2
b、 套房(
“筛选排序的Immutable.js列表”,
b、 添加('通过过滤器',()=>{
list.filter(谓词)
}),
b、 添加('via skipUntil',()=>{
list.skipUntil(谓词)
}),
b、 添加('via findIndex/takeLast',()=>{
list.takeLast(list.size-list.findIndex(谓词))
}),
b、 循环(),
b、 完成()
)
以下是我的机器上的结果:

via filter:
    104 ops/s, ±1.54%   | slowest, 77.09% slower

via skipUntil:
    104 ops/s, ±1.65%   | 77.09% slower

via findIndex/takeLast:
    454 ops/s, ±1.17%   | fastest
显然,我期望普通的
过滤器
方法是O(n)最慢的方法,但我有点困惑
findIndex/takeLast
skipUntil
快得多-有人能解释一下吗


更新:与v3.8.2相比,v4.0.0-rc.12中的这看起来像是一个回归,我在immutable中报告了一个

,最昂贵/最慢的操作是在必须创建新内容时

findIndex
仅返回单个元素。它不必创建或修改任何内容

takeLast
内部使用slice,它使用序列创建子列表,而不是填充新列表本身

filter
返回包含所有匹配元素的新集合。创建上述列表是昂贵的

skipUntil
在内部调用
skipWhile(而不是(谓词))
,其工作原理似乎与过滤类似

返回包含条目的相同类型的新集合 从谓词第一次返回true时开始

首先创建列表外的时,您可能会从skipUntil获得更快的结果,因为它是一个惰性包装器,让我们在不完全实现完整集合的情况下执行一些操作


事实上,它们都很好,我建议定期查看它们。Immutable有很多陷阱,可能会浪费性能,因此我倾向于每两天在文档中查找函数。

在Immutable中,最昂贵/最慢的操作是在必须创建新内容时

findIndex
仅返回单个元素。它不必创建或修改任何内容

takeLast
内部使用slice,它使用序列创建子列表,而不是填充新列表本身

filter
返回包含所有匹配元素的新集合。创建上述列表是昂贵的

skipUntil
在内部调用
skipWhile(而不是(谓词))
,其工作原理似乎与过滤类似

返回包含条目的相同类型的新集合 从谓词第一次返回true时开始

首先创建列表外的时,您可能会从skipUntil获得更快的结果,因为它是一个惰性包装器,让我们在不完全实现完整集合的情况下执行一些操作


事实上,它们都很好,我建议定期查看它们。Immutable有很多陷阱,您可能会浪费性能,因此我倾向于每两天在文档中查找函数。

。findIndex在满足您的条件的第一个元素处停止。就你的情况而言,它贯穿了你一半的元素。剩下的两个都经过了。呃,我收回一点,实际上我不确定斯奇普蒂尔会怎么样,我觉得这也很奇怪。我认为这与此有关:
findIndex
的本机实现可能是以一种比
filter
对分支预测更友好的方式编写的吗?…澄清一下:我希望
filter
比其他两个要慢(因为它需要遍历整个列表),但是我想问为什么
findIndex
skipUntil
更快。这只是一个合理的警告:在过去的~2年中,immutablejs中的问题大多没有得到解决。维护者处于非活动状态。他将要添加新的维护者soonish(参见1689期)
。findIndex将在满足您标准的第一个元素处停止。就你的情况而言,它贯穿了你一半的元素。剩下的两个都经过了。呃,我收回一点,实际上我不确定斯奇普蒂尔会怎么样,我觉得这也很奇怪。我认为这与此有关:
findIndex
的本机实现可能是以一种比
filter
对分支预测更友好的方式编写的吗?…澄清一下:我希望
filter
比其他两个要慢(因为它需要遍历整个列表),但是我想问为什么
findIndex
skipUntil
更快。这只是一个合理的警告:在过去的~2年中,immutablejs中的问题大多没有得到解决。维护者处于非活动状态。他即将添加新的维护人员soonish(见1689期)。我同意你所描述的大部分内容。为了澄清:(1)我将
skipUntil
findIndex
takeLast
的组合进行了比较,因此这也包括了一个修改,(2)性能差异在v4.0.0-rc.12中只是令人惊讶,并且与v3.8.2中的预期基本一致(因此出现了回归问题),我怎么会忽视findIndex与takeLast!的结合呢!。补充我的解释我同意你描述的大部分内容。为了澄清:(1)我将
skipUntil
findIndex
takeLast
的组合进行了比较,因此这也包括了一个修改,(2)性能差异在v4.0.0-rc.12中只是令人惊讶,并且与v3.8.2中的预期基本一致(因此出现了回归问题),我怎么会忽视findIndex与takeLast!的结合呢!。补充我的解释