StopWatch

         为了判分,写了一段简易的代码,后来修改的时候发现原系统中自带这段代码,看着别人写的代码,觉得别人写的比自己的简洁多了,想着怎么人家就能把代码写的那么简洁,那么效率高.想到曹建新提过,什么测试代码的运行时间来看代码的效率,我也想看看我的代码和别人的代码到底差多少.

         上网查找Stopwatch,用这样的一段代码就能够测试代码的效率.

System.Diagnostics.Stopwatch stopwatch = new Stopwatch();
stopwatch.Start(); //  开始监视代码运行时间
//  you code ....
stopwatch.Stop(); //  停止监视
TimeSpan timespan = stopwatch.Elapsed; //  获取当前实例测量得出的总时间
double hours = timespan.TotalHours; // 总小时
double minutes = timespan.TotalMinutes;  // 总分钟 ...
               我的代码是这样的 :

System.Diagnostics.Stopwatch stopwatch = new System.Diagnostics.Stopwatch();
stopwatch.Start(); //  开始监视代码运行时间

string strCorAnsMy = "chemistry#living#everything#outside#working out#junior#the way#taught#experiments#single"; //正确答案
string strStuAnsMy = "living#everything#outside#working out#junior#the way#taught#experiments#single";          //学生答案
string strIsOrdMy = "有序";//是否有序,测试时需要修改这里

double dlTotalMy = 0;//总分

string[] strArrCorAnsMy = strCorAnsMy.Split('#');  //拆分正确答案
string[] strArrStuAnsMy = strStuAnsMy.Split('#');  //拆分学生答案

for (int i = 0; i < strArrCorAnsMy.Length; i++)
{
	strArrCorAnsMy[i] = strArrCorAnsMy[i].Trim();   //去正确答案的空格
}

for (int i = 0; i < strArrStuAnsMy.Length; i++) //去学生答案空格
{
	strArrStuAnsMy[i] = strArrStuAnsMy[i].Trim();
}

if (strIsOrdMy == "无序")
{
	//由于无序,所以对于正确答案和学生答案进行for循环,比较
	for (int i = 0; i < strArrCorAnsMy.Length; i++)
	{
		for (int j = 0; j < strArrStuAnsMy.Length; j++)
		{
			//如果学生答案等于正确答案,分数+1,并跳出
			if (strArrCorAnsMy[i].Equals(strArrStuAnsMy[j]))
			{
				dlTotalMy += 1; //每题1分,共9分
				break;
			}
		}
	}
}
else  //有序是这样
{
	//循环学生的成绩
	for (int i = 0; i < strArrStuAnsMy.Length; i++)
	{
		//如果正确答案和学生答案一一对应,则正确
		if (strArrCorAnsMy[i].Equals(strArrStuAnsMy[i]))
		{
			dlTotalMy += 1; //每题1分,得0分
		}
	}
}
stopwatch.Stop(); //  停止监视        
TimeSpan timespan = stopwatch.Elapsed; //  获取当前实例测量得出的总时间
doule hours = timespan.TotalHours; // 总小时 断点设在这里double minutes = timespan.TotalMinutes;  // 总分钟 ...

            别人的代码经过修改,是这样的.

System.Diagnostics.Stopwatch stopwatch = new System.Diagnostics.Stopwatch();
stopwatch.Start(); //  开始监视代码运行时间 
string strCorAns = "chemistry#living#everything#outside#working out#junior#the way#taught#experiments#single"; //正确答案
string strStuAns = "living#everything#outside#working out#junior#the way#taught#experiments#single";          //学生答案
string strIsOrd = "有序";//是否有序,测试时需要修改这里

double dlTotal = 0;//总分

string[] strArrCorAns = strCorAns.Split('#');      //拆分正确答案
string[] strArrStuAns = strStuAns.Split('#');//拆分学生答案

if (strIsOrd == "无序")     //无序的话,只要写对了,在哪个空填的都无所谓
{
	for (int i = 0; i < strArrCorAns.Length; i++)  //循环正确答案
	{
		if (strStuAns.IndexOf(strArrCorAns[i].ToString()) > -1) //比较正确答案在学生的答案是否存在
		{
			dlTotal += 1;                         //每题1分,得9分
		}
	}
}
else   //表示有序,必须要和正确答案的顺序一模一样 
{

	//循环学生答案
	for (int j = 0; j < strArrStuAns.Length; j++)
	{
		//如果学生的答案长度大于0,正确答案的长度也大于0,并且正确的答案长度>=学生的答案长度 
		if (strArrStuAns.Length > 0 && strArrCorAns.Length > 0 && strArrCorAns.Length >= strArrStuAns.Length)
		{
			//如果学生答案不为null
			if (strArrCorAns[j] != null)
			{
				//比较学生答案和正确答案去空格之后是否相同
				if (strArrStuAns[j].ToString().Trim() == strArrCorAns[j].ToString().Trim())
				{
					dlTotal += 1;    //有序,得分为0分
				}
			}
		}
	}
}
stopwatch.Stop(); //  停止监视
TimeSpan timespan = stopwatch.Elapsed; //  获取当前实例测量得出的总时间                     
double hours = timespan.TotalHours; // 总小时,断点设在这里
double minutes = timespan.TotalMinutes;  // 总分钟 ...

         时间运行情况,如下面图片显示,我的在前面.先是测试有序的情况.

         有序时,我的代码的时间为 0.0000068.


         有序时,别人的代码的时间为0.0000068,一样.


         无序时,我的代码的时间为0.0000068.


           无序时,别人的代码时间为0.0000441,我的比较快.


         还有其他情况,比如我现在的学生代码,基本和正确答案差不多的顺序,如果我改成,完全不一样的顺序,运行效率是否会有很大区别?

stringstrCorAnsMy = "chemistry#living#everything#outside#working out#junior#theway#taught#experiments#single"; //正确答案

string strStuAnsMy ="single#experiments#taught#the way#junior#workingout#outside#everything#living"; //学生答案掉个个,再测试下无序时的运行时间,发现基本没差别.

0.00000068,和上面一样.

  

         0.0000441,和上面一样


          后来,运行多次发现,timespan不是一定的,这次时间为0.0000441,下次可能就是0.0000498,但是大体上还是差不多的.

         这样看来我的代码运行起来也不是很慢,尤其是无序时.有序时,采用的都是一重循环,我的代码没有做太多的处理,所以可能不安全.无序时,我采用的是,双重循环和equals,而他采用的是一重循环和indexof,照理应该是双重循环慢,所以猜想IndexOf的效率可能比较慢.

        想到老师说的,果然是不怕不知道,就怕不知道.以前不知道要测试代码的效率,现在想起来了,立马就能用,以后可以多多测试测试,了解了解不同代码的运行效率,开发更加优化的代码.

 

还有除了stopwatch,那人的代码使用的时候是有问题的,比如我把正确答案和学生答案改为这样.

  string strCorAnsMy = "a";
            string strStuAnsMy ="an";  //得分为0

         我的代码显示这个得0.但是他的代码运行起来,因为用的是strStuAns.IndexOf(strArrCorAns[i]),所以an.IndexOf(a),>-1,所以

           string strCorAns = "a";
            string strStuAns ="an";  //得分为1

           所以,我的代码还是比较严谨的,尽管用的循环有些腻歪人.最后感慨一下,一段小小的代码,如果不严谨的考虑到各种情况,还是问题多多的,所以测试真的是很有必要的,要不然光看着这段代码,我可看不出什么大问题.

  • 10
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 52
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 52
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值