Re: Why is Stopwatch.ElapsedTicks negative?
I'll see if I can come up with a simple repro. For now I'll include a
snippet of the code which shows how I use the stopwatch instance.
long[] durations = new long[1024L * 1024L / bufferSize];
Stopwatch stopwatch = new Stopwatch();
Console.WriteLine("Ready to start writing. Press any key to continue.");
Console.ReadLine();
DateTime start = DateTime.Now;
Console.WriteLine("Starting.");
// Write buffers.
for (int i = 0; i < 1024 * 1024 / bufferSize; ++i)
{
stopwatch.Reset();
stopwatch.Start();
ulong offset = (ulong) i * 1024L * 1024L;
IntPtr dataView = Win32.File.MapViewOfFile(dataMap,
Win32.File.FILE_MAP_WRITE,
(uint) (offset >> 32), (uint) (offset & uint.MaxValue), (uint) bufferSize
* 1024);
if (dataView == IntPtr.Zero)
{
result = Marshal.GetLastWin32Error();
throw(new Win32Exception(result, string.Format(
"Failed mapping view ({0}, {1}) of file '{2}', result = {3}",
offset, bufferSize * 1024, args[0], result)));
}
try
{
Marshal.Copy(buffer, 0, dataView, buffer.Length);
}
finally
{
if (flushview == true)
{
Win32.File.FlushViewOfFile(dataView, (uint) bufferSize * 1024);
}
Win32.File.UnmapViewOfFile(dataView);
}
stopwatch.Stop();
durations[i] = stopwatch.ElapsedTicks;
if (stopwatch.ElapsedTicks < 0)
{
Console.WriteLine("ElapsedTicks < 0, i = {0}, elapsed ticks = {1}, " +
"elapsed milliseconds = {2}, IsHighResolution = {3}, frequency = {4}",
i, stopwatch.ElapsedTicks, stopwatch.ElapsedMilliseconds,
Stopwatch.IsHighResolution, Stopwatch.Frequency);
}
}
DateTime end = DateTime.Now;
Console.WriteLine("Finished.");
long min = long.MaxValue;
long max = long.MinValue;
long average = 0;
for (int i = 0; i < durations.Length; ++i)
{
average += durations[i];
if (durations[i] > max)
max = durations[i];
if (durations[i] < min)
{
min = durations[i];
if (min < 0)
Console.WriteLine("Min has gone below zero, duration: {0}", durations[i]);
}
}
Console.WriteLine("duration: {0}", end - start);
Console.WriteLine("min: {0}", min * 1000000 / Stopwatch.Frequency);
Console.WriteLine("max: {0}", max * 1000000 / Stopwatch.Frequency);
Console.WriteLine("average: {0}", (average / durations.Length) * 1000000 /
Stopwatch.Frequency);
--
Thanks,
Nick
nicknospamdu@community.nospam
remove "nospam" change community. to msn.com
"Peter Duniho" wrote:
On Thu, 17 Sep 2009 08:26:13 -0700, nickdu <nicknospamdu@community.nospam>
wrote:
[...] Why would any of the elapsed times I'm measuring come out negative?
[...]
I'm pretty sure should fit in a long without going negative. Can someone
shed some light on this?
Stopwatch absolutely should be able to measure a minute's worth of time
without problem.
As Patrice implies, without a concise-but-complete code example it's
nearly impossible to comment on what might be happening. My best guess is
that somewhere along the line you're converting something to a 32-bit
int. But without seeing the code, we can't say one way or the other.
Pete