Timing computation in cycles
Jump to navigation
Jump to search
The printable version is no longer supported and may have rendering errors. Please update your browser bookmarks and please use the default browser print function instead.
This page illustrates the use of the 'rdtsc' register on x86 machines to measure the number of cycles a chunk of Haskell code requires. We use lookup of a key in a map as an example.
The Rdtsc library is available from the libraries page.
import System.CPUTime.Rdtsc
import qualified Data.Map as M
import Text.Printf
import System.Environment
list =
["Baughn" ,"falconair" ,"Lemmih" ,"Philippa" ,"ToRA" ,"bd_" ,"felipe" ,"levitation[A"
,"Plareplane" ,"TSC" ,"bdash" ,"flux__" ,"lisppaste2" ,"Poeir" ,"tuukkah" ,"beelsebob"
,"fnordus" ,"lispy" ,"prb" ,"twanvl" ,"benc__" ,"fridim_" ,"liyang" ,"profmakx"
,"TwigEther" ,"benja_" ,"gaal" ,"LoganCapaldo" ,"Prozen" ,"uebayasi" ,"Betovsky"
,"gdsx" ,"lokadin" ,"psnl" ,"Ugarte" ,"bitshifter" ,"GeoBesh" ,"Lor" ,"pstickne" ,"ulfdoz"
,"bobwhoops" ,"george--" ,"loud-" ,"psykotic" ,"vegai" ,"bohanlon" ,"giksos" ,"lucca"
,"ptolomy" ,"vegaiW" ,"bos" ,"glguy" ,"Lunar^" ,"Pupeno" ,"Vq^" ,"bos31337" ,"gmh33"
,"Lunchy" ,"PupenoR" ,"waern" ,"Botje" ,"grumpy_old_one" ,"magagr" ,"pyronicide"
,"Wallbraker" ,"boulez" ,"GueNz" ,"mahogny" ,"quazaway" ,"wchogg" ,"cajole" ,"guillaumh"
,"makinen" ,"quetzal" ,"wilx`" ,"Cale" ,"gvdm_other" ,"MarcWeber" ,"qwr" ,"woggle"
,"calvins_" ,"Hirvinen" ,"maskd" ,"rafl" ,"wolverian" ,"cameron" ,"ibid" ,"mathrick"
,"ramkrsna" ,"xerox" ,"carp_" ,"Igloo" ,"mathrick_" ,"ramza3" ,"Xgc" ,"clanehin" ,"ikaros"
,"mattam" ,"rashakil_" ,"xian" ,"ClaudiusMaximus" ,"integral" ,"matthew-_" ,"ray"
,"xinming" ,"clog" ,"Jaak" ,"mauke" ,"rc-1" ,"xpika" ,"cmeme" ,"jbalint" ,"mbishop"
,"rds" ,"yaarg" ,"Codex_" ,"jcreigh" ,"metaperl" ,"reppie" ,"yosemite" ,"cods" ,"jdev"
,"Mitar" ,"resiak" ,"Z4rd0Z" ,"cognominal" ,"jgrimes" ,"mlh" ,"retybok" ,"zamez" ,"cpfr"
,"JKnecht" ,"moconnor" ,"rey_" ,"zeuxis" ,"ctkrohn" ,"jlouis" ,"monochrom" ,"saccade"
,"ziggurat" ,"daniel_larsson" ,"jmg_" ,"moonlite" ,"Saizan" ,"|shad0w|" ,"dany2k" ,"jmob"
,"mornfall" ,"SamB" ,"Daveman" ,"joene_" ,"mr_ank" ,"SamB_XP" ,"dblog" ,"johs_" ,"ms_"
,"scw" ,"dcoutts" ,"jrockway" ,"Muad_Dib" ,"shapr" ]
main = do
[v] <- getArgs
-- force evaluation (don't want to time evaluation of lazy structures)
length list `seq` return ()
let m = M.fromList (zip list [1..])
M.size m `seq` return ()
-- do the lookup
t <- rdtsc
k <- M.lookup v m
u <- rdtsc
print k
printf "%d cycles\n" (fromIntegral (u - t) :: Int)
Running this:
$ ./A shapr 161 3058 cycles