我应该关注.NET字典的速度吗?

Ear*_*rlz 25 c# arrays optimization dictionary

我将创建一个将使用字典查找和插入相当多的项目.这是值得关注的吗?

此外,如果我进行基准测试等并且它确实很糟糕,那么用其他东西替换字典的最佳方法是什么?使用带有"散列"键的数组会更快吗?那会对插入时间有所帮助吗?

另外,我认为我不是微优化,因为这确实是生产服务器上代码的重要组成部分,因此如果需要额外100毫秒才能完成,那么我们将寻找新的方法来处理这个问题.

Joh*_*ers 79

  1. 微观优化.你甚至还有工作代码吗?请记住,"如果它不起作用,它无效的速度无关紧要." (Mich Ravera)http://www.codingninja.co.uk/best-programmers-quotes/.

    你不知道瓶颈会在哪里,而且你已经专注于词典.如果问题出在其他地方怎么办?

  2. 你怎么知道Dictionary类是如何实现的?也许它已经使用了带有散列键的数组!

PS它实际上是".NET Dictionaries",而不是"C#Dictionaries",因为C#只是使用该框架的几种编程语言之一.

  • 如果它会影响应用程序的设计,那么它不是"过早优化".你不想写一个应用程序,然后意识到你的设计是错误的,你必须重写它.人们如此迅速地反复出现在上下文之外的报价...... (53认同)
  • +1用于调用过早优化...您无法优化尚未编写的代码 (34认同)
  • "如果它不起作用,它无效的速度无关紧要." http://stackoverflow.com/questions/58640/great-programming-quotes/1649033#1649033 (17认同)
  • 有一个视频,http://www.youtube.com/watch?v = aAb7hSCtvGw,我曾经看过Joshua Bloch谈论过如何在它成为一个问题之前考虑一下它的性能(我认为它大约有一半) ).从伟大的编程引用CW - "编码周可以为您节省数小时的计划." (6认同)
  • 另一个+1为过早优化.我同意这么多,除了提出答案并点击戴夫评论的向上箭头外,我还写了一篇新的评论. (2认同)
  • 这位投反对票的人不喜欢#1 中表现出的态度。(我很想以电影《公主新娘》的风格称你为“猪”)。 (2认同)

Eri*_*ert 66

您好,我将创建一个将使用字典查找和插入相当多的项目.这是值得关注的吗?

是.预先考虑性能因素总是明智的.

您需要考虑的形式如下:您的关注应该是鼓励您编写切合实际的,以用户为中心的性能规范.应该鼓励您尽早开始编写性能测试并经常运行它们,这样您就可以看到产品的每一次更改如何影响性能.这样,当代码更改导致影响用户的性能变化时,您将立即得到通知.并且它应该鼓励您经常运行配置文件,以便您根据经验测量推断性能,而不是随机猜测和预测.

此外,如果我进行基准测试等并且它确实很糟糕,那么用其他东西替换字典的最佳方法是什么?

最好的方法是构建一个合理的抽象层.如果您有一个表示"插入"和"查找"抽象数据类型的类(或接口),则可以在不更改任何调用者的情况下替换其内部.

请注意,添加抽象层本身会产生性能成本.如果您的分析显示抽象层太昂贵,如果每次调用额外的几纳秒太多,那么您可能不得不摆脱抽象层.同样,这个决定将由现实世界的性能数据驱动.

使用带有"散列"键的数组会更快吗?那会对插入时间有所帮助吗?

无论是你还是读过这篇文章的人都不可能知道哪一个更快,直到你用两种方式写出来然后在现实世界的条件下对它进行基准测试.在"实验室"条件下进行此操作会使您的结果产生偏差; 当GC处于实际内存压力下时,您需要了解其工作原理,等等.你不妨问我们明年肯塔基德比赛中哪匹马会跑得更快.如果我们只是通过观察比赛形式就知道答案,我们都已经变得富有了.在未指定的条件下,您不可能指望任何人知道两个完全假设的,不成文的代码中的哪一个会更快!

  • 我会在 2010 年肯塔基德比中猜测并说“超级节省”。 (2认同)

And*_*tad 10

Dictionary<TKey, TValue>班作为一个哈希表,这使得查找非常快的实际实施(接近O(1)).有关更多信息,请参阅API文档.我怀疑你自己能做出更好的实施.

  • 不要在这里担任模糊裤子先生,但O(1)并不意味着它很快,它只是意味着它是恒定的时间.但是,这个恒定的时间可能很长或很短.也就是说,O(1)在实践中往往很快. (11认同)

Jus*_*tin 10

等一下,看看您的应用程序的性能是否低于预期
如果是,那么使用分析器来确定字典查找是否是问题的根源
如果是,那么使用代表性数据进行一些测试以查看列表的另一个选择是否是更快.

简而言之 - ,一般来说,在遇到问题之前,您不应该担心实现细节的性能.


Nei*_*l N 5

我会做一下Dictionary,HashTable(.NET中的HashSet)的基准测试,也许是一个本土的类,看看哪些在你的典型使用条件下效果最好.

通常情况下我会说这很好(在这里插入StackOverflow最喜欢的早泄引用),但如果这是应用程序的核心,Benchmark,Benchmark,Benchmark.

  • 字典<TKey,TValue>应始终优于HashTable.即使Dictionary <TKey,TValue>不存在,.NET HashTable也是一个坏主意:) (3认同)