用于.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环境的时间测试(转)的更多相关文章

  1. 【转】Android兼容性测试CTS --环境搭建、测试执行、结果分析

    原文网址:http://www.cnblogs.com/zh-ya-jing/p/4396918.html 为了确保Android应用能够在所有兼容Android的设备上正确运行,并且保持相似的用户体 ...

  2. 基于redis的分布式锁(不适合用于生产环境)

    基于redis的分布式锁 1 介绍 这篇博文讲介绍如何一步步构建一个基于Redis的分布式锁.会从最原始的版本开始,然后根据问题进行调整,最后完成一个较为合理的分布式锁. 本篇文章会将分布式锁的实现分 ...

  3. Android兼容性测试CTS --环境搭建、测试执行、结果分析

    为了确保Android应用能够在所有兼容Android的设备上正确运行,并且保持相似的用户体验,在每个版本发布之时,Android提供了一套兼容性测试用例集合(Compatibility Test S ...

  4. 1.MongoDB 2.7主从复制(master &ndash;> slave)环境基于时间点的恢复

    (一)MongoDB恢复概述 对于任何类型的数据库,如果要将数据库恢复到过去的任意时间点,否需要有过去某个时间点的全备+全备之后的重做日志,MongoDB也不例外.使用全备将数据库恢复到固定时刻,然后 ...

  5. 【转载】基于RedHatEnterpriseLinux V7(RHEL7)下SPEC CPU 2006环境搭建以及测试流程(之一)——介绍、安装准备、安装、config文件以及运行脚本介绍

    基于RedHatEnterpriseLinux V7(RHEL7)下SPEC CPU 2006环境搭建以及测试流程(之一)--介绍.安装准备.安装.config文件以及运行脚本介绍 其他 2018-0 ...

  6. ssh运行环境搭建及测试

    一.运行环境 1.Spring环境 Spring是一站式开发框架,在SSH中主要有以下作用,就像一个大管家: 控制反转(Inversion of Control):类不再自己进行类创建,而是交给Spr ...

  7. Tensorflow object detection API(1)---环境搭建与测试

    参考: https://blog.csdn.net/dy_guox/article/details/79081499 https://blog.csdn.net/u010103202/article/ ...

  8. Tensorflow object detection API ——环境搭建与测试

    1.开发环境搭建 ①.安装Anaconda 建议选择 Anaconda3-5.0.1 版本,已经集成大多数库,并将其作为默认python版本(3.6.3),配置好环境变量(Anaconda安装则已经配 ...

  9. php学习笔记1——使用phpStudy进行php运行环境搭建与测试。

    1. 新手第一步还是使用phpStudy搭建一下windows下的php环境,并测试.如下: http://jingyan.baidu.com/article/3c343ff7067eff0d3679 ...

随机推荐

  1. Python — 多线程与多进程

    1.多线程 线程是操作系统能够进行运算调度的最小单位.它被包含在进程之中,是进程中的实际运作单位,一个进程可以包含多个线程.一条线程指的是进程中一个单一顺序的控制流,一个进程中可以并发多个线程,每条线 ...

  2. java时间戳转换

    import java.text.SimpleDateFormat; import java.util.Calendar; import java.util.Date; public class Da ...

  3. mac上完整卸载删除:android studio方案

    如果你是mac  ,你删除as ,删不干净也正常,你会发现安装的时候,前面的东西也在.配置文件在,会导致你以前的错误不想要的东西都在. 废话不多说,复制粘贴!!~~~~~~~~ 第一步: 复制粘贴!! ...

  4. pycharm配置PyQt5,以及创建第一个项目

    认你已经安装好了pycharm,也正确安装了PyQt5 否则,请移步https://www.cnblogs.com/longbigbeard/p/9628102.html来安装PyQt5 下一步,To ...

  5. Linux centos 6.5 搭建 svn服务器

    实例:web1 1.安装subversion #yum install subversion #mkdir -p /oop/svn/ //创建svn目录 #chmod -R 777 /oop/svn ...

  6. SMB/CIFS协议简介

    1. 简介:(ServerMessage Block)服务消息块通信协议是微软(Microsoft)和英特尔(Intel)在1987年制定的协议,主要是作为Microsoft网络的通讯协议.SMB从I ...

  7. php中实现将姓名拆分为姓氏和名字

    之前有分享了用javascript在客户端进行姓名拆分的方法,后应项目需要,又用PHP实现了,贴出来 跟大家分享交流: /** * 把全名拆分为姓氏和名字 * @param string $fulln ...

  8. nyoj-1016-德莱联盟(向量叉乘判断线段相交)

    叉乘的坐标表示: A(X1,Y1), B(X2, Y2), C(XC,YC), D(XD, YD);AB = (X2-X1, Y2-Y1);CD = (XD-XC, YD-YC); 向量AB,CD的叉 ...

  9. RedHat5.8 编译内核驱动 合成initrd.img

    /******************************************************************* * RedHat5.8 编译内核驱动 合成initrd.img ...

  10. file_put_contents();

    file_put_contents(); 用于获取文件中的内容,可以填写网址,但是需要以http://开头