我现在判断一个职称,每一个职称都有一个积分段
if(jifen>=0 and jifen<10)
{
zhicheng="初级";
}
elseif(jifen>=10 and jifen<100)
{zhicheng="学徒";}
.
.
.
.
elseif(jifen>=100000 and jifen<10000000)
{zhicheng="神仙";}
请问类似的应用 有if效率高吗 ,如果不高,有什么替代的方法 谢谢
if(jifen>=0 and jifen<10)
{
zhicheng="初级";
}
elseif(jifen>=10 and jifen<100)
{zhicheng="学徒";}
.
.
.
.
elseif(jifen>=100000 and jifen<10000000)
{zhicheng="神仙";}
请问类似的应用 有if效率高吗 ,如果不高,有什么替代的方法 谢谢
解决方案 »
- 不包含“GridView1_PageIndexChanging”的定义
- ASP.NET 2.0中Repeater 中的DropDwonList的问题
- 用session如何判断页面跳转的问题
- 哪位大哥大姐能提供一个完整的,可以正确运行的【Asp.net2005(C#)+Ajax】实例啊!(简单的也可以)
- 急需求救:ASP.NET(C#)数据显示问题啊?
- 请教一个css的变量问题
- 调用asp的问题
- 我想问下南京有没有好点的支持asp.net的空间可以买的啊?数据库是用sql server/access
- 请各位大虾帮忙,紧急求助,在线等!!!vs2003中,asp.net中datagrid模板列中的DropDownList怎么响应...(用vb写)...
- 大家帮忙看看这个能用吗?
- 请教一个关于Web服务器连接数的问题
- 如何 实现分站的功能
if vs. switch,测试与分析
记得在很久以前,博客园上一个哥们抱怨.net的源码写的太烂,到处都是switch,我当时就做过一个测试,证实了switch比if性能高许多。今天又看见这个话题,呵呵,那就再做个测试吧。代码: Code
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Text;namespace ConsoleApplication1
{
class Program
{
static Int32 Count = 100000000; static Int32 TestIfElse(Int32 value)
{
Int32 i = 0;
Stopwatch sw = new Stopwatch();
sw.Start();
for (int j = 0; j < Count; j++ )
{
if (value == 1)
i += 1;
else if (value == 2)
i += 2;
else if (value == 3)
i += 3;
else if (value == 4)
i += 4;
else if (value == 5)
i += 5;
}
sw.Stop();
Console.WriteLine("TestIfElse: " + sw.ElapsedMilliseconds);
return i;
} static Int32 TestSwitch(Int32 value)
{
Int32 i = 0; Stopwatch sw = new Stopwatch();
sw.Start(); for (int j = 0; j < Count; j++)
{
switch (value)
{
case 1:
i+=1;
break;
case 2:
i+=2;
break;
case 3:
i+=3;
break;
case 4:
i+=4;
break;
case 5:
i+=5;
break;
default:
break;
}
}
sw.Stop();
Console.WriteLine("TestSwitch: " + sw.ElapsedMilliseconds); return i;
} static void Main(string[] args)
{
TestIfElse(5);
TestSwitch(5);
Console.Read();
}
}
} release下编译,测试结果:TestIfElse: 613
TestSwitch: 1654倍左右的性能差距。反编译看il,会发现TestSwitch方法中多了这么一句:switch (L_0032, L_0038, L_003e, L_0044, L_004a)这句话实现了一个 jump table。正如一线工作者 所言,这个switch 指令是一个有索引的跳转,而if ... else 是无索引的跳转。if...else 是 O(N)级别的,switch ... case 是 O(1)级别的。如果将上面测试代码的分支增加到10支,测试TestSwitch(10)与TestIfElse(10)的性能,会发现前者比后者几乎快7-8倍。详细解释请参见《深入理解计算机系统》一书中的某章(忘了哪个章节,书不在身边,里面讲了switch和if的区别)。也可参考这篇文章:http://www.9php.com/FAQ/cxsjl/c/2008/10/1435098132356.html。.net下的分析见:http://www.cnblogs.com/yeah/archive/2009/02/16/1392094.html如果switch(String ..),测试了一下,switch与if...else性能相当。我原以为为是无法生成跳转表,刚看完http://www.cnblogs.com/yeah/archive/2009/02/16/1392094.html这篇文章,发现还是可以生成跳转表,只是这个跳转表的代价比简单的整数类型的跳转表代价高。也就是说,这种情况下,switch case 还是O(1)级别分支语句的。
如果判断条件不是那么唯一,还是if的好。
看来只能用if,因为判断的是范围而不是具体某个值
----------------
字符串,集合元素等都可以
int jifen = 0;
int flag = 0;
string zhicheng = string.Empty;flag=jifen/10; //注意类型switch(flag)
{
case 1 :
zhicheng = "初级";
break;
case 10:
zhicheng = "学徒";
break;
...
}