Doing Nothing Takes Longer Than Doing... Nothing? [message #38003] |
Wed, 11 February 2004 03:25 |
timrobishaw
Messages: 16 Registered: June 2003
|
Junior Member |
|
|
Hi there,
I'm really stumped here. I wrote a routine that compares the average
time to run two different modules. I decided to run the benchmark in
clumps... I timed how long it took to complete routine #1 NREPS times
and then took the average; then I did the same for routine #2. BUT, I
also repeated this process NAVGS times (since I can see fluctuations
in the average time when I load ESPN in my web browser! I have a slow
computer on my desk, but the situation I'm about to describe was
reproduced on some wicked fast machines). So the most basic test I
could come up with was to make two modules, TESTROUTINE1 and
TESTROUTINE2 that do ABSOLUTELY NOTHING. My first guess would be that
they should take the same amount of time to run. But I wouldn't be
writing this post if they had. I would be hugely appreciative if some
kind folks would run the code below and see if they find this similar
pathology: no matter which modules I race and no matter which order I
race them in (e.g., TESTROUTINE1 vs. TESTROUTINE2 or TESTROUTINE2 vs.
TESTROUTINE1 or *even* TESTROUTINE1 vs. TESTROUTINE1) I find that the
module inside the first loop is always FASTER. I threw in a 3rd
routine that does NOTHING as well... same deal. I have a feeling this
may have something to do with the fundamentals of computer science, or
magic. Any help here would be appreciated! Best -Tim.
;==================================
pro testroutine1
end
;==================================
pro testroutine2
end
;=================================
pro testroutine3
end
;=================================
pro benchmark
NREPS=5000L
NAVGS=50L
profiler, /SYSTEM, /CLEAR, /RESET
profiler,'testroutine1'
profiler,'testroutine2'
profiler,'testroutine3'
delt1 = dblarr(navgs)
delt2 = dblarr(navgs)
for j = 0L, navgs-1L do begin
; TIME ROUTINE NUMBER 1...
tstart = systime(1)
for i = 1L, nreps do begin
testroutine1
endfor
delt1[j] = (systime(1)-tstart)
; TIME ROUTINE NUMBER 2...
tstart = systime(1)
for i = 1L, nreps do begin
testroutine2
endfor
delt2[j] = (systime(1)-tstart)
; UPDATE OUR PROGRESS...
print, 100*j/(navgs-1), format='($,"Progress: ",I4,"%",%"\R")'
endfor
;==============
; GET THE AVERAGE TIMES...
avg1 = delt1/double(nreps)
avg2 = delt2/double(nreps)
;==============
; GET THE MEANS...
mnavg1 = total(avg1,/DOUBLE)/double(navgs)
mnavg2 = total(avg2,/DOUBLE)/double(navgs)
; TELL US ABOUT THE RESULTS...
print, mnavg1, format='(2(%"\V"),"Average1 = ",e16.7," s")'
print, mnavg2, format='("Average2 = ",e16.7," s",%"\V")'
; WHAT DOES IDL CODE PROFILER REPORT...
print, 'IDL Code Profiler reports:'
profiler, /REPORT
profiler, /CLEAR
end; benchmark
|
|
|