What should be returned by the reltime() call? If Vim script only handles "int" types, the values returned are apparently inconsisent. Am I missing something, or is reltime() on windows currently useful only for short delta times?
I'm considering making a patch that will roll the amount of the "low part" into the "high" part, but of course that might invalidate the "high" part. An alternative would be to return a list of 4 "int"s. P.S. Internally, QuadPart is used so I guess that must be correct. On 6/11/06, George V. Reilly <[EMAIL PROTECTED]> wrote:
(Moving the non-developer list to BCC.) Eric Arnold wrote: > I'm trying to understand what I'm seeing with the msec timing on win32 > (cygwin). Inside the debugger, I'm seeing: > > (gdb) p tm_delta > $1 = {u = {LowPart = 2434313347, HighPart = 896}, {LowPart = 2434313347, > HighPart = 896}, QuadPart = 3850725010563} > (gdb) n > 180 n1 = tm_delta.HighPart; > (gdb) > 181 n2 = tm_delta.LowPart; > (gdb) p n1 > $4 = 895 > (gdb) p n2 > $2 = -1860653949 > > And in Vim: > > :echo reltime() > [895, -162159878] > > > So is this a bug? Internally, the low part of the proftime_T > structure is positive, and it shows up externally as negative. I > checked, and as far as I can tell, the LowPart is a win32 > LARGE_INTEGER, which is 8 bytes, which is trying to be stuffed into a > "long" which is 4 bytes. I think the right answer is a "double", but > I'm not real sure about how win32 stuff works (since WhyTF has it > defined a special LARGE_INTEGER type?). If you go look at the definition of LARGE_INTEGER in the Windows headers, you'll see that it's a union of a 64-bit integer (QuadPart) and two 32-bit integers (HighPart, LowPart). It has to be a LARGE_INTEGER because the profiler uses QueryPerformanceCounter() to get the most accurate results, and that's what QPF uses. LARGE_INTEGERs date from the early 90s, when many compilers didn't support intrinsic 64-bit operations. The value you actually want is QuadPart. However, this is calibrated in system-dependent ticks, which are generally, but not always, equal to the frequency of your CPU. To convert QuadPart to milliseconds, multiply QuadPart by 1000/Frequency, where Frequency is the result of a call to QueryPerformanceFrequency(). -- /George V. Reilly [EMAIL PROTECTED] http://www.georgevreilly.com/blog