You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
37 lines
1.1 KiB
37 lines
1.1 KiB
using System; |
|
using System.Diagnostics; |
|
|
|
namespace Cysharp.Threading.Tasks.Internal |
|
{ |
|
internal readonly struct ValueStopwatch |
|
{ |
|
static readonly double TimestampToTicks = TimeSpan.TicksPerSecond / (double)Stopwatch.Frequency; |
|
|
|
readonly long startTimestamp; |
|
|
|
public static ValueStopwatch StartNew() => new ValueStopwatch(Stopwatch.GetTimestamp()); |
|
|
|
ValueStopwatch(long startTimestamp) |
|
{ |
|
this.startTimestamp = startTimestamp; |
|
} |
|
|
|
public TimeSpan Elapsed => TimeSpan.FromTicks(this.ElapsedTicks); |
|
|
|
public bool IsInvalid => startTimestamp == 0; |
|
|
|
public long ElapsedTicks |
|
{ |
|
get |
|
{ |
|
if (startTimestamp == 0) |
|
{ |
|
throw new InvalidOperationException("Detected invalid initialization(use 'default'), only to create from StartNew()."); |
|
} |
|
|
|
var delta = Stopwatch.GetTimestamp() - startTimestamp; |
|
return (long)(delta * TimestampToTicks); |
|
} |
|
} |
|
} |
|
} |