Re: How to keep statement order in VC optimization?
On Sat, 1 Aug 2009 07:40:49 +0800, "zhu.pi" <zhu.pi@aioe.org> wrote:
I use __rdtsc() to test ticks of functions
unsigned long long t;
t = __rdtsc();
func1();
printf("%I64u ", rdtsc() - t);
t = rdtsc();
func2();
printf("%I64u ", rdtsc() - t);
t = rdtsc();
func3();
printf("%I64u\n", rdtsc() - t);
cl /O1 or cl /Od will "optimize" the code to
unsigned long long t;
func3();
t = __rdtsc();
func1();
printf("%I64u ", rdtsc() - t);
t = rdtsc();
func2();
printf("%I64u ", rdtsc() - t);
t = rdtsc();
printf("%I64u\n", rdtsc() - t);
How to told tell vc optimizer to keep my statement order?
Thanks.
Well, "cl /Od" disables optimizations, so I expect you meant something
else. Statement order depends on "observable behavior", which consists of
reads/writes to volatile variables and calls to library I/O functions. That
sounds pretty underspecified, and indeed, code that doesn't explicitly
cause observable behavior can be rearranged as long as it preserves the
semantics defined by the language. (Aside: Ordering is preserved whenever a
function call is opaque to the compiler, e.g. a call to a function in a
DLL, for which the compiler pretty much has to assume the function can
affect the observable behavior and be conservative with optimizing around
it. This includes flushing values out of registers to variables in memory
and so forth. This effect could be misleading if you're not aware of it.)
Timing and benchmark code is especially sensitive to optimizations changing
their meaning. The solution is to add observable behavior. Sometimes, it's
as simple as declaring a variable they use volatile. For example, you could
declare "t" volatile and have all the funcX's read it.
--
Doug Harrison
Visual C++ MVP