`
sangei
  • 浏览: 336074 次
  • 性别: Icon_minigender_1
  • 来自: 西安
社区版块
存档分类
最新评论
阅读更多

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

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

 

[csharp] view plain copy
 
 在CODE上查看代码片派生到我的代码片
  1. System.Diagnostics.Stopwatch stopwatch = new Stopwatch();  
  2. stopwatch.Start(); //  开始监视代码运行时间  
  3. //  you code ....  
  4. stopwatch.Stop(); //  停止监视  
  5. TimeSpan timespan = stopwatch.Elapsed; //  获取当前实例测量得出的总时间  
  6. double hours = timespan.TotalHours; // 总小时  
  7. double minutes = timespan.TotalMinutes;  // 总分钟 ...  

             我的代码是这样的:

 

 

[csharp] view plain copy
 
 在CODE上查看代码片派生到我的代码片
  1. System.Diagnostics.Stopwatch stopwatch = new System.Diagnostics.Stopwatch();  
  2. stopwatch.Start(); //  开始监视代码运行时间  
  3.   
  4. string strCorAnsMy = "chemistry#living#everything#outside#working out#junior#the way#taught#experiments#single"//正确答案  
  5. string strStuAnsMy = "living#everything#outside#working out#junior#the way#taught#experiments#single";          //学生答案  
  6. string strIsOrdMy = "有序";//是否有序,测试时需要修改这里  
  7.   
  8. double dlTotalMy = 0;//总分  
  9.   
  10. string[] strArrCorAnsMy = strCorAnsMy.Split('#');  //拆分正确答案  
  11. string[] strArrStuAnsMy = strStuAnsMy.Split('#');  //拆分学生答案  
  12.   
  13. for (int i = 0; i < strArrCorAnsMy.Length; i++)  
  14. {  
  15.     strArrCorAnsMy[i] = strArrCorAnsMy[i].Trim();   //去正确答案的空格  
  16. }  
  17.   
  18. for (int i = 0; i < strArrStuAnsMy.Length; i++) //去学生答案空格  
  19. {  
  20.     strArrStuAnsMy[i] = strArrStuAnsMy[i].Trim();  
  21. }  
  22.   
  23. if (strIsOrdMy == "无序")  
  24. {  
  25.     //由于无序,所以对于正确答案和学生答案进行for循环,比较  
  26.     for (int i = 0; i < strArrCorAnsMy.Length; i++)  
  27.     {  
  28.         for (int j = 0; j < strArrStuAnsMy.Length; j++)  
  29.         {  
  30.             //如果学生答案等于正确答案,分数+1,并跳出  
  31.             if (strArrCorAnsMy[i].Equals(strArrStuAnsMy[j]))  
  32.             {  
  33.                 dlTotalMy += 1; //每题1分,共9分  
  34.                 break;  
  35.             }  
  36.         }  
  37.     }  
  38. }  
  39. else  //有序是这样  
  40. {  
  41.     //循环学生的成绩  
  42.     for (int i = 0; i < strArrStuAnsMy.Length; i++)  
  43.     {  
  44.         //如果正确答案和学生答案一一对应,则正确  
  45.         if (strArrCorAnsMy[i].Equals(strArrStuAnsMy[i]))  
  46.         {  
  47.             dlTotalMy += 1; //每题1分,得0分  
  48.         }  
  49.     }  
  50. }  
  51. stopwatch.Stop(); //  停止监视          
  52. TimeSpan timespan = stopwatch.Elapsed; //  获取当前实例测量得出的总时间  
  53. doule hours = timespan.TotalHours; // 总小时 断点设在这里double minutes = timespan.TotalMinutes;  // 总分钟 ...  

 

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

[csharp] view plain copy
 
 在CODE上查看代码片派生到我的代码片
  1. System.Diagnostics.Stopwatch stopwatch = new System.Diagnostics.Stopwatch();  
  2. stopwatch.Start(); //  开始监视代码运行时间   
  3. string strCorAns = "chemistry#living#everything#outside#working out#junior#the way#taught#experiments#single"//正确答案  
  4. string strStuAns = "living#everything#outside#working out#junior#the way#taught#experiments#single";          //学生答案  
  5. string strIsOrd = "有序";//是否有序,测试时需要修改这里  
  6.   
  7. double dlTotal = 0;//总分  
  8.   
  9. string[] strArrCorAns = strCorAns.Split('#');      //拆分正确答案  
  10. string[] strArrStuAns = strStuAns.Split('#');//拆分学生答案  
  11.   
  12. if (strIsOrd == "无序")     //无序的话,只要写对了,在哪个空填的都无所谓  
  13. {  
  14.     for (int i = 0; i < strArrCorAns.Length; i++)  //循环正确答案  
  15.     {  
  16.         if (strStuAns.IndexOf(strArrCorAns[i].ToString()) > -1) //比较正确答案在学生的答案是否存在  
  17.         {  
  18.             dlTotal += 1;                         //每题1分,得9分  
  19.         }  
  20.     }  
  21. }  
  22. else   //表示有序,必须要和正确答案的顺序一模一样   
  23. {  
  24.   
  25.     //循环学生答案  
  26.     for (int j = 0; j < strArrStuAns.Length; j++)  
  27.     {  
  28.         //如果学生的答案长度大于0,正确答案的长度也大于0,并且正确的答案长度>=学生的答案长度   
  29.         if (strArrStuAns.Length > 0 && strArrCorAns.Length > 0 && strArrCorAns.Length >= strArrStuAns.Length)  
  30.         {  
  31.             //如果学生答案不为null  
  32.             if (strArrCorAns[j] != null)  
  33.             {  
  34.                 //比较学生答案和正确答案去空格之后是否相同  
  35.                 if (strArrStuAns[j].ToString().Trim() == strArrCorAns[j].ToString().Trim())  
  36.                 {  
  37.                     dlTotal += 1;    //有序,得分为0分  
  38.                 }  
  39.             }  
  40.         }  
  41.     }  
  42. }  
  43. stopwatch.Stop(); //  停止监视  
  44. TimeSpan timespan = stopwatch.Elapsed; //  获取当前实例测量得出的总时间                       
  45. double hours = timespan.TotalHours; // 总小时,断点设在这里  
  46. 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,那人的代码使用的时候是有问题的,比如我把正确答案和学生答案改为这样.

 

[csharp] view plain copy
 
 在CODE上查看代码片派生到我的代码片
  1. string strCorAnsMy = "a";  
  2.           string strStuAnsMy ="an";  //得分为0  

 

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

 

[csharp] view plain copy
 
 在CODE上查看代码片派生到我的代码片
  1. string strCorAns = "a";  
  2.  string strStuAns ="an";  //得分为1  

 

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

分享到:
评论

相关推荐

    Visual C++源代码 26 如何使用Stopwatch实现高精度计时

    Visual C++源代码 26 如何使用Stopwatch实现高精度计时Visual C++源代码 26 如何使用Stopwatch实现高精度计时Visual C++源代码 26 如何使用Stopwatch实现高精度计时Visual C++源代码 26 如何使用Stopwatch实现高精度...

    Java计时新姿势StopWatch详解

    Java计时新姿势StopWatch详解 StopWatch是Java中的一种计时工具,主要用于对某个操作或方法的执行时间进行计时。通过使用StopWatch,可以很方便地对程序的执行时间进行跟踪和分析。 StopWatch的使用非常简单,只...

    Stopwatch

    "Stopwatch"是一个在计算机编程领域中常见的工具,特别是在性能测试和时间测量方面。Stopwatch类通常被用于C#、Java、Python等编程语言中,它允许开发者精确地度量代码段执行的时间,这对于优化算法和提升程序效率至...

    基于swift开发的Stopwatch应用程序

    基于swift开发的Stopwatch应用程序基于swift开发的Stopwatch应用程序基于swift开发的Stopwatch应用程序基于swift开发的Stopwatch应用程序基于swift开发的Stopwatch应用程序基于swift开发的Stopwatch应用程序基于...

    基于IDEA调试模式与StopWatch工具类如何优雅实现Java代码执行时间检测统计博文的代码工程

    作为程序员在我们的日常编码过程中经常需要统计一段代码或者一个方法的执行时间,尤其是当以一...这是基于IDEA调试模式与StopWatch工具类如何优雅实现Java代码执行时间检测统计的代码工程资源文件,欢迎大家下载学习。

    匿名委托及Stopwatch

    在.NET框架中,匿名委托和`Stopwatch`类是两种非常重要的编程概念,它们在实际开发中有着广泛的应用。现在让我们深入探讨这两个主题,并通过具体的示例来理解它们的使用。 首先,我们来讨论匿名委托。匿名委托允许...

    StopWatch (jar)多个文件

    StopWatch 是一个在Java编程语言中广泛使用的工具类,它属于Apache Commons Lang库的一部分。这个类主要用于衡量代码段或任务的执行时间,帮助开发者进行性能分析和优化。它的工作原理是通过记录开始和结束时间来...

    《C#计时利器:Stopwatch的使用》源代码

    在.NET框架中,`System.Diagnostics.Stopwatch`类是开发者用于衡量代码执行时间的重要工具,尤其在性能测试和优化中起到关键作用。`Stopwatch`类提供了精确到纳秒级的时间测量,使得它成为C#中计时的首选方法。本文...

    matlab开发-Stopwatch

    在MATLAB中,Stopwatch是一种实用工具,用于度量代码段执行所需的时间,这对于性能分析和优化至关重要。MATLAB的Stopwatch功能可以帮助开发者追踪程序运行的精确时间,从而更好地理解和改进算法效率。在这个"matlab...

    使用Stopwatch实现高精度计时

    在.NET框架中,`System.Diagnostics.Stopwatch`类提供了一种高效、精确的方式来测量代码执行的时间。这个类特别适合用于性能测试和基准测试,因为它能够准确地跟踪时间间隔,不受系统时钟中断的影响。下面我们将详细...

    Stopwatch(备用资料)

    Stopwatch 是一个常见的计时工具,在编程中,尤其是在性能测试和调试过程中,它被广泛用于测量代码执行的时间。本文将围绕“Stopwatch”这一主题,深入探讨其在编程中的应用,以及如何通过代码实现一个简单的秒表...

    CSharp 4.0 .Net Framework V4.0 Stopwatch 类

    C# 中的 `Stopwatch` 类是 .NET Framework 4.0 版本中的一个工具,用于精确地测量代码执行的时间。它属于 `System.Diagnostics` 命名空间,并且包含在 `System.dll` 程序集中。`Stopwatch` 类提供了多种方法和属性,...

    Hybrid Stopwatch Timer v3.1.4 for Android 一款设计独特、方便并可精确计时的 Android 应用.rar

    《Hybrid Stopwatch Timer v3.1.4:Android平台上的高效计时利器》 Hybrid Stopwatch Timer v3.1.4是一款专为Android用户设计的独特、便捷且精度极高的计时应用。它融合了传统秒表与定时器的功能,使得在多种场景下...

    digital_stopwatch.zip

    在本项目中,"digital_stopwatch.zip"是一个包含FPGA(Field Programmable Gate Array)设计的数字跑表的压缩文件。这个设计不仅实现了基础的计时功能,如复位、暂停和秒表,而且经过了实际测试,确保了功能完善且...

    android STopwatch

    在Android平台上,开发一个Stopwatch应用是一项常见的任务,它能够帮助用户计时,通常用于运动、学习或游戏等场合。本应用名为"android Stopwatch",由开发者亲自编写,旨在提供可靠的秒表功能,并且特别强调了对...

    Stopwatch精准秒表

    在.NET框架中,`System.Diagnostics.Stopwatch`类是用于测量时间间隔的一个强大工具,它提供了比`System.Timers.Timer`或`System.Threading.Timer`更高的精度。`Stopwatch`类特别适用于需要精确计时的场合,比如性能...

    stopwatch.rar

    "stopwatch.rar"这个压缩包文件很可能包含一个秒表应用或相关程序,便于用户在电脑上使用秒表功能。由于标签为"aa",这可能意味着文件的分类或特性不是很具体,但我们可以深入探讨秒表在不同场景下的应用及其相关...

    如何使用Stopwatch实现高精度计时C#.net源代码编写

    在.NET框架中,`System.Diagnostics.Stopwatch`类是用于测量时间间隔的一个强大工具,尤其适合在性能测试或计算中需要高精度计时的情况。本文将详细介绍如何使用C#.NET来利用`Stopwatch`类实现高精度计时,并提供源...

    Stopwatch_秒表_

    Stopwatch stopwatch = new Stopwatch(); stopwatch.Start(); while (stopwatch.IsRunning) { Console.WriteLine("已过去的时间: {0}", stopwatch.Elapsed); Thread.Sleep(1000); // 暂停1秒以更新显示 } ...

    秒表_stopwatch_

    秒表(Stopwatch)在IT领域中是一种常见的时间测量工具,尤其在软件开发、性能测试和游戏编程中有着广泛的应用。秒表功能通常用于精确地测量代码执行的时间,以评估程序性能或进行基准测试。在硬件层面,秒表功能...

Global site tag (gtag.js) - Google Analytics