完成流程所需的时间

时间:2010-04-05 03:33:07

标签: 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;
        }
    }
}

2 个答案:

答案 0 :(得分:4)

Stopwatch class专为此而设计。

UserProcessorTime没有开始具有在for循环中测量计数到100000所需的分辨率。您的WriteLine调用将不会包含在用户时间中,因为它们是I / O时间。您的代码可能没有在线程0上运行。除了上下文切换之外,用户时间不会更新。当您打印startTime时,您正在更改存储的值。可能还有其他一些我可能没想过的事情。

我强烈建议你使用秒表类,它利用了CPU的性能计数器。

答案 1 :(得分:2)

您不在主函数的任何位置使用Timing类,也看不到打印时间的位置。这是您正在运行的 EXACT 代码吗?

每个新代码更新:

不要在调试模式下运行它...构建您的发布版本,然后手动运行可执行文件:http://social.msdn.microsoft.com/forums/en-US/vbgeneral/thread/3f10a46a-ba03-4f5a-9d1f-272a348d660c/

我测试了你的代码,它在运行发行版时运行良好,但是当我在调试器中运行它时它运行不正常。