用于.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. Deep Learning(Ian Goodfellow) — Chapter1 Introduction

    Deep Learning是大神Ian GoodFellow, Yoshua Bengio 和 Aaron Courville合著的深度学习的武功秘籍,涵盖深度学习各个领域,从基础到前沿研究.因为封面 ...

  2. OUTlook无法预览xls文件

    outlook可以正常预览doc,pdf,jpg格式的附件,但是xls和xlsx格式就是不能预览.找了好多网络上的办法,都是不行,最终还是找一个靠谱的办法,记录一下 这个方法非常有用:如题, 本人安装 ...

  3. 安装requests 库

    这是我见过最恶心的安装了,嘛的,以为公司网络限制.我无法上网 使用 PIP INSTALL REQUESTS .本来就一句话的时 我一直安装不成功.https://www.lfd.uci.edu/~g ...

  4. 计算机_软件技巧_01_优雅地再word中插入代码

    二.参考资料 1.如何优雅的在 Microsoft word中插入代码

  5. 剑指offer--3.用两个栈实现队列

    快速刷一遍,先捏软柿子 ----------------------------------------------------------------- 时间限制:1秒 空间限制:32768K 热度 ...

  6. New Concept English there (60)

    33w/m 43 Punctuality is a necessary habit in all public affairs in civilized society. Without it, no ...

  7. uva1636 - Headshot(条件概率)

    简单的条件概率题,直接再来一枪没子弹的概率是所有子串”00“的数目除以‘0’的数目,随机转一下再打没子弹的概率是‘0’的数目除以总数目. #include<iostream> #inclu ...

  8. UVA - 10570 Meeting with Aliens (置换的循环节)

    给出一个长度不超过500的环状排列,每次操作可以交换任意两个数,求把这个排列变成有序的环状排列所需的最小操作次数. 首先把环状排列的起点固定使其成为链状排列a,枚举排好序时的状态b(一种有2n种可能) ...

  9. django的get_or_create

    转:http://www.nanerbang.com/article/51/ get_or_create会根据条件从数据库里面查找符合条件的记录,如果没有符合条件的记录,则新创建一条记录

  10. 如何重启mysql服务

    window下: 在cmd中,键入services.msc,找到mysql,右键重启mysql