用于.NET环境的时间测试(转)
用于.NET环境的时间测试
在.NET环境中,衡量运行完整算法所花费的时间长度,需要考虑很多 需要考虑很多种情况 ,如:程序运行所处的线程以及无用单位收集(GC垃圾回收)。
在程序执行过程中无用单元收集可能发生在任何时候,所以在执行时间测试之前我们需要强制调用无用单元收集器来进行专门的无用单元收集——GC.Collect().
现在没有被引用的堆数据已经被我们强行收集了,但GC什么时候收集完毕的,我们仍然需要知道,因为我们要在GC垃圾回收完毕后执行我们的时间测试,怎么解决呢?存储在堆中的每一个对象都有一个称为finalizer的专门方法。 这个方法是在删除对象之前执行的最后一步。
事实上,我们却无法确定对象的finalizer方法是否真的执行了,但是知道在确定删除对象之前需要执行此对象的finalizer方法。所以为了确信这一点,我们需要用GC.WaitForPendingFinalizers()方法来告诉程序等待堆上对象的所有finalizer方法都运行后在继续。
现在剩下最后一个问题了——采用正确的线程。 在.NET环境中程序运行在被成为“应用程序域”的进程中。这就允许操作系统在同一时间内分开运行每个不同的程序,在进程内程序或程序的一部分是在线程内运行的。操作系统通过线程来分配程序的执行时间。在对程序代码进行时间测试时需要确保正在进行时间测试的代码只在为自身程序分配的程序中,而不在操作系统执行的其他任务里。——.NET框架下通过Process类可以做到这一点。Process类拥有的方法允许选取当前的进程(程序运行其内的进程)、选取程序运行其内的线程、以及选取存储线程开始执行时间的计时器。这些方法中的每一个都可以合并成一个调用,此调用会把它的返回值赋值给一个变量用来存储开始时间(TimeSpan对象)。
——> TimeSpan startingTime;
startingTime = Process.GetCurrentProcess().Threads[0].UserProcessorTime;
剩下要做的就是在进行时间测试的代码停止时捕获时间:
——>duration= Process.GetCurrentProcess().Threads[0].UserProcessorTime.Subtract(startingTime);
ok,事到如此 ,可以大功告成了,贴出完整代码:
Timing类:
public class Timing
{
TimeSpan duration;
public Timing()
{
duration = new TimeSpan(0);
} public void stopTime()
{
duration = Process.GetCurrentProcess().TotalProcessorTime;//获取此进程的总的处理器时间
} public void startTime()
{
GC.Collect();//强制对所有代码即时进行垃圾回收
GC.WaitForPendingFinalizers();//挂起当前线程,直到处理终接器队列的线程清空该队列为止
}
public TimeSpan Result()
{
return duration;
}
}
程序入口:
static void Main(string[] args)
{
int[] nums = new int[100000];
BuildArray(nums);
Timing tobj = new Timing();
tobj.startTime();
DisplayNums(nums);
tobj.stopTime();
Console.WriteLine("time (.NET):"+tobj.Result().TotalSeconds);
Console.Read();
}
static void BuildArray(int[] arr)
{
for (int i = 0; i <= 99999; i++)
{
arr[i] = i;
}
}
static void DisplayNums(int[] arr)
{
for (int i = 0; i <= arr.GetUpperBound(0); i++)
{
Console.WriteLine(arr[i]+" ");
}
}
程序运行效果:(机子配置不同,运行效果不同)

用于.NET环境的时间测试(转)的更多相关文章
- 【转】Android兼容性测试CTS --环境搭建、测试执行、结果分析
原文网址:http://www.cnblogs.com/zh-ya-jing/p/4396918.html 为了确保Android应用能够在所有兼容Android的设备上正确运行,并且保持相似的用户体 ...
- 基于redis的分布式锁(不适合用于生产环境)
基于redis的分布式锁 1 介绍 这篇博文讲介绍如何一步步构建一个基于Redis的分布式锁.会从最原始的版本开始,然后根据问题进行调整,最后完成一个较为合理的分布式锁. 本篇文章会将分布式锁的实现分 ...
- Android兼容性测试CTS --环境搭建、测试执行、结果分析
为了确保Android应用能够在所有兼容Android的设备上正确运行,并且保持相似的用户体验,在每个版本发布之时,Android提供了一套兼容性测试用例集合(Compatibility Test S ...
- 1.MongoDB 2.7主从复制(master –> slave)环境基于时间点的恢复
(一)MongoDB恢复概述 对于任何类型的数据库,如果要将数据库恢复到过去的任意时间点,否需要有过去某个时间点的全备+全备之后的重做日志,MongoDB也不例外.使用全备将数据库恢复到固定时刻,然后 ...
- 【转载】基于RedHatEnterpriseLinux V7(RHEL7)下SPEC CPU 2006环境搭建以及测试流程(之一)——介绍、安装准备、安装、config文件以及运行脚本介绍
基于RedHatEnterpriseLinux V7(RHEL7)下SPEC CPU 2006环境搭建以及测试流程(之一)--介绍.安装准备.安装.config文件以及运行脚本介绍 其他 2018-0 ...
- ssh运行环境搭建及测试
一.运行环境 1.Spring环境 Spring是一站式开发框架,在SSH中主要有以下作用,就像一个大管家: 控制反转(Inversion of Control):类不再自己进行类创建,而是交给Spr ...
- Tensorflow object detection API(1)---环境搭建与测试
参考: https://blog.csdn.net/dy_guox/article/details/79081499 https://blog.csdn.net/u010103202/article/ ...
- Tensorflow object detection API ——环境搭建与测试
1.开发环境搭建 ①.安装Anaconda 建议选择 Anaconda3-5.0.1 版本,已经集成大多数库,并将其作为默认python版本(3.6.3),配置好环境变量(Anaconda安装则已经配 ...
- php学习笔记1——使用phpStudy进行php运行环境搭建与测试。
1. 新手第一步还是使用phpStudy搭建一下windows下的php环境,并测试.如下: http://jingyan.baidu.com/article/3c343ff7067eff0d3679 ...
随机推荐
- 【ORM】关于Dapper的一些常见用法
引言 Dapper是.Net平台下一款小巧玲珑的开源Orm框架,简单实用的同时保持高性能,非常适合我这种喜欢手写SQL的人使用,下面介绍一下如何使用Dapper. 相关资料 Dapper的GitHub ...
- MySQL主从复制的常用拓扑结构
1.复制的常用拓扑结构 复制的体系结构有以下一些基本原则: (1) 每个slave只能有一个master: (2) 每个slave只能有一个唯一的服务器ID: (3) 每个maste ...
- linux命令学习笔记(30): chown命令
chown将指定文件的拥有者改为指定的用户或组,用户可以是用户名或者用户ID:组可以是组名或者组ID: 文件是以空格分开的要改变权限的文件列表,支持通配符.系统管理员经常使用chown命令,在将文件拷 ...
- UVA - 1603 Square Destroyer (DLX可重复覆盖+IDA*)
题目链接 给你一个n*n的由火柴组成的正方形网格,从中预先拿掉一些火柴,问至少还需要拿掉多少火柴才能破坏掉所有的正方形. 看到这道题,我第一反应就是——把每根火柴和它能破坏掉的正方形连边,不就是个裸的 ...
- 关于yii的日志路由组件的配置问题
最近突然意识到日志是很好滴debug工具,所以研究了一下yii的日志配置,想想应该还会有像我这样的小白不懂这些问题的,就分享一下了.有错误烦请大神们指出config/main.php 中配置,这个想必 ...
- 学习动态性能表(20)--v$waitstat
学习动态性能表 第20篇--V$WAITSTAT 2007.6.15 本视图保持自实例启动所有的等待事件统计信息.常用于当你发现系统存在大量的"buffer busy waits" ...
- Xml日志记录文件最优方案(附源代码)
Xml作为数据存储的一种方式,当数据非常大的时候,我们将碰到很多Xml处理的问题.通常,我们对Xml文件进行编辑的最直接的方式是将xml文件加载到XmlDocument,在内存中来对XmlDocume ...
- bzoj 5092 [Lydsy1711月赛]分割序列——高维前缀和
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=5092 套路地弄一个前缀异或和,就变成 f[ i ]=max_{j=0}^{i} { s[ j ...
- 第一章计算机网络和因特网-day01
什么是因特网: 其一:构成因特网的基本硬件与软件. 其二:为分布式应用提供服务的联网基础设施. 终端机器称为主机( host ) 或者端系统( end system ) 端系统通过通信链路(commu ...
- 一根Express Route同时支持ARM和ASM的VNET
ARM模式的Azure管理模式在China Azure上已经正式落地了.今后在China Azure上应该主要以ARM的模式创建VM了. 并且目前Express Route也已经可以在ARM模式下创建 ...