I neglected the part that reads the variables and saves the configuration. Here's one way
loadConfig=: 3 :0 'nm val'=. |: readConf file ConfNames=: nm ConfValues=: 'T' (I.a:=val)} val,<'F' ) This extra step should be a part of the benchmarked time. Once a configuration has been loaded: getConfig=: 3 :0 (ConfNames i. ;: y) { ConfValues ) These values are boxed, either unbox them or change getConfig to use {:: instead of { That said, this file is so short that I would expect that the bulk of the time would be spent on reading it and constant time interpreter overhead. The benchmarking is probably useless unless the config gets large. However, people do not like dealing with large config files and even a megabyte for the file is probably larger than most people would ever deal with. Still, it's fun to play with the code. Thanks, -- Raul On Tue, Jan 14, 2014 at 12:20 PM, Joe Bogner <joebog...@gmail.com> wrote: > Raul - in my basic benchmarking that sped it up about 5% (200ms) > > Here's my implementation - trying to be more explicit. It takes about > 5891 ms to run 10000 iterations as compared to 4000 for the other J > implementations (43% slower). I'm sure it might be able to be > improved. There's more boxing and each than probably necessary. > > I grab the lines in two passes and operate on them. > > The disabled lines is a requirement that both the prior J > implementations seem to have missed. Rosettacode says it should also > output > > "seedsremoved = false" > > > starts=: 13 : '(<x) = {. each y' > > keyValue=: 4 : 0 > DefaultValue=:x > Spaces=:> (' ' (i.&1@:=) each y) > Keys=:Spaces {. each y > Values=: (Spaces+1) }. each y > Values=:(3 : '> ((# y) > 0) } (DefaultValue;y)') each Values > (Keys,.Values) > ) > > readConf=: 3 : 0 > All=:LF cut y > NB. All lines except comments, disabled and blank > Lines=:(-. (';' starts All) + ('#' starts All) + (CR starts All)) # All > NB. only the disabled lines > Disabled=: 2}. each (';' starts All) # All NB. chop off ;<space> > ('T' keyValue Lines),('F' keyValue Disabled) > ) > > go=: 3 : 0 > readConf (fread 'c:\temp\test.conf') > ) > > > +--------------+-------------------------+ > |FULLNAME |Foo Barber | > +--------------+-------------------------+ > |FAVOURITEFRUIT|banana | > +--------------+-------------------------+ > |NEEDSPEELING |T | > +--------------+-------------------------+ > |OTHERFAMILY |Rhu Barber, Harry Barber | > +--------------+-------------------------+ > |SEEDSREMOVED |F | > +--------------+-------------------------+ > > > > On Tue, Jan 14, 2014 at 9:48 AM, Raul Miller <rauldmil...@gmail.com> wrote: >> It might be interesting to try it on a large file. >> >> Here's another state machine implementation that might perform better: >> >> StateMachine=: 2 :0 >> (m;(0 10#:10*".;._2]0 :0);<n)&;: >> ) >> >> CleanChrs=: '#;';(' ',TAB);LF;a.-.'#; ',TAB,LF >> NB. comment, space, line, other >> >> clean=: 1 StateMachine CleanChrs >> 1.0 0.0 0.0 2.1 NB. 0: skip whitespace (start here) >> 1.0 1.0 0.0 1.0 NB. 1: comment >> 3.3 4.0 6.0 2.0 NB. 2: word >> 3.0 3.0 6.1 3.0 NB. 3: comment after word >> 3.3 5.3 6.0 2.0 NB. 4: first space after word >> 3.0 5.0 6.1 2.1 NB. 5: extra space after word >> 1.3 0.3 0.3 2.0 NB. 6: line end after word >> ) >> NB. .0 continue, .1 start, .3 end >> >> SplitChrs=: (' ',TAB);a.-.' ',TAB >> NB. space, other >> >> split=: 0 StateMachine SplitChrs >> 0.6 1.1 NB. start here >> 2.3 1.0 NB. other (first word) >> 0.6 3.1 NB. first space >> 3.0 3.0 NB. rest >> ) >> NB. .6 error >> >> readConf=: split;._2@clean@fread >> >> I think the performance problem you observed is because the first >> version started boxing too early. Here, I save boxing till the end, >> and create fewer boxes, both of which should reduce overhead. >> >> Thanks, >> >> -- >> Raul >> >> > ---------------------------------------------------------------------- > For information about J forums see http://www.jsoftware.com/forums.htm ---------------------------------------------------------------------- For information about J forums see http://www.jsoftware.com/forums.htm