数组比词典更高效

时间:2009-11-16 14:56:36

标签: c#

我的代码中有以下方法。我的老板问“你为什么要使用字典”,你可以使用数组,效率更高:

    public static Dictionary<string, string> GetListOfMonths()
    {
        Dictionary<string, string> months = new Dictionary<string, string>();

        months.Add("1", "Jan");
        months.Add("2", "Feb");
        months.Add("3", "Mar");
        months.Add("4", "Apr");
        months.Add("5", "May");
        months.Add("6", "Jun");
        months.Add("7", "Jul");
        months.Add("8", "Aug");
        months.Add("9", "Sep");
        months.Add("10", "Oct");
        months.Add("11", "Nov");
        months.Add("12", "Dec");

        return months;
    }

我使用它来代码重用。所以我可以绑定到应用程序各个部分的一些月份下拉菜单。

9 个答案:

答案 0 :(得分:19)

对于基于整数索引的合理密集集合,数组肯定更有效。

另一方面,数组不允许您使用string密钥,因为您已获得字典。

回到第一手资料,为什么想要字典的字符串键?

我不会在性能方面过于沉溺 - 编写最易读的代码。如果你确定在这里使用字符串键更合适,那么继续使用字典。替代方法(如果你已经提供了一个字符串)是将整数和索引解析为数组。

对我们说这将是最好的解决方案并不是真的可行。

答案 1 :(得分:7)

你应该对老板说:“我使用字典是因为它会带来更易读和可维护的代码。如果在测试过程中我们检测到应用程序中的性能问题,并且分析表明它是字典的错误,那么我将尝试使用数组。“

答案 2 :(得分:2)

性能测试的基本周期如下:

  1. 定义性能要求
  2. 衡量实际表现
  3. 如果实际效果为&gt; =要求,请停止
  4. 个人资料申请并找到瓶颈
  5. 尝试修复瓶颈
  6. 转到2
  7. 通过“定义性能要求”,我的意思是你需要可以定量测量的具体事物,例如:

      

    我们要求应用程序可以处理至少100个并发用户,其中思考时间以均值为中心,使用正态分布,每个时间到最后一个字节(TTLB)不超过2秒,执行以下一组关键业务场景:50%浏览产品,10%购买产品,20%做其他事情,20%做另外一件事。

    如果你还没有完成(1)那么你就不能继续(2)所以坚持到你做完为止。如果你已经完成了(1)那么你可以按照其余的步骤进行操作,并且关于是否需要优化这些代码的答案将不再适用。

答案 3 :(得分:1)

嗯..如果你需要用固定的,连续的数字索引放一些东西 - 实际上,添加1,2,3,4,5等等没有意义,因为简单的数组会为你做。

你的老板是对的,你应该把它改成字符串[]数组或StringCollection

答案 4 :(得分:1)

据我所知,如果你正在创建一个业务应用程序,那么Dictionary的效率会略低于List,那么它可能不会成为性能瓶颈。

但是,从语义上讲,List可能会同样好,除非你想明确定义月份指数(例如为了清晰)。

P.S。如果您使用字典,我会将方法重命名为 GetDictionaryOfMonths() GetMonths()

答案 5 :(得分:1)

好吧,我刚刚完成了一个benchMark,发现哪个更快(List,数组,字典)并制作1000次循环,最后发现比字典略快(2%)更快。

答案 6 :(得分:0)

你的老板是对的。由于您要按月号访问它,因此您可以对该值进行O(1)访问,而无需设置字典的额外开销。

所以我刚刚读到你正在填写一个下拉列表。而不是查找获得月份的缩写名称,只需将其作为下拉列表值。

答案 7 :(得分:0)

这听起来像是时钟周期交易记忆的论据。确实,Dictionary会有更多的额外开销,但如果经常访问它,你应该实际上长期保存时钟周期,因为每次你想要查找一个值时都不必循环遍历数组。

但这里的主要考虑因素是可读性。在数组查找的代码中,字典查找更容易理解。一点点的开销,很少有这么小的收藏,非常值得恕我直言。

同样对于一些重构,我会使用Dictionary<int, string>来获得更明显的类型安全性和利用率。使用调用int的字符串没有意义。

答案 8 :(得分:0)

你的老板是对的,但是开关速度更快,所以如果你真的想要性能(只有在上面的代码实际上是瓶颈的情况下才适用),请改用开关。它会更难读,但会更快