我的代码中有以下方法。我的老板问“你为什么要使用字典”,你可以使用数组,效率更高:
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;
}
我使用它来代码重用。所以我可以绑定到应用程序各个部分的一些月份下拉菜单。
答案 0 :(得分:19)
对于基于整数索引的合理密集集合,数组肯定更有效。
另一方面,数组不允许您使用string
密钥,因为您已获得字典。
回到第一手资料,为什么想要字典的字符串键?
我不会在性能方面过于沉溺 - 编写最易读的代码。如果你确定在这里使用字符串键更合适,那么继续使用字典。替代方法(如果你已经提供了一个字符串)是将整数和索引解析为数组。
对我们说这将是最好的解决方案并不是真的可行。
答案 1 :(得分:7)
你应该对老板说:“我使用字典是因为它会带来更易读和可维护的代码。如果在测试过程中我们检测到应用程序中的性能问题,并且分析表明它是字典的错误,那么我将尝试使用数组。“
答案 2 :(得分:2)
性能测试的基本周期如下:
通过“定义性能要求”,我的意思是你需要可以定量测量的具体事物,例如:
我们要求应用程序可以处理至少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)
你的老板是对的,但是开关速度更快,所以如果你真的想要性能(只有在上面的代码实际上是瓶颈的情况下才适用),请改用开关。它会更难读,但会更快