hash和switch哪个效率更高?

Suriyel 2012-07-09 05:34:29
hash和switch在日常编码中都比较常用,所以对他们哪个效率更高有点好奇,求大大分析下

例如:
switch
switch ("goodday")
{
case "lastday":
s = s + 1;
break;
case "sds":
s += 2;
break;
case "dsd":
s += 3;
break;
case "dsdw":
s += 4;
break;
case "dsds":
s += 5;
break;
case "goodday":
s += 6;
break;
case "dsdsd":
s += 7;
break;
case "rrr":
s += 8;
break;
case "ssss":
s += 9;
break;
case "gggg":
s += 10;
break;
}
hash:
Hashtable Funcs=new Hashtable();
Func<int, int> a = s => s = s + 1;
Func<int, int> b = s => s = s + 2;
Func<int, int> c = s => s = s + 3;
Func<int, int> d = s => s = s + 4;
Func<int, int> e = s => s = s + 5;
Func<int, int> f = s => s = s + 6;
Func<int, int> g = s => s = s + 7;
Func<int, int> h = s => s = s + 8;
Func<int, int> i = s => s = s + 9;
Func<int, int> j = s => s = s + 10;
Funcs.Add("goodday", a);
Funcs.Add("lastday", b);
Funcs.Add("sds", c);
Funcs.Add("dsd", d);
Funcs.Add("dsdw", e);
Funcs.Add("dsds", f);
Funcs.Add("dsdsd", g);
Funcs.Add("rrr", h);
Funcs.Add("ssss", i);
Funcs.Add("gggg", j);
int di = 0;
var temp = Funcs["goodday"] as Func<int, int>;
di = temp(di);
根据vs自带的分析工具:
貌似hash要更快一点
switch:

hash:
...全文
941 27 打赏 收藏 转发到动态 举报
写回复
用AI写文章
27 条回复
切换为时间正序
请发表友善的回复…
发表回复
江南野鹤 2012-07-13
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 的回复:]
hash定位效率高
[/Quote]
dolo1984 2012-07-13
  • 打赏
  • 举报
回复
没法比较,用途不一样。
续写经典 2012-07-13
  • 打赏
  • 举报
回复
分场合,各有妙用
bwangel 2012-07-12
  • 打赏
  • 举报
回复
hash好比一个无线路由器,可以接N个设备包括手机,switch好比一个有线路由器只有固定的四个口。
  • 打赏
  • 举报
回复
这个效率看你怎么用了。case是在情况有限少的情况下来使用的。hash是数据量相对较大的情况下来使用的,能够快速的根据key定位到value。这两个根本不用再同一种情况,问Dictionary和hash还有点靠谱~~~
chen_shaohuang 2012-07-12
  • 打赏
  • 举报
回复
[Quote=引用 16 楼 的回复:]

引用 14 楼 的回复:
大婶说的很有理

引用 10 楼 的回复:

引用 8 楼 的回复:
引用楼主 的回复:
hash和switch在日常编码中都比较常用,



真能扯。假设“日常编码中”将动态地把几百个以上的数据放入Dictionary<K,T>你,写给我硬编码一个几百个case的switch语句出来我看看?你再给我演示如何动态地编写出所谓的switch语句?

……
[/Quote]22222222
Anod 2012-07-10
  • 打赏
  • 举报
回复
[Quote=引用 14 楼 的回复:]
大婶说的很有理

引用 10 楼 的回复:

引用 8 楼 的回复:
引用楼主 的回复:
hash和switch在日常编码中都比较常用,


真能扯。假设“日常编码中”将动态地把几百个以上的数据放入Dictionary<K,T>你,写给我硬编码一个几百个case的switch语句出来我看看?你再给我演示如何动态地编写出所谓的switch语句?

你这个说法,就好象是关公战凤姐……
[/Quote]

好 顶你个肺疼 呵呵
Suriyel 2012-07-10
  • 打赏
  • 举报
回复
受教了
[Quote=引用 13 楼 的回复:]

只有10个元素就不要考虑效率的问题,怎样做效率都很高都差不多,如果元素很多,上百上千,那么当然用hash快,hash的速度和元素个数几乎没有关系,元素数目增加几倍速度还是差不多一样,而switch的速度就按照元素个数增加线性下降,
[/Quote]
Suriyel 2012-07-10
  • 打赏
  • 举报
回复
大婶说的很有理
[Quote=引用 10 楼 的回复:]

引用 8 楼 的回复:
引用楼主 的回复:
hash和switch在日常编码中都比较常用,


真能扯。假设“日常编码中”将动态地把几百个以上的数据放入Dictionary<K,T>你,写给我硬编码一个几百个case的switch语句出来我看看?你再给我演示如何动态地编写出所谓的switch语句?

你这个说法,就好象是关公战凤姐,哪儿也不挨,被你应扯在一起给比较什么“性能”了!……
[/Quote]
stonespace 2012-07-10
  • 打赏
  • 举报
回复
只有10个元素就不要考虑效率的问题,怎样做效率都很高都差不多,如果元素很多,上百上千,那么当然用hash快,hash的速度和元素个数几乎没有关系,元素数目增加几倍速度还是差不多一样,而switch的速度就按照元素个数增加线性下降,
stonespace 2012-07-10
  • 打赏
  • 举报
回复
理论上当然是hash效率高,它的效率是O(1),而switch相当于顺序查找,效率是O(n/2),不过散列计算需要时间,所以如果要查找的集合元素很少的时候,顺序查找switch速度反而更高,

不过楼主的查找对象只有10个元素,应该差不多,
baobaodqh 2012-07-10
  • 打赏
  • 举报
回复
hash定位效率高
threenewbee 2012-07-09
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 的回复:]
引用楼主 的回复:
hash和switch在日常编码中都比较常用,


真能扯。假设“日常编码中”将动态地把几百个以上的数据放入Dictionary<K,T>你,写给我硬编码一个几百个case的switch语句出来我看看?你再给我演示如何动态地编写出所谓的switch语句?

你这个说法,就好象是关公战凤姐,哪儿也不挨,被你应扯在一起给比较什么“性能”了!
[/Quote]
和我想说的高度一致。
SocketUpEx 2012-07-09
  • 打赏
  • 举报
回复
最近大家都比较关注性~~~~能
这是好事啊
  • 打赏
  • 举报
回复
[Quote=引用楼主 的回复:]
hash和switch在日常编码中都比较常用,
[/Quote]

真能扯。假设“日常编码中”将动态地把几百个以上的数据放入Dictionary<K,T>你,写给我硬编码一个几百个case的switch语句出来我看看?你再给我演示如何动态地编写出所谓的switch语句?

你这个说法,就好象是关公战凤姐,哪儿也不挨,被你应扯在一起给比较什么“性能”了!
njw1028 2012-07-09
  • 打赏
  • 举报
回复
代码的运行速度不差这点儿时间。。楼主!
SocketUpEx 2012-07-09
  • 打赏
  • 举报
回复
另外,把Hashtable扔到垃圾桶吧
Dictionary啊Dictionary
Suriyel 2012-07-09
  • 打赏
  • 举报
回复
通过测试,在多次循环引用下,switch效率更好一些。所以我比较郁闷了,不知道导致这个差异的原因在哪
[Quote=引用 2 楼 的回复:]

建议自己实践一下 别人说的都不一定准 分场合和用法
[/Quote]
SocketUpEx 2012-07-09
  • 打赏
  • 举报
回复
循环千万次测试
就像那个蛋疼的for语句的帖子一样
Suriyel 2012-07-09
  • 打赏
  • 举报
回复
为什么呢,求科普
[Quote=引用 1 楼 的回复:]

hash定位效率高
[/Quote]
加载更多回复(2)

110,538

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧