Benchmark wave access with *lots* of waves


/// @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.

Graph0.pdf (29.79 KB)

Forum

Support

Gallery

Igor Pro 10

Learn More

Igor XOP Toolkit

Learn More

Igor NIDAQ Tools MX

Learn More