usingSystem;usingSystem.Diagnostics;usingSystem.Threading;namespaceConsoleApp27{classProgram{staticvoidMain(string[] args){//Stopwatch sw = new Stopwatch();//sw.Start();//Thread.Sleep(999);//sw.Stop();//Console.WriteLine($"程序耗时:{sw.ElapsedMilliseconds}ms.");//var start = DateTime.Now;//Thread.Sleep(999);//var stop = DateTime.Now;//Console.WriteLine($"程序耗时:{(stop - start).TotalMilliseconds}ms.");var watch = ValueStopwatch.StartNew();
Thread.Sleep(999);
Console.WriteLine($"程序耗时:{watch.GetElapsedTime().TotalMilliseconds}ms.");
Console.ReadKey();}}internalstructValueStopwatch{privatestaticreadonlydouble TimestampToTicks = TimeSpan.TicksPerSecond /(double)Stopwatch.Frequency;privatereadonlylong _startTimestamp;publicbool IsActive => _startTimestamp !=0;privateValueStopwatch(long startTimestamp){
_startTimestamp = startTimestamp;}publicstaticValueStopwatchStartNew()=>newValueStopwatch(Stopwatch.GetTimestamp());publicTimeSpanGetElapsedTime(){// Start timestamp can't be zero in an initialized ValueStopwatch. It would have to be literally the first thing executed when the machine boots to be 0.// So it being 0 is a clear indication of default(ValueStopwatch)if(!IsActive){thrownewInvalidOperationException("An uninitialized, or 'default', ValueStopwatch cannot be used to get elapsed time.");}var end = Stopwatch.GetTimestamp();var timestampDelta = end - _startTimestamp;var ticks =(long)(TimestampToTicks * timestampDelta);returnnewTimeSpan(ticks);}}}