此处耗时统计实际上采用的是Stopwatch ,因为耗时统计对时间要求比较严苛,

本文所采用方法其实理论上只是用来方便统计、可能准确度上让人不大放心。

本文只是做了个简单的封装、准确度上差别应该不是问题。

调用方法见代码summary

///<summary>耗时统计///<para>建议采用关闭时写入、实时写入日志等耗时操作将严重影响统计</para>  ///<para>初始化:string TJGuid = WatchTimerHelper.WatchTimerStart("计时器001")</para>  ///<para>追加消息:WatchTimerHelper.WatchTimerMsgAttach(TJGuid, "预警项目");</para>  ///<para>关闭:WatchTimerHelper.WatchTimerStop(TJGuid);</para>  ///</summary>public class WatchTimerHelper{#region 私有属性private static Dictionary<string, StopwatchEx> _m_WatchTimerDic = new Dictionary<string, StopwatchEx>();#endregion#region 枚举结构/// <summary>/// 统计器描述/// </summary>public class StopwatchDesc {/// <summary>/// 计时器唯一表示/// </summary>public string m_WatchGuid { get; set; }/// <summary>/// 计时器名称/// </summary>public string m_WatchName { get; set; }public E_RaiseType m_RaiseType{get;set;}public E_RaiseTime m_RaiseTime { get; set; }}/// <summary>/// 统计器时间线/// </summary>private class StopwatchTimeLine {/// <summary>/// 当前时间点运行总时/// </summary>public TimeSpan Elapsed { get; set; }/// <summary>/// 当前时间点运行总时 - 毫秒/// </summary>public long ElapsedMilliseconds { get; set; }/// <summary>/// 当前时间点运行总时 - 秒/// </summary>public long ElapsedTicks { get; set; }public string Msg { get; set; }}/// <summary>/// 统计器/// </summary>private class StopwatchEx : Stopwatch{public StopwatchDesc m_StopwatchDesc { get; set; }public List<StopwatchTimeLine> m_RaisTimeLine_List { get; set; }}/// <summary>/// 统计输出类型/// </summary>public enum E_RaiseType { /// <summary>/// 控制台/// </summary>Console = 0x01,}/// <summary>/// 统计时间输出类型/// </summary>public enum E_RaiseTime { /// <summary>/// 实时/// </summary>RealTime = 0x01,/// <summary>/// 关闭时输出/// </summary>StopTime = 0x02,}#endregion#region 公共属性#endregion#region 公共方法/// <summary>/// 开启耗时统计/// </summary>public static string WatchTimerStart(string WatchName,E_RaiseTime RaiseTime = E_RaiseTime.RealTime, E_RaiseType RaiseType = E_RaiseType.Console){//统计器初始化StopwatchEx watch = new StopwatchEx();watch.m_StopwatchDesc = new StopwatchDesc() { m_WatchGuid = Guid.NewGuid().ToString(), m_WatchName = WatchName, m_RaiseTime = RaiseTime, m_RaiseType = RaiseType };watch.m_RaisTimeLine_List = new List<StopwatchTimeLine>();_m_WatchTimerDic.Add(watch.m_StopwatchDesc.m_WatchGuid, watch);//开始统计watch.Start();//附加消息WatchTimerMsgAttach(watch.m_StopwatchDesc.m_WatchGuid, "统计器开启!");return watch.m_StopwatchDesc.m_WatchGuid;}/// <summary>/// 关闭耗时统计/// </summary>public static void WatchTimerStop(string WatchGuid){if (_m_WatchTimerDic.ContainsKey(WatchGuid) == false){return ;}_m_WatchTimerDic[WatchGuid].Stop();//附加消息 - 输出WatchTimerMsgAttach(WatchGuid, "统计器结束!");//去除统计器_m_WatchTimerDic[WatchGuid] = null;_m_WatchTimerDic.Remove(WatchGuid);}/// <summary>/// 统计器附加消息/// </summary>/// <param name="WatchGuid"></param>/// <param name="Msg"></param>public static void WatchTimerMsgAttach(string WatchGuid,string Msg){if (_m_WatchTimerDic.ContainsKey(WatchGuid) == false){return;}var watch = _m_WatchTimerDic[WatchGuid];StringBuilder SB = new StringBuilder();//统计器描述SB.AppendFormat("================================ {0} ================================\r\n",watch.m_StopwatchDesc.m_WatchName);//标识及时间SB.AppendFormat("Guid:{0}\tTime:{1}\r\n", watch.m_StopwatchDesc.m_WatchGuid, DateTime.Now.ToString("yyyy-MM-dd"));//附加消息SB.AppendFormat("Message:{0}\r\n",Msg);//时间统计 - 总时秒,总时毫秒,上次总时间SB.AppendFormat("Times(S):{0}\tTimes(ms):{1}\tTimeSpace(ms):{2}\r\n", watch.ElapsedTicks, watch.ElapsedMilliseconds, watch.m_RaisTimeLine_List.Count > 0 ? (watch.ElapsedMilliseconds - watch.m_RaisTimeLine_List[watch.m_RaisTimeLine_List.Count - 1].ElapsedMilliseconds) : 0);//继续换行SB.Append("\r\n");//消息队列string ActualMsg = SB.ToString();StopwatchTimeLine Line = new StopwatchTimeLine(){Elapsed = watch.Elapsed,ElapsedMilliseconds = watch.ElapsedMilliseconds,ElapsedTicks = watch.ElapsedTicks,Msg = ActualMsg,};watch.m_RaisTimeLine_List.Add(Line);switch (watch.m_StopwatchDesc.m_RaiseTime){case E_RaiseTime.RealTime: //实时{OutPutWatchMsg_RealTime(watch, ActualMsg);} break;case E_RaiseTime.StopTime: //退出{OutPutWatchMsg_StopTime(watch);} break;}}#endregion#region 私有方法#region 实时输出/// <summary>/// 实时输出/// </summary>/// <param name="watch"></param>/// <param name="Msg"></param>private static void OutPutWatchMsg_RealTime(StopwatchEx watch, string Msg){switch (watch.m_StopwatchDesc.m_RaiseType){case E_RaiseType.Console: //控制台输出{OutPutWatchMsg_RealTime_Console(Msg);} break;}}/// <summary>/// 实时输出 - 控制台/// </summary>/// <param name="Msg"></param>private static void OutPutWatchMsg_RealTime_Console(string Msg){Console.Write(Msg);}#endregion#region 关闭时输出/// <summary>/// 关闭时输出/// </summary>/// <param name="watch"></param>/// <param name="Msg"></param>private static void OutPutWatchMsg_StopTime(StopwatchEx watch){switch (watch.m_StopwatchDesc.m_RaiseType){case E_RaiseType.Console: //控制台输出{OutPutWatchMsg_StopTime_Console(watch);} break;}}/// <summary>/// 关闭时输出 - 控制台/// </summary>/// <param name="Msg"></param>private static void OutPutWatchMsg_StopTime_Console(StopwatchEx watch){if (watch.m_RaisTimeLine_List.Count <= 0){return;}foreach (var item in watch.m_RaisTimeLine_List){Console.Write(item);}}#endregion#endregion}

C# 耗时统计器(简单)相关推荐

  1. java 方法数统计_利用Java简单实现一个代码行数统计器方法实例

    前言 哈喽,我是小黑, 最近学了java的输入输出流后一直心痒痒,总想找一点事情来做,所以用java代码来实现了一下统计代码的所有行数,看一下我上大学以来到底打了多少行. 先附上实现代码吧! pack ...

  2. 16位流应用与代码统计器例题

    16位流应用: 使用PrintStream进行打印并且输出到控制台以及文本上,每次的输出要带有一个格式为:yyyy-MM-dd  HH:mm:ss 的时间. 首先写一个类继承于PrintStream, ...

  3. 英语词频统计器分词器基于Java

    需要代码请留言 综合实训报告 题 目 英语词频分析器 中国·武汉 2019年 7月 目录 需求分析文档 6 一.引言 6 1.编写目的 6 2.项目背景 6 二.任务概述 6 1.系统定义 7 2.运 ...

  4. 用c语言统计注释数量,c语言代码统计器.doc

    PAGE 2 摘 要 本课题的主要任务是开发一款代码行数统计器,专门用于统计C语言或C++语言程序代码文件.该统计器的主要功能是统计代码文件的文件行数.有效代码行数.注释行数.空白行数,以及计算代码的 ...

  5. 好用的汉字 英文 数字 符号 统计器 还可自动搜寻文本里的数字相加

    汉字英文数字符号统计器,以前有需要用的时候,找篇了整个网络都没找到,今日得闲自己写了一个,将其分享出来,希望能帮到有用得着的人. 汉字英文数字符号统计器的操作简单明了,直接把要统计的内容复制到软件的文 ...

  6. python实现微信群友统计器

    基于微信可以做很多有意思的练手项目,看了这张速查表你就会发现,可以做的事情超过你的想象. 有一次我想要统计微信群里哪些同学在北京,但发现直接问是很难得到准确结果的-- 这时候不如运用 wxpy 这个库 ...

  7. WordCounter for mac(字数统计器)

    字数统计器WordCounter mac版可以查看您的写作统计,如字数,字数,句数,行数,段数等. WordCounter版软件介绍 使用Word Counter Mac版,您可以查看您的写作统计,如 ...

  8. Guava缓存器源码分析——缓存统计器

    Guava缓存器统计器实现: 全局统计器-- 1.CacheBuilder的静态成员变量Supplier<StatsCounter> CACHE_STATS_COUNTER初始化时,重载的 ...

  9. 数字次数统计器----数字出现次数统计器

    我们有时候会想知道代码中或者文章中那些数字出现的次数排名详情,就用得到了 数字次数统计器

最新文章

  1. 利用Spring的ApplicationEvent执行自定义方法
  2. python 字符串格式符
  3. 计算机科学导论第五版_五月份将开始提供438项免费在线编程和计算机科学课程
  4. 同为程序员 为什么我的工资最低
  5. (计算机组成原理)第五章中央处理器-第三节2:CPU专用数据通路
  6. 匹配除中文和空格意外的正则写法
  7. ICML 2019 | 强化学习用于推荐系统,蚂蚁金服提出生成对抗用户模型(附论文下载链接)...
  8. 从零基础入门Tensorflow2.0 ----一、2. 实战回归模型
  9. foxmail本地文件夹同步服务器,foxmail同步QQ邮箱里的所有文件夹
  10. 交通流理论3——交通流三大参数
  11. fseek函数的用法
  12. 【NOI2018】你的名字(后缀自动机,线段树合并)
  13. 剑指offer系列——剑指 Offer 55 - I. 二叉树的深度
  14. 操作系统饥饿现象_操作系统
  15. 下列关于三种数据交换方式的叙述,错误的是( )
  16. 了解过什么是 DDD吗?一文带你掌握!(至尊典藏版)
  17. css实现日出日落效果
  18. 01.ingest pipeline的使用简介
  19. QT命令行编译时出现'mingw32-make'不是内部或外部命令,也不是可运行的程序或批处理文件
  20. 洛谷算法题单:模拟与高精度例题(下)

热门文章

  1. 抗腐蚀巷道堆垛机立体库货架 拥有WMS信息管理系统的自动化HEGERLS仓储货架
  2. java之jvm学习笔记十三(jvm基本结构)
  3. 知乎上有个热门问题,Python 未来会成为大众办公常用编程工具吗?
  4. win10自带虚拟机hyper-v安装centos7方法
  5. android dialog 消失动画,android 自定义dialog弹出和消失缩放动画
  6. Firefox 浏览器
  7. PaddleVideo使用自己的数据集训练pp-tsm
  8. Boss直聘微简历(个人实例)本人找实习工作中,欢迎联系
  9. 闭环(Closed Loop)
  10. cl.dw index.php,新生儿乙肝疫苗这样打,母婴阻断成功率100%!| CLDW 2020