Подтвердить что ты не робот

Вычисление времени в миллисекундах С#

Мне нужно время выполнения кода, написанного на С#. Использование DateTime.Now Я получаю неправильные значения для поля миллисекунды.  Например:

 int start_time, elapsed_time;

 start_time = DateTime.Now.Millisecond;

 for(int i = 0; i < N_ITER; i++) {
       // cpu intensive sequence
 }

 elapsed_time = DateTime.Now.Millisecond - start_time;

elapsed_time дает отрицательные значения.

Как я могу заменить DateTime, чтобы получить фактическое значение прошедшего времени?

4b9b3361

Ответ 1

using System.Diagnostics;

//...

var stopwatch = new Stopwatch();
stopwatch.Start();
for (int i = 0; i < N_ITER; i++) {
    // cpu intensive sequence
}
stopwatch.Stop();
elapsed_time = stopwatch.ElapsedMilliseconds;

Ответ 2

Ответ РЕДАКТИРОВАТЬ на основе комментариев

Этот ответ только пытается подсчитать общее количество прошедших миллисекунд между двумя моментами, где время получено непосредственно из DateTime.Now. Что касается разговора, он понял, что DateTime.Now уязвим для внешних воздействий. Следовательно, лучшим решением будет использование класса Stopwatch. Здесь ссылка, которая лучше объясняет (IMO) и обсуждает производительность между DateTimeNow, DateTime.Ticks, StopWatch.

Оригинальный ответ

Вопрос в том, как вы преобразуете его в int. Вам нужно лучшее литье и дополнительные элементы :) Это может выглядеть просто по сравнению с эффективным таймером. Но это работает:

DateTime startTime, endTime;
startTime = DateTime.Now;

//do your work

endTime = DateTime.Now;
Double elapsedMillisecs = ((TimeSpan)(endTime - startTime)).TotalMilliseconds;

В Интернете есть ссылка, которую вы также можете проверить.

Ответ 3

Вы ищете класс Stopwatch. Он специально предназначен для возврата высокоточных измерений времени.

var stopwatch = new Stopwatch();

stopwatch.Start();
for (int i = 0; i < N_ITER; i++)
{
     // cpu intensive sequence
}
stopwatch.Stop();

var elapsed = stopwatch.ElapsedMilliseconds;

Ответ 4

DateTime.Millisecond возвращает миллисекундную долю секунды, начиная с 0-999. При выполнении таймингов вам нужно будет учитывать остальную часть времени.

Однако вы должны изучить класс StopWatch для таких временных интервалов производительности.

Ответ 5

Вот что я использовал для получения времени для простого вычисления:

class Program
{
    static void Main(string[] args)
    {
        Decimal p = 0.00001m;
        Decimal i = 0m;
        DateTime start = new DateTime();
        DateTime stop = new DateTime();

        for (i = p; i <= 5; i = i + p)
        {
            Console.WriteLine("result is: " + i);
            if (i==p) start = DateTime.Now;
            if (i==5) stop = DateTime.Now;
        }

        Console.WriteLine("Time to compute: " + (stop-start));

    }
}

Ответ 6

Это работает для меня:

var lapsedTime = DateTime.Now.Subtract(beginTime).TotalMilliseconds;