用于.NET 环境的时间测试

在.NET 环境中需要考虑程序运行中的线程以及无用单元收集可能在任何时候发生的事实。所以在编写时间测试
代码时需要考虑这些情况。
先来看一下如何处理无用单元收集。首先讨论一下无用单元收集的用途。C#语言用有时被称为堆的内存来给参
考类型(例如字符串、数组以及类事例对象)分配存储空间。堆是用来保存数据项(前面提到的类型)的内存区域。
诸如普通变量这样的值类型则存储在堆栈中。引用的参考数据也存储在堆栈中,但是实际的数据则是以参考类型的
形式存储在堆中。
当声明变量的子程序完全执行结束时就可以释放掉存储在堆栈中的变量。而另一方面,存储在堆中的变量则会
一直保留到调用无用单元收集进程的时候。当没有引用堆数据的行为时,只有通过无用单元收集才可以移除这些数
据。
在程序执行过程中无用单元收集可能会发生在任何时候。然而需要确保在实现时间测试代码时没有运行无用单
元收集器。但是也许大家听说过通过强制调用无用单元收集器来进行专门的无用单元收集。 .NET 环境为执行无用单
元收集调用提供了专门的对象——GC。为了使系统执行无用单元收集,可以有如下简单书写:
GC.Collect();
但是不是所有都要这样做的。存储在堆中的每一个对象都有一个称为 finalizer 的专门方法。 finalizer 方法是在删
除对象之前执行的最后一步。有关 finalizer 方法的问题是,这些方法不是按照系统方式运行的。事实上,甚至无法
确信对象的 finalizer 方法是否真的执行了,但是知道在确定删除对象之前需要执行此对象的 finalizer 方法。为了确
信这一点,我们添加了一行代码来告诉程序等待堆上对象的所有 finalizer 方法都运行后再继续。此代码行如下:
GC.WaitForPendingFinalizers( );
已经清除了一个障碍,现在就剩下一个问题了——采用正确的线程。在.NET 环境中,程序运行在被称为应用程
序域的进程中。这就允许操作系统在同一时间内分开运行每个不同的程序。在进程内,程序或程序的一部分是在线
程内运行的。操作系统通过线程来分配程序的执行时间。在用时间测试程序代码时,需要确信正在进行时间测试的
代码就在为自身程序分配的进程中,而不在操作系统执行的其他任务里。
在.NET 框架下通过使用 Process 类可以做到这一点。Process 类拥有的方法允许选取当前的进程、选取程序运行
其内的线程,以及选取存储线程开始执行时间的计时器。这些方法中的每一个都可以合并成一个调用。此调用会把
它的返回值赋值给一个变量用来存储开始时间(TimeSpan 对象)。如下列代码所示(没错,就是两行代码):
TimeSpan startingTime;
startingTime = Process.GetCurrentProcess().Threads[0].UserProcessorTime;
剩下要做的就是在进行时间测试的代码段停止时捕获时间。做法如下:
duration = Process.GetCurrentProcess().Threads[0].UserProcessorTime.Subtract(startingTime);
现在把所有这些合并成一个程序。此程序的代码和先前测试代码是一样的:

using System;
using System.Diagnostics;
class chapter1
{
static void Main()
{
int[] nums = new int[100000];
BuildArray(nums);
TimeSpan duration;
DisplayNums(nums);
DisplayNums(nums);
DisplayNums(nums);
duration = Process.GetCurrentProcess().TotalProcessorTime;
Console.WriteLine("Time: " + duration.TotalSeconds);
}
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.Write(arr[i] + " ");
}
} 


采用新改进的时间测试代码后,程序的返回值为 0.2526。把此数值与先前第一版时间测试代码返回的将近 5 秒
的数值进行比较。很明显,这两种时间测试方法之间存在显著差异。因而.NET 环境中的时间测试代码应该使用.NET
方法来做。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值