问题标签 [immutablelist]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
.net - ImmutableList 的性能特点
它是否在某处记录了 的性能特征ImmutableList<T>
?我对渐近复杂性(big-O)感兴趣。msdn 链接没有透露太多。
从这篇文章中我已经知道Add
并且this[]
都是 O(log n) ,但我也想知道and 。Remove
Insert
我也很想看看新引入的System.Collections.Immutable
命名空间中所有类型的复杂性是否可能。
c# - ImmutableList 的性能缓慢Microsoft.Bcl.Immutable 中的删除方法
ImmutableList
从 NuGet 包Microsoft.Bcl.Immutable版本 1.0.34 和 1.1.22-beta体验 Microsoft 的一些意外性能
从不可变列表中删除项目时,性能非常慢。对于ImmutableList
包含 20000 个整数值 (1...20000) 的情况,如果开始从值 20000 删除到 1,则从列表中删除所有项目大约需要 52 秒。如果我对泛型做同样的事情List<T>
,我在每次删除操作后创建列表的副本,大约需要 500 毫秒。
我对这些结果有点惊讶,因为我认为这ImmutableList
会比复制 generic 更快List<T>
,但也许这是意料之中的?
示例代码
更新
如果从. ImmutableList
_ 删除所有项目只需不到 100 毫秒。这不是您在所有情况下都可以做的事情,但很高兴知道。
java - 关于不可变列表(由 Arrays.asList() 创建)
当我们使用 来从数组创建列表时java.util.Arrays.asList()
,列表是不可变的。List
我只是想知道,当(or Set
or Map
) 的基本目的是具有动态大小并能够随意添加、删除元素时,我们为什么要创建一个不可变列表。当我们需要一个固定大小的数据结构时,我们选择 Array,而当我们需要一个动态数据结构时,我们选择List
or Set
orMap
等等。那么拥有一个不可变列表的目的是什么?我在执行任务时遇到了这个问题。
c# - 为什么这个 .Net Core 实现 ImmutableList不产生无限循环?
我一直在阅读 Microsoft 刚刚发布的 .Net 核心项目中的一些代码。( https://github.com/Microsoft/dotnet ) 很高兴能够看到 .Net 核心团队是如何实现的,我想我可以从他们的代码中学到一两件事。
引起我注意的一件事是 Clear() 的函数是如何实现的。
在我看来,当您创建一个新列表时,空属性会填充一个新列表,然后在运行 Clear 函数时返回该列表;从而取消引用旧列表(如果你说:var students = students.Clear();)并允许 GC 清除旧列表。
所有这些都非常酷,我不明白的是,上面对 Empty 属性的定义如何不会导致无限循环?如果每次创建一个新列表时,它实际上会生成两个,那么这是否意味着为 Empty 属性列表实例化的新 ImmutableList 也为它的 Empty 属性实例化另一个等等?
有人可以解释一下吗?如果我上面的理解不正确,也请纠正我。
java - 如何访问不可变变量的原始值?
不可变变量:一种变量,如果被修改则存储它的原始版本。问题:如何在 Python 中访问该变量的旧版本?还是在 Java 中?或任何其他支持这种“持久数据结构”的语言?还是我对不可变变量的定义错了?
在我更改变量后,假设python:
现在,我如何检索 的旧值var name
?
注意:这个问题与它被标记为重复的问题不同,因为这个问题是关于变量的内存位置,另一个问题是关于变量的范围。
concurrent-collections - Concurrent Collections and Linq
Is Concurrent Collections are thread safe when we use them in linq queries? and what is the difference between Concurrent Collection and Immutable Collections??
c# - 为什么是 ImmutableList的枚举器与 List 相比要慢得多
我有一段代码经常迭代一个小列表。鉴于列表在运行时从不更改,我将实现替换为ImmutableList<T>
. 查看 dotTrace 的性能跟踪,这比正常的性能差得多List<T>
:
(List<T>
在左边,ImmutableList<T>
在右边)
为什么会发生这种情况,是否有解决方法?
java - 返回一个新的 ImmutableList,它是一个现有的列表加上一个额外的元素
我正在使用谷歌的 ImmutableList 类http://google-collections.googlecode.com/svn/trunk/javadoc/com/google/common/collect/ImmutableList.html
我正在寻找一种方法,它采用现有的 ImmutableList 和一个额外的元素(相同类型),并返回一个包含旧元素和新元素的新ImmutableList。
也许我在文档中遗漏了一些明显的东西?
java - 如何创建一个空的 Guava ImmutableList?
我可以使用该方法创建一个GuavaImmutableList
of
,并将根据传递的对象获得正确的泛型类型:
但是,没有参数的of
方法无法推断泛型类型并创建一个ImmutableList<Object>
.
我怎样才能创造一个空ImmutableList
来满足List<Foo>
?
c# - 跨 API 传递不可变集合的最佳模式是什么
在不变性之前,IEnumerable是许多 API 中的首选接口,因为它的优点是 API 对传递对象的实际类型不敏感。
当然,这至少有两个缺点:
API 背后的代码不能依赖collectionOfThings的不变性,并且可能会遇到“集合修改”异常或遇到其他其他微妙问题。
我们不知道collectionOfThings是真正的集合还是只是一个延迟查询。如果我们假设它是一个真正的集合,而实际上不是,我们会冒着运行多个枚举而降低性能的风险。如果我们假设它是一个延迟查询并且它实际上是一个真正的集合,那么将其转换为本地列表或其他冻结集合会产生不必要的成本,尽管它确实有助于保护我们免受第一个问题的影响(在执行“ToList”操作时仍然存在竞争条件)。显然,我们可以编写少量代码来检查这一点并尝试做“正确的事情”,但这很烦人。
我必须承认,除了使用命名约定之外,我从来没有找到一个令人满意的模式来解决这个问题。务实的方法似乎是IEnumerable是传递集合的最低摩擦方法,尽管有缺点。
现在,有了不可变集合,情况得到了很大改善......
不再存在集合修改的风险,并且对多次枚举的性能影响没有歧义。
然而,我们显然失去了 API 的灵活性,因为我们现在必须传入一个ImmutableList。如果我们的客户端有其他类型的可枚举不可变集合,则必须将其复制到ImmutableList中才能被使用,即使我们只想枚举它。
理想情况下,我们可以使用类似的界面
但是当然,除非按照惯例,接口不能强制执行诸如不变性之类的语义。
使用基类可能有效
除了创建未密封的不可变类以免子类引入可变性被认为是不好的形式。无论如何,这在 BCL 中还没有完成。
或者我们可以继续在 API 中使用 IEnumerable 并使用命名约定来明确我们的代码依赖于传入的不可变集合。
所以......我的问题是在传递不可变集合时哪些模式被认为是最好的?一旦我们开始使用不可变性, ImmutableList是“新的IEnumerable ”还是有更好的方法?
更新
IReadOnlyCollection(下面的 Yuval Itzchakov 建议)是对IEnumerable的明显改进,但仍不能完全保护消费者免受集合中不受控制的更改。值得注意的是,Roslyn 代码库大量使用了不可变性(主要通过ImmutableArray),并且在将这些传递给其他方法时似乎使用了显式类型,尽管有几个位置ImmutableList被传递到接受IEnumerable的方法中。