- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我正在做 Dictionary<>
在 O(n^2) 循环中查找并需要它快得离谱。它不是。有没有人知道如何Dictionary<>
实现了吗?在通过探查器运行我的代码并确定字典查找占用了大部分 CPU 时间后,我正在使用一个独立的测试用例测试字典性能。我的测试代码是这样的:
Int32[] keys = new Int32[10] { 38784, 19294, 109574, 2450985, 5, 398, 98405, 12093, 909802, 38294394 };
Dictionary<Int32, MyData> map = new Dictionary<Int32, MyData>();
//Add a bunch of things to map
timer.Start();
Object item;
for (int i = 0; i < 1000000; i++)
{
for (int j = 0; j < keys.Length; j++)
{
bool isFound = map.ContainsKey(keys[j]);
if (isFound)
{
item = map[keys[j]];
}
}
}
timer.Stop();
ContainsKey 和 map[] 是两个慢的部分(同样慢)。如果我添加一个 TryGetValue,它的速度几乎与 ContainsKey 相同。这里有一些有趣的事实..
A Dictionary<Guid, T>
大约是 Dictionary<Int32, T>
的两倍. Dictionary<String, T>
大约是 Guid 字典的两倍。 Dictionary<Byte, T>
比使用 Ints 快 50%。这使我相信 Dictionary 正在执行 O(log n) 二进制搜索来查找键,键上的比较运算符是瓶颈。出于某种原因,我不相信它是作为 Hashtable 实现的,因为 .NET 已经有一个 Hashtable 类,而且根据我的经验,它甚至比 Dictionary 还要慢。
我正在构建的词典一次只能由一个线程访问,因此读取锁定不是问题。 RAM 也不是问题。字典很可能只有大约 10 个桶,但每个桶可以指向大约 2,000 个可能的事物中的一个。有没有人对如何加快速度有任何反馈?谢谢!
迈克
最佳答案
字典是使用哈希表实现的,我前段时间看过使用 Reflector 的代码。
"The dictionary will most likely only have about 10 buckets, but each bucket can point to one of about 2,000 possibly things."
这是你的问题。字典使用散列来定位桶,但桶中的查找是线性的。
您必须实现具有更好分布的哈希算法以获得更好的性能。这种关系至少应该是相反的,即 2000 个桶,每个桶有 10 个项目。
关于c# - .NET Framework - 有什么方法可以让 Dictionary<> 更快一点?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3437542/
我正在用 Python (2.6) 编写一个应用程序,需要我使用字典作为数据存储。 我很好奇拥有一个大字典是否更节省内存,或者将其分解为许多(很多)较小的字典,然后拥有一个包含对所有较小字典的引用的“
Convert this [ "Cat" : ["A" : 1, "B": 2], "Mat" : ["C" : 3, "D": 4] ] Into [ "A" : 1,
有什么很酷的快速方法可以让两个字典创建第三个字典,以内连接方式将第一个字典的键映射到第二个字典的值? Dictionary dic1 = new Dictionary {{a1,b1},{a2,b2}
我希望将字典相互嵌套,以便容纳 block 的 xy 坐标。所以我会 IDictionary, IDictionary> 键 Dictionary 包含列、行组合,而值 Dictionary 包含 x
在 C# 中,我需要将数据保存在字典对象中,如下所示: Dictionary> MyDict = new Dictionary>(); 现在我意识到,在某些情况下我需要一些其他(不是字典类的)
第一个Dictionary就像 Dictionary ParentDict = new Dictionary(); ParentDict.Add("A_1", "1")
我似乎无法理解这个问题。我需要使用 LINQ 按内部字典的值对字典进行排序。有什么想法吗? 最佳答案 你的意思是你想要所有的值,按内部值排序? from outerPair in outer from
我想建模一个模式,其中响应是字典: { 'id1': { 'type': 'type1', 'active': true, }, 'id2': { 'type':
我有以下代码要添加或更新(如果已经存在)dict()-dict 中的值: if id not in self.steps: self.steps[ id ] = step else:
我有一个包含字典的 Swift 字典,我想使用存储的属性来访问键值: var json = [NSObject:AnyObject]() var title: String { get
我想创建一个 Dictionary>结构,我想提供一个 IEqualityComparer在包含 APerson 的second 字典中作为关键 如果我只有内部字典,那就是 var f = new D
我有一个集合,其中包含如下文档:文档 1: { "company": "ABC" "application": { "app-1": {"earning_from_src_A": 50,
我正在快速学习。 我发现 dictionary 就像 hash 用于 PHP 或其他一些语言。 那我怎么制作dictionary的dictionary呢?? 我有这样的数据 key:J name:jh
这个问题在这里已经有了答案: Explode a dict - Get all combinations of the values in a dictionary (2 个答案) 关闭 5 个月前
我是编程新手,所以如果我的问题看起来很愚蠢,我很抱歉。我想问一下有没有办法从 Multi.Dictionary 返回key当我有值(value)? 这是我的代码: Dim myDict Set myD
我试图找出标准 Ada 库是否配备了“字典”类型(我的意思是:一种以 格式存储值的数据结构,我可以从中检索 value 使用相应的唯一 key)。 这样的数据结构存在吗?如果是这样,有人可以提供一个
我究竟做错了什么?根据我的测试,objDic.exists 永远不会给出 False! dim objDic set objDic = createobject("scripting.
我想创建一个复合类型,其中包含一个字典作为其命名字段之一。但是明显的语法不起作用。我敢肯定有一些我不明白的基本原理。下面是一个例子: type myType x::Dict() end Jul
julia> hotcell2vocab = Dict([(cell, i-1+vocab_start) for (i,cell) in enumerate(h
我有一个简单的问题:我对 Dictionary.Value 集合进行了很多次迭代,这让我很烦,我必须调用 .ToList() 然后才能调用 .ForEach(),因为它似乎没有可枚举的Dictiona
我是一名优秀的程序员,十分优秀!