如何使用DateTime.Now计算方法调用的速度?

时间:2015-04-28 09:10:03

标签: c# .net winforms

我将给出方法代码的顶部,因为整个代码很长,在这种情况下不需要。

static int tickCountLength = 1000;
        int[] tickCounts = new int[tickCountLength];
        int numberOfTicks = 0;
        TimeSpan dtn;

        void DoCaptureRenderTarget(Device device, string hook)
        {
            //Environment.TickCount-->array

            tickCounts[numberOfTicks] = Environment.TickCount;
            numberOfTicks++;

            DateTime start1 = DateTime.Now;
            DateTime end1 = DateTime.Now;
            this.DebugMessage("Capture Time Testing " + (end1 - start1).ToString());
            dtn = end1 - start1;
            if (dtn.Seconds > 0)
            {
                string fffff = "fgf";
            }
            if (numberOfTicks >= tickCountLength)
            {

                StreamWriter w = new StreamWriter(@"c:\Milliseconds\TickCount.txt", true);
                foreach (int tick in tickCounts)
                {
                    w.WriteLine("TickCount === > " + tick.ToString());

                }
                w.Close();
                numberOfTicks = 0;
            }

每隔1ms或20ms调用该方法不确定实时。 所以我添加了这个部分试图计算:

DateTime start1 = DateTime.Now;
            DateTime end1 = DateTime.Now;
            this.DebugMessage("Capture Time Testing " + (end1 - start1).ToString());
            dtn = end1 - start1;
            if (dtn.Seconds > 0)
            {
                string fffff = "fgf";
            }

但是这肯定是错误的,因为end1和start1之间的时间是00:00:00:00 我怎样才能用毫秒计算每次方法的时间?

也许:每次使用DateTime.Now.Millisecond并手动减去前一个(通过查看)?不知道怎么做。

5 个答案:

答案 0 :(得分:3)

使用StopWatch

示例:

Stopwatch stopWatch = new Stopwatch();
stopWatch.Start();
Thread.Sleep(10000);// or whatever code you want to calculate elapsed time.
stopWatch.Stop();
// Get the elapsed time as a TimeSpan value.
TimeSpan ts = stopWatch.Elapsed;

// Format and display the TimeSpan value. 
string elapsedTime = String.Format("{0:00}:{1:00}:{2:00}.{3:00}",
    ts.Hours, ts.Minutes, ts.Seconds,
    ts.Milliseconds / 10);
Console.WriteLine("RunTime " + elapsedTime);

答案 1 :(得分:2)

Stopwatch就是您所需要的。这是一个简单的例子:

Stopwatch sw= new Stopwatch();
sw.Start();
// your methods to be measured
sw.Stop();
TimeSpan ts = stopWatch.Elapsed;

//Format 
string elapsedTime = String.Format("{0:00}:{1:00}:{2:00}.{3:00}",
    ts.Hours, ts.Minutes, ts.Seconds,
    ts.Milliseconds / 10);
Console.WriteLine("RunTime " + elapsedTime);

请注意,虽然秒表可能存在多线程异步应用程序的问题,因为它只能测量一个核心的速度。此问题可能会导致某些不同步,并给您一些不正确的时间。取决于您的应用程序,使用DateTime.UtcNow可能会更好,但它不如单个线程上的Stopwatch精确。 (据我所知)

进一步阅读:

Exact time measurement

Multithreaded stopwatch?

Elapsed ticks msdn

Measuring with stopwatch

答案 2 :(得分:2)

问题是你没有电话,也没有

之间的逻辑
DateTime start1 = DateTime.Now;

DateTime end1 = DateTime.Now;

因此,经历的时间非常小,难以察觉也就不足为奇了。把

DateTime start1 = DateTime.Now;
在逻辑之前

static int tickCountLength = 1000;
    int[] tickCounts = new int[tickCountLength];
    int numberOfTicks = 0;
    TimeSpan dtn;

    void DoCaptureRenderTarget(Device device, string hook)
    {
        //Environment.TickCount-->array
        DateTime start1 = DateTime.Now;
        tickCounts[numberOfTicks] = Environment.TickCount;
        numberOfTicks++;

        DateTime end1 = DateTime.Now;
        this.DebugMessage("Capture Time Testing " + (end1 - start1).ToString());
        dtn = end1 - start1;
        if (dtn.TotalMilliseconds > 0)
        {
            string fffff = "fgf";
        }
        if (numberOfTicks >= tickCountLength)
        {

            StreamWriter w = new StreamWriter(@"c:\Milliseconds\TickCount.txt", true);
            foreach (int tick in tickCounts)
            {
                w.WriteLine("TickCount === > " + tick.ToString());

            }
            w.Close();
            numberOfTicks = 0;
        }

我不确切地知道你想要及时测量你方法中的逻辑。

答案 3 :(得分:1)

您可以像这样使用stopwatch

var watch = Stopwatch.StartNew();
// your code for which you want to measure time comes here
watch.Stop();
var elapsedMillisecond = watch.ElapsedMilliseconds;

您还可以使用Environment.TickCount Property

这是John Chapman's blog post关于DateTime给出的一个很好的读数。如果你想知道为什么不建议使用DateTime.Now以及为什么这么精确,那就是精确的。

另请阅读这篇有趣的文章:The Darkness Behind DateTime.Now

答案 4 :(得分:1)

好的,首先,您最好使用Environment.TickCount而不是DateTime.Now,尤其是在测量间隔时。

其次,在调用DateTime.Now(或Environment.TickCount时),当您调用DateTime get方法时,实际上会得到Now对象。因此,如果您将这些方法一个接一个地放置,您将获得的结果是相同的。

我真的不明白你要测量的是什么,但在C#中测量时间的正确方法可能是

int start = Environment.TickCount;
FunctionToMeasure();
int end = Environment.TickCount;
int diffMS = end - start; //This is the measured time of the function.

如果您要测量实际DateTime.Now函数所需的时间,则为0ms

希望我帮助过了:)!