用于.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 ...
随机推荐
- C#中的线程(四)高级话题
C#中的线程(四)高级话题 Keywords:C# 线程Source:http://www.albahari.com/threading/Author: Joe AlbahariTranslato ...
- 14 Python 装饰器
装饰器 装饰器其实就是一个以函数作为参数并返回一个替换函数的可执行函数.让我们从简单的开始,直到能写出实用的装饰器. def outer(some_func): def inner(): print ...
- 剑指offer--5.变态跳台阶
WA了一次,错误数据4,输出8,怎么真么熟悉呢?改个return过了,OMG ------------------------------------------------------------- ...
- loj #6216. 雪花挂饰
(今天碰到的题怎么这么小清新 $n$ 个不相同的点,$q$ 组询问,每次给定 $l,r$,问在 $n$ 个点中,选出 $x$ 个点 $(x \in [l,r])$,用边连起来,能构成多少种不同的树 $ ...
- UVA - 11324 The Largest Clique (强连通缩点+dp)
题目链接 题意:从有向图G中找到一个最大的点集,使得该点集中任意两个结点u,v满足u可达v或v可达u. 解法:先把同处于一个强连通分量中的结点合并(缩点),得到一张DAG图,在DAG上dp即可. 感觉 ...
- 3143 codevs 二叉树的序遍历
题目描述 Description 求一棵二叉树的前序遍历,中序遍历和后序遍历 输入描述 Input Description 第一行一个整数n,表示这棵树的节点个数. 接下来n行每行2个整数L和R.第i ...
- 橱窗布置(Flower)(动规)
橱窗布置(Flower) [问题描述] 假设以最美观的方式布置花店的橱窗,有F束花,每束花的品种都不一样,同时,至少有同样数量的花瓶,被按顺序摆成一行,花瓶的位置是固定的,并从左到右, ...
- 玩转C链表
链表是C语言编程中常用的数据结构,比如我们要建一个整数链表,一般可能这么定义: 1 2 3 4 struct int_node { int val; struct in ...
- Apache Htpasswd生成和验证密码
Assuming you create the password using the following command and "myPassword" as the passw ...
- VerilogHDL编译预处理
编译预处理语句 编译预处理是VerilogHDL编译系统的一个组成部分,指编译系统会对一些特殊命令进行预处理,然后将预处理结果和源程序一起在进行通常的编译处理.以”`” (反引号)开始的某些标识符是编 ...