Alo*_*kin 21 .net c# generics performance dictionary
我需要快速更换System.Collections.Generic.Dictionary<TKey, TValue>.我的申请应该非常快.所以,替换应该支持:
......就是这样.我不需要LINQ或任何支持.它应该很快.
一个简单的代码如:
Stopwatch stopWatch = Stopwatch.StartNew();
Dictionary<string, string> dictionary = new Dictionary<string, string>();
dictionary.Add("fieldName", "fieldValue");
dictionary.Add("Title", "fieldVaaaaaaaaaaaaaaaaalue");
Console.WriteLine(stopWatch.Elapsed);
Run Code Online (Sandbox Code Playgroud)
...打印00:00:00.0001274,这对我来说很多时间,因为我的应用程序正在做很多其他的事情,其中一些来自旧的慢速库我必须使用并且不依赖于我.
关于如何实施更快速的想法?
谢谢.
Jon*_*eet 64
有可能你正在看JIT编译.在我的盒子上,我看到:
00:00:00.0000360
00:00:00.0000060
Run Code Online (Sandbox Code Playgroud)
当我在同一个进程中快速连续运行两次 - 而不是在调试器中.(确保你没有在调试器中运行它,否则这是一个毫无意义的测试.)
现在,测量任何时候那微小的通常是一个坏主意.你需要迭代数百万次才能更好地了解它需要多长时间.
您是否有充分的理由相信它实际上会降低您的代码速度 - 或者您是基于原始时机进行的?
我怀疑你会发现任何明显更快的东西,Dictionary<TKey, TValue>并且我会惊讶地发现它是瓶颈.
编辑:我刚刚基准测量添加一百万个元素到Dictionary<TKey, TValue>所有键都是现有对象(数组中的字符串),重用相同的值(因为它不相关)和指定一百万的构建容量 - 它花了大约在我两岁的笔记本电脑上0.15秒.
这是否真的可能成为你的瓶颈,因为你已经说过你在应用程序的其他地方使用了一些"旧的慢速库"?请记住,其他库越慢,改进的集合类的影响就越小.如果字典更改仅占您整个应用程序时间的1%,那么即使我们可以提供即时字典,您也只能将应用程序加速1%.
与以往一样,获取一个分析器 - 它会让您更好地了解您的时间.
Ree*_*sey 35
我同意Jon Skeet的假设,即这很可能是JIT编译.
话虽这么说,我想在这里添加一些其他信息:
与使用Dictionary<T,U>相关的大多数速度问题与Dictionary的实现无关. Dictionary<T,U>非常快,开箱即用.打败它会很困难.
与Dictionary实例相关的速度问题几乎总是实际上是哈希代码实现问题.如果您在使用时遇到速度问题Dictionary<MyCustomClass,MyValue>,请重新访问GetHashCode()您在MyCustomClass上定义的实现.如果您使用自定义结构作为键,这一点就更为重要.
为了从Dictionary中获得良好的性能,GetHashCode()应该是:
如果你做对了,我想你会对默认的Dictionary实现感到非常满意.
不要忘记,您也在该代码中对Dictionary构造函数进行计时.我做了一个测试,将测量中的调用移到了构造函数中,然后循环了10次.这是我的测试代码:
for (int i = 0; i < 10; i++)
{
Dictionary<string, string> test = new Dictionary<string, string>();
System.Diagnostics.Stopwatch watch = System.Diagnostics.Stopwatch.StartNew();
test.Add("fieldName", "fieldValue");
test.Add("Title", "fieldavlkajlkdjflkjalkjslkdjfiajwelkrjelrkjavoijl");
Console.WriteLine(watch.Elapsed);
}
Console.ReadKey();
Run Code Online (Sandbox Code Playgroud)
以下是结果:
00:00:00.0000607
00:00:00.0000025
00:00:00.0000015
00:00:00.0000015
00:00:00.0000016
00:00:00.0000017
00:00:00.0000016
00:00:00.0000016
00:00:00.0000016
00:00:00.0000015
Run Code Online (Sandbox Code Playgroud)
我不确定你得到多快多少...
更新
看起来这也反映了Jon Skeets的结果... JIT.
使用整数作为键以获得最佳性能:
对于任何从 Google 来到这里的人来说,如果您想从字典中榨取最后一点性能,那么可以使用 Int 作为键。这是比较 Int 与 String 键的基准: https ://jacksondunstan.com/articles/2527
文章的作者甚至提到,如果你有这样的需求,将字符串转换为整数是值得的。
另请注意,同样的行为也发生在 PHP 等其他一些语言中。PHP 关联数组实际上是字典,如果您在 PHP7 中按升序使用 Int,它们的性能将大大优于字符串键。