
Benchmark wave access with *lots* of waves

thomas_braun
/// @name Parameters for gnoise and enoise ///@{ Constant NOISE_GEN_LINEAR_CONGRUENTIAL = 1 ///< Don't use for new code. Constant NOISE_GEN_MERSENNE_TWISTER = 2 ///@} /// @brief Random shuffle of the wave contents /// /// Function was taken from: http://www.igorexchange.com/node/1614 /// author s.r.chinn /// /// @param inwave The wave that will have its rows shuffled. /// @param noiseGenMode [optional, defaults to #NOISE_GEN_LINEAR_CONGRUENTIAL] type of RNG to use Function InPlaceRandomShuffle(inwave, [noiseGenMode]) wave inwave variable noiseGenMode variable i, j, emax, temp variable N = DimSize(inwave, 0) if(ParamIsDefault(noiseGenMode)) noiseGenMode = NOISE_GEN_LINEAR_CONGRUENTIAL endif for(i = N; i>1; i-=1) emax = i / 2 j = floor(emax + enoise(emax)) // random index // emax + enoise(emax) ranges in random value from 0 to 2*emax = i temp = inwave[j] inwave[j] = inwave[i-1] inwave[i-1] = temp endfor end Function/S MakeName(index) variable index string name sprintf name, "W_%010d", index return name End Function BenchmarkWaveAccess() KillDataFolder/Z root: variable numWaves = 1e5 variable numTrials = 1e4 variable numRuns = 1 variable i, now, j, globalnow string name Make/O/N=(numWaves) timing = 0 Make/O/N=(numWaves) indizes = p SetrandomSeed/BETR=1 1 Inplacerandomshuffle(indizes, noiseGenMode=NOISE_GEN_MERSENNE_TWISTER) for(i = 0; i < numWaves; i += 1) Make/O/N=10000 $MakeName(i) endfor globalnow = stopmstimer(-2) for(i = 0; i < numTrials; i += 1) if(mod(i, numTrials*0.01) == 0) printf "%g\r" (i/numTrials) * 100 endif now = stopmstimer(-2) for(j = 0; j < numRuns; j += 1) WAVE wv = $MakeName(indizes[i]) endfor timing[indizes[i]] = (stopmstimer(-2) - now)/1e6/numRuns endfor printf "elapsed time %g\r", (stopmstimer(-2) - globalnow)/1e6/numRuns End
Warning: Inspect the code before running it as it takes quite a bit of RAM.
After running BenchmarkWaveAccess() call Display timing.

Forum

Support

Gallery
Igor Pro 9
Learn More
Igor XOP Toolkit
Learn More
Igor NIDAQ Tools MX
Learn More