IT TIP

스톱워치 틱을 나노초, 밀리 초 및 초로 어떻게 변환합니까?

itqueen 2020. 12. 2. 22:22
반응형

스톱워치 틱을 나노초, 밀리 초 및 초로 어떻게 변환합니까?


이것은 매우 기본적인 질문입니다 ... 상당히 당황 스럽지만 여기에 있습니다.

C # 코드에 스톱워치 블록이 있습니다. 경과 시간을 틱 단위로 결정한 다음 ns, ms, s로 변환하고 싶습니다. Frequency는 Stopwatch 클래스에서 제공하며 변환에 필요하다는 것을 알고 있습니다.

감사


Stopwatch.Elapsed는이다 타임 스팬 , 당신이 할 수 있도록 myStopwatch.Elapsed.TotalMilliseconds, myStopwatch.Elapsed.TotalSeconds

// Create new stopwatch
Stopwatch stopwatch = new Stopwatch();

// Begin timing
stopwatch.Start();

// Do something
for (int i = 0; i < 1000; i++)
{
    Thread.Sleep(1);
}

// Stop timing
stopwatch.Stop();

// Write result
Console.WriteLine("Time elapsed (s): {0}", stopwatch.Elapsed.TotalSeconds);
Console.WriteLine("Time elapsed (ms): {0}", stopwatch.Elapsed.TotalMilliseconds);
Console.WriteLine("Time elapsed (ns): {0}", stopwatch.Elapsed.TotalMilliseconds * 1000000);

산출:

Time elapsed (s): 2.4976622
Time elapsed (ms): 2497.6622
Time elapsed (ns): 2497662200

참고 것을 stopwatch.ElapsedMilliseconds리턴 long하고, 따라서 밀리 초 만 정확한까지이며, 반면 stopwatch.Elapsed.TotalMilliseconds리턴한다 double같은 정밀도가 등을 stopwatch.ElapsedTicks가 사용하기 쉽게 제외. ILSpy는 TimeSpan.TotalMilliseconds어쨌든 틱을 사용하여 계산 된 것을 보여줍니다 .


MSDN 에 따르면 Frequency는 초당 틱 수를 알려줍니다. 따라서:

Stopwatch sw = new Stopwatch();
// ...
double ticks = sw.ElapsedTicks;
double seconds = ticks / Stopwatch.Frequency;
double milliseconds = (ticks / Stopwatch.Frequency) * 1000;
double nanoseconds = (ticks / Stopwatch.Frequency) * 1000000000;

Stopwatch.Frequency 는 초당 틱 수를 제공합니다.

따라서 틱이있는 경우 빈도로 나누면 초를 얻을 수 있습니다.

long ticks = sw.ElapsedTicks;
double ns = 1000000000.0 * (double)ticks / Stopwatch.Frequency;
double ms = ns / 1000000.0;
double s = ms / 1000;

예를 들어 다음을 수행 할 수 있습니다.

static void Main()
{
    Stopwatch sw = new Stopwatch();
    sw.Start();
    System.Threading.Thread.Sleep(3456);
    sw.Stop();

    long ticks = sw.ElapsedTicks;
    double ns = 1000000000.0 * (double)ticks / Stopwatch.Frequency;
    double ms = ns / 1000000.0;
    double s = ms / 1000;

    Console.WriteLine("{0}, {1}, {2}", ns, ms, s);
    Console.ReadKey();
}

내 시스템에서 다음을 인쇄합니다.

3455650175.58075, 3455.65017558075, 3.45565017558075

이 클래스 사용 :

public static class Utility
{
    public static long ElapsedNanoSeconds(this Stopwatch watch)
    {
         return watch.ElapsedTicks * 1000000000 / Stopwatch.Frequency;
    }
    public static long ElapsedMicroSeconds(this Stopwatch watch)
    {
        return watch.ElapsedTicks * 1000000 / Stopwatch.Frequency;
    }
}

그러면 다음과 같이 경과 된 나노초 / 마이크로 초를 얻을 수 있습니다.

var stopwatch = Stopwatch.StartNew();
//... measured code part
Console.WriteLine(stopwatch.ElapsedNanoSeconds());
// OR
Console.WriteLine(stopwatch.ElapsedMicroSeconds());

밀리 초 동안 Stopwatch의 ElapsedMilliseconds () 메서드를 사용할 수 있습니다.


로부터 MSDN의 문서 :

사용 주파수IsHighResolution는 스톱워치 타이밍 구현의 정밀도와 해상도를 결정하는 필드.

long frequency = Stopwatch.Frequency;
Console.WriteLine("  Timer frequency in ticks per second = {0}",
    frequency);
long nanosecPerTick = (1000L*1000L*1000L) / frequency;
Console.WriteLine("  Timer is accurate within {0} nanoseconds", 
    nanosecPerTick);

Elapsed속성 사용 :

stopwatch.Elapsed.TotalMilliseconds

참고URL : https://stackoverflow.com/questions/2329079/how-do-you-convert-stopwatch-ticks-to-nanoseconds-milliseconds-and-seconds

반응형