- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
体验 Microsoft 的一些意外性能 ImmutableList
来自 NuGet 包 Microsoft.Bcl.Immutable版本 1.0.34 和 1.1.22-beta
从不可变列表中删除项目时,性能非常慢。对于 ImmutableList
包含 20000 个整数值 (1...20000) 如果开始从值 20000 删除到 1,则需要大约 52 秒才能从列表中删除所有项目。如果我对通用 List<T>
做同样的事情我在每次删除操作后创建列表的副本大约需要 500 毫秒。
我对这些结果感到有点惊讶,因为我认为 ImmutableList
会比复制通用的 List<T>
更快, 但也许这是意料之中的事?
// Generic List Test
var genericList = new List<int>();
var sw = Stopwatch.StartNew();
for (int i = 0; i < 20000; i++)
{
genericList.Add(i);
genericList = new List<int>(genericList);
}
sw.Stop();
Console.WriteLine("Add duration for List<T>: " + sw.ElapsedMilliseconds);
IList<int> completeList = new List<int>(genericList);
sw.Restart();
// Remove from 20000 -> 0.
for (int i = completeList.Count - 1; i >= 0; i--)
{
genericList.Remove(completeList[i]);
genericList = new List<int>(genericList);
}
sw.Stop();
Console.WriteLine("Remove duration for List<T>: " + sw.ElapsedMilliseconds);
Console.WriteLine("Items after remove for List<T>: " + genericList.Count);
// ImmutableList Test
var immutableList = ImmutableList<int>.Empty;
sw.Restart();
for (int i = 0; i < 20000; i++)
{
immutableList = immutableList.Add(i);
}
sw.Stop();
Console.WriteLine("Add duration for ImmutableList<T>: " + sw.ElapsedMilliseconds);
sw.Restart();
// Remove from 20000 -> 0.
for (int i = completeList.Count - 1; i >= 0; i--)
{
immutableList = immutableList.Remove(completeList[i]);
}
sw.Stop();
Console.WriteLine("Remove duration for ImmutableList<T>: " + sw.ElapsedMilliseconds);
Console.WriteLine("Items after remove for ImmutableList<T>: " + immutableList.Count);
如果从 ImmutableList
的开头删除项目,就像使用普通的 foreach 循环一样,性能会好很多。然后删除所有项目需要不到 100 毫秒。这不是您在所有情况下都可以做的事情,但了解一下可能会有所帮助。
最佳答案
Remove
方法必须扫描整个列表以找到要删除的元素。移除本身是 O(1),因为只需要弹出最后一个元素。两种算法都具有二次性能。
为什么运行时间有如此巨大的差异?大概是因为ImmutableList
内部是一个树结构。这意味着要扫描列表,存在大量指针取消引用和不可预测的分支和内存访问。那很慢。
关于c# - Microsoft.Bcl.Immutable 中的 ImmutableList<T> Remove 方法性能低下,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24785116/
.NET 基类库中是否有完整构建器模式的示例?我正在寻找具有实际导演和多个具体 build 者的东西。 最佳答案 我远非这方面的专家,但我认为 DbCommandBuilder及其继承类( OdbcC
在 F# 中,您可以定义一个 first功能如下: let first (x, y) = x 你可以这样称呼它: first (1, 2) 您还可以根据 BCL Tuple 定义相同的函数类型: le
4.5 霍夫曼压缩 Syntax: outsize = Huffman_Compress(in,out,insize) outsize Size of output buffer after comp
如果我有一个类,例如 T1,我想知道它正在使用 BCL 中的哪些类,我该怎么做? 我想到了这个: T1.GetType().GetMethods().Where(x => x.DeclaringTy
在过去,我们可以使用大括号方便地初始化可变集合,如下例所示: var myDictionary = new Dictionary {{"hello", 0m}, {"world", 1m}}; 是否有
代码契约工作得很好,直到你必须为来自框架代码的结果添加无数的Contract.Assume(...)。例如,MemoryStream.ToArray() 从不返回 null 数组,正如我在 Refle
我使用 Microsoft.Bcl.Async package在一个项目中,并且该项目被另一个不使用异步功能的项目引用。 现在我在编译解决方案(或仅编译第二个项目)时收到此错误警告: The prim
好像是 System.Diagnostics.Debug , 和 System.Diagnostics.Trace 大致相同,但值得注意的异常(exception)是 Debug 用法是在发布配置中编
以下是 FSI 中的内容: > System.Math.Round(0.2916, 2);; val it : float = 0.29 > it * 100.;; val it : float =
一些 .net 理论问题:哪些库实际上是标准化的?我知道有一个通用类型系统,它指定了诸如 32 位整数和所有这些低级信息之类的东西,但我对通用语言规范和基类库的状态/关系感到困惑。 系统中有一些基本类
我需要清楚地了解类库。 Base Class Libraries 和 Framework Class Libraries 都属于命名空间——我的意思是我们可以称它们都是命名空间吗?如果不是,我们可以将
比如 Point、Size 等值类型。 我还听说 .NET 中的字符串并非真正不可变。 F# 是否使用这些或它们的替代不可变版本? 如果它使用标准的可变 BCL 类型,这不会损害 F# 在编译和运行时
有什么方法可以知道 .NET 预定义方法的确切时间复杂度。就像我想知道 的复杂性一样 String.Contains() 或 Hashtable.ContainsKey() Microsoft 是否
Microsoft.Bcl.Async 使开发人员能够在没有 .NET Framework 4.5 的情况下使用 async/await 关键字,他们应该以使用它们为目标。 太好了,这要感谢 Micr
我清楚地记得 C# 的 SSE 增强向量的发布,我知道我们不久前才对它们进行了一些测试。现在,它们似乎从互联网上消失了。 2014 年的 NuGet 包仍然存在,但已除名: The owner has
什么是 Microsoft.Bcl.Async 及其用途? 我读过the package page那: This package enables Visual Studio 2012 projects
为什么 BCL 中没有 AutoResetEventSlim 类? 可以用ManualResetEventSlim模拟吗? 最佳答案 ManualResetEvent 和 ManualResetEve
为什么 .NET 基类库没有 CPR 类? 最佳答案 Eric Lippert 对“为什么未实现功能 X”有最好的解释(我认为他知道一两件关于为什么或为什么没有用语言实现的事情) I am asked
BCL 和 CLR(以后只使用 CLR)中的所有 .NET 程序集都是 strongly named and digitally signed .提供数字证书是为了确保程序集未被篡改或更换的信任度。但
我想调试 [MethodImpl(MethodImplOptions.InternalCall)] BCL 方法的实现,该方法可能是用 C++ 实现的。 (在本例中,我正在查看 System.Stri
我是一名优秀的程序员,十分优秀!