Raj*_*war 5 c# visual-studio-2008 c#-3.0
我是C#世界的新手.我试图计算算法所用的时间以进行比较.下面的代码测量从子程序被调用到子程序返回主程序所经过的时间.这个例子取自Michael McMillan的"C#的数据结构".运行此程序后,输出为Time = 0,这是不正确的.该程序似乎在逻辑上是正确的.有谁能够帮我.以下是代码
using System;
using System.Diagnostics;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace Chap1
{
class chap1
{
static void Main()
{
int[] nums = new int[100000];
BuildArray(nums);
Timing tObj = new Timing();
tObj.startTime();
DisplayNums(nums);
tObj.stopTime();
Console.WriteLine("Time: " + tObj.result().TotalSeconds);
Console.WriteLine("Start Time: " + tObj.startTime().TotalSeconds);
Console.WriteLine("Duration : " + tObj.result().TotalSeconds);
Console.ReadKey();
}
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]);
}
}
class Timing
{
TimeSpan StartTiming;
TimeSpan duration;
public Timing()
{
StartTiming = new TimeSpan(0);
duration = new TimeSpan(0);
}
public TimeSpan startTime()
{
GC.Collect();
GC.WaitForPendingFinalizers();
StartTiming = Process.GetCurrentProcess().Threads[0].UserProcessorTime;
return StartTiming;
}
public void stopTime()
{
duration = Process.GetCurrentProcess().Threads[0].UserProcessorTime.Subtract(StartTiming);
}
public TimeSpan result()
{
return duration;
}
}
}
Run Code Online (Sandbox Code Playgroud)
Stopwatch 类就是为此而设计的。
UserProcessorTime 不具备在 for 循环中测量计数到 100000 所需的分辨率。您的 WriteLine 调用不会包含在用户时间中,因为它们是 I/O 时间。您的代码可能不在线程 0 上运行。除上下文切换外,用户时间不会更新。当您打印 startTime 时,您正在更改存储的值。可能还有其他一些我没有想到的事情可能会出错。
我强烈建议您使用 Stopwatch 类,它利用 CPU 的性能计数器。
| 归档时间: |
|
| 查看次数: |
2185 次 |
| 最近记录: |