我们在开发的过程中,很多时候一个功能可能有多个实现方法,为了追求代码的性能,我们往往需要比较各实现方法的运行时间,从而选择性能最好的实现方法。那么怎样计算一段代码(或者说是函数)的运行时间呢,这个就是这篇文章我们要总结的内容。我们主要分以下几点来总结。

  1. 在C#代码中计算代码执行时间
  2. 在Sql Server中计算代码执行时间

在C#代码中计算代码执行时间

在C#程序中要计算代码段(或方法)的执行时间,我们一般都使用Stopwatch类,我比较了使用+=和使用StringBuilder分别拼接字符串的性能差异,示例代码如下。

 1 namespace ConsoleApplication5
 2 {
 3     class Program
 4     {
 5         static void Main(string[] args)
 6         {
 7             // 初始化性能计数器
 8             CodeTimer.Initialize();
 9
10             // 定义执行次数
11             int iteration = 100 * 1000; //10万次
12
13             string s = string.Empty;
14             CodeTimer.Time("String Concat", iteration, () =>
15             {
16                 s += "a";
17             });
18
19             StringBuilder sb = new StringBuilder();
20             CodeTimer.Time("StringBuilder", iteration, () =>
21             {
22                 sb.Append("a");
23             });
24
25             Console.ReadKey();
26         }
27     }
28 }

运行结果如下图。

我这里使用了封装的一个性能计时器,文章后面会附上源代码。

在Sql Server中计算代码执行时间

sql server中一般使用GetDate和DateDiff函数来计算sql语句运行的时间,示例代码如下。

 1 USE PackageFHDB;
 2 GO
 3
 4 -- 开始时间
 5 DECLARE @t1 AS DATETIME;
 6 SELECT @t1= GETDATE();
 7
 8 -- 运行的sql语句
 9 SELECT TOP 1000 * FROM dbo.Pkg_PkgOrderMaster;
10
11 -- 打印结果
12 PRINT DATEDIFF(millisecond,@t1,GETDATE());

执行结果为293毫秒,如下图。

附:性能计时器的源代码

 1 using System;
 2 using System.Collections.Generic;
 3 using System.Linq;
 4 using System.Text;
 5 using System.Diagnostics;
 6 using System.Threading;
 7 using LNFramework.Common.Extends;
 8 using System.Runtime.InteropServices;
 9
10 namespace LNFramework.Common.Tools
11 {
12     /// <summary>
13     /// 性能计时器
14     /// </summary>
15     public static class CodeTimer
16     {
17         /// <summary>
18         /// 初始化
19         /// </summary>
20         public static void Initialize()
21         {
22             // 将当前进程及线程的优先级设为最高,减少操作系统在调度上造成的干扰
23             // 然后调用一次Time方法进行预热,以便让Time方法尽快进入状态
24             Process.GetCurrentProcess().PriorityClass = ProcessPriorityClass.High;
25             Thread.CurrentThread.Priority = ThreadPriority.Highest;
26             Time("", 1, () => { });
27         }
28
29         /// <summary>
30         /// 计时
31         /// </summary>
32         /// <param name="name">名称</param>
33         /// <param name="iteration">循环次数</param>
34         /// <param name="action">方法体</param>
35         public static void Time(string name, int iteration, Action action)
36         {
37             if (name.IsNullOrEmpty()) return;
38
39             // 1.保留当前控制台前景色,并使用黄色输出名称参数
40             ConsoleColor currentForeColor = Console.ForegroundColor;
41             Console.ForegroundColor = ConsoleColor.Yellow;
42             Console.WriteLine(name);
43
44             // 2.强制GC进行收集,并记录目前各代已经收集的次数
45             GC.Collect(GC.MaxGeneration, GCCollectionMode.Forced);
46             int[] gcCounts = new int[GC.MaxGeneration + 1];
47             for (int i = 0; i <= GC.MaxGeneration; i++)
48             {
49                 gcCounts[i] = GC.CollectionCount(i);
50             }
51
52             // 3.执行代码,记录下消耗的时间及CPU时钟周期
53             Stopwatch watch = new Stopwatch();
54             watch.Start();
55             ulong cycleCount = GetCycleCount();
56             for (int i = 0; i < iteration; i++)
57             {
58                 action();
59             }
60             ulong cpuCycles = GetCycleCount() - cycleCount;
61             watch.Stop();
62
63             // 4.恢复控制台默认前景色,并打印出消耗时间及CPU时钟周期
64             Console.ForegroundColor = currentForeColor;
65             Console.WriteLine("\tTime Elapsed:\t" + watch.ElapsedMilliseconds.ToString("N0") + "ms");
66             Console.WriteLine("\tCPU Cycles:\t" + cpuCycles.ToString("N0"));
67
68             // 5.打印执行过程中各代垃圾收集回收次数
69             for (int i = 0; i <= GC.MaxGeneration; i++)
70             {
71                 int count = GC.CollectionCount(i) - gcCounts[i];
72                 Console.WriteLine("\tGen " + i + ": \t\t" + count);
73             }
74
75             Console.WriteLine();
76         }
77
78         private static ulong GetCycleCount()
79         {
80             ulong cycleCount = 0;
81             QueryThreadCycleTime(GetCurrentThread(), ref cycleCount);
82             return cycleCount;
83         }
84
85         [DllImport("kernel32.dll")]
86         [return: MarshalAs(UnmanagedType.Bool)]
87         static extern bool QueryThreadCycleTime(IntPtr threadHandle, ref ulong cycleTime);
88
89         [DllImport("kernel32.dll")]
90         static extern IntPtr GetCurrentThread();
91     }
92 }

View Code

参考文章:

一个简单的性能计数器:CodeTimer

转载于:https://www.cnblogs.com/mcgrady/p/4448096.html

如何计算代码的运行性能相关推荐

  1. python 如何计算代码块运行(执行)时间?time() time.time() time.clock() 区别

    1.引入time模块 2.调用time模块的time()函数 :用来获取当前的时间,返回的单位是秒 # 引入一个time模块, * 表示time模块的所有功能, # 作用: 可以统计程序运行的时间 f ...

  2. Webpack5优化之提高代码运行性能(Preload、Network Cache、Core-js、PWA)

    文章目录 一.Preload/Prefetch 1.1 为什么 1.2 是什么 1.2.1 共同点: 1.2.2 区别: 1.2.3 问题 1.2.4 总结 1.3 怎么样 1.3.1 安装依赖 1. ...

  3. [Unity3D]总结使用Unity 3D优化游戏运行性能的经验

    作者:Amir Fasshihi 流畅的游戏玩法来自流畅的帧率,而我们即将推出的动作平台游戏<Shadow Blade>已经将在标准iPhone和iPad设备上实现每秒60帧视为一个重要目 ...

  4. [转]总结使用Unity 3D优化游戏运行性能的经验

    转载自:http://www.gameres.com/msg_221889.html 作者:Amir Fasshihi 流畅的游戏玩法来自流畅的帧率,而我们即将推出的动作平台游戏<Shadow ...

  5. 计算质数通过分区(Partition)提高Spark的运行性能(转载+自己理解)

    这篇博客是对[1]的进一步详细描述 自己的配置是台式机一台+笔记本组成spark集群 #-------------------------------------------------------- ...

  6. python 代码_如何让Python代码加速运行?

    Python 是一种脚本语言,相比 C/C++ 这样的编译语言,在效率和性能方面存在一些不足.但是,有很多时候,Python 的效率并没有想象中的那么夸张.本文对一些 Python 代码加速运行的技巧 ...

  7. 通过分区(Partitioning)提高Spark的运行性能

    在Sortable公司,很多数据处理的工作都是使用Spark完成的.在使用Spark的过程中他们发现了一个能够提高Sparkjob性能的一个技巧,也就是修改数据的分区数,本文将举个例子并详细地介绍如何 ...

  8. 仅为代码实际运行资源付费 解构国内首个函数计算

    4月26日,在云栖大会・南京峰会上,阿里云宣布函数计算(Function Compute)启动邀测.这是国内首个事件驱动的无服务器计算平台.用户按需调用.按需付费,无需管理服务器等基础设施,特别适用于 ...

  9. 【Android Camera2】玩转图像数据 -- NV21图像旋转,镜像,转rgba代码分析,性能优化

    [Android Camera2]玩转图像数据 业务场景介绍 NV21数据旋转 逐像素遍历法 NV21数据镜像 逐像素遍历法 中心翻转法 NV21转RGB/RGBA数据 逐像素遍历法 NV21组合操作 ...

最新文章

  1. Linux的IPC机制(三):Binder
  2. 关于XML文档操作类
  3. AWK命令进行字符串替换-图解两个例子(转)
  4. linux lnmp15 部署laravel项目
  5. springboot undertow替换tomcat方式
  6. Windows一键设置JAVA环境变量
  7. Leetcode 101.对称二叉树
  8. U盘的量产一定要认定芯片及其型号
  9. WGS84转GCj02
  10. 卡方检验结果表格中出现非常多个卡方值和P值的原理和实现步骤
  11. week15-字符串
  12. C++异常处理throw
  13. ActiveMQ消息处理机制-Topic方式(二)
  14. 优酷视频APP的缓存视频在哪里
  15. android电池容量查看器,Android AccuBattery(电池损耗检测软件)V1.2.5 安卓专业版
  16. 铁甲雄兵哪个服务器人最多,超级玩家第三期——铁甲雄兵全区最高等级玩家
  17. 04 第三章 命题逻辑的推理理论
  18. mdk arm开启FPU报错问题
  19. 架构成长之路 | 图解分布式共识算法Paxos教会协议
  20. LeetCode - #79 单词搜索(Top 100)

热门文章

  1. Fastformer:简单又好用的Transformer变体!清华MSRA开源线性复杂度的Fastformer!
  2. 第四届UG2研讨会和竞赛:弥合计算成像与视觉识别之间的鸿沟
  3. ECCV 2020 论文大盘点-视频目标检测篇
  4. CVPR 2019 | 亮风台发布全球最大单目标跟踪数据集LaSOT
  5. oracle 没有索引删除一行数据_Oracle数据库之索引
  6. 初学者学习python2还是python3?
  7. 经典重温:CVPR 2010 What is an object?
  8. 3D Vision公开课精华 | 深度三维感知:数据、学习架构与应用
  9. 手把手教我班小姐姐学java之多态
  10. 专业工程师看过来~ | RDD、DataFrame和DataSet的细致区别