Thank you for testing.

The time efficiency improvement is disappointing so that
the patch must be rejected.  The genral solution will be 
implementing special code in J engine to handle box array
concatenation but unsure if that is feasible and easy.

Пн, 17 мар 2014, June Kim (김창준) писал(а):
> Hi
> 
> Thanks Bill. And sorry for my delayed reply. BTW, I am cross-posting this
> to the J programming mailing list, for the people who are interested in the
> follow-up.
> 
> I've ran your version of json against the standard package version and the
> standard pure python json module. Your version is faster but takes larger
> memory, but the result is not exactly the same(more on this at the end).
> 
> The standard version:
> 
>    bm=. 1!:1 <'Bookmarks'
>    ts=: 6!:2,7!:2@]
>    ts 'dec_json bm'
> 66.3499 5.36879e8
> 
> The new version you provided:
> 
>    ts 'dec_json bm'
> 34.6758 1.36445e9
> 
> The standard pure python version:
> 
> 0.4986 75272192
> 
> In J, the standard json and the new version you provided resulted in
> different output.
> 
>    newresult -: oldresult
> 0
> 
> Yet, the enc_json'd result seems to be the same.
> 
>    newresult -:&enc_json standardresult
> 1
> 
> However, the resulted J representation is different. I just sampled one
> difference -- I am not sure if it could help.
> 
> 
>    3!:3 (((<1 0) {>@(1 {>@((<1 0){ >@((<1 1) { >@((<1 1){]))))))
> standardresult
> e300000000000000
> 2000000000000000
> 0100000000000000
> 0000000000000000
> 2800000000000000
> e300000000000000
> 2000000000000000
> 0100000000000000
> 0100000000000000
> 0100000000000000
> 3000000000000000
> e300000000000000
> 2000000000000000
> 0c00000000000000
> 0200000000000000
> 0200000000000000
> 0600000000000000
> 9000000000000000
> c800000000000000
> f800000000000000
> 2801000000000000
> 7001000000000000
> a001000000000000
> d001000000000000
> 1002000000000000
> 4002000000000000
> 9002000000000000
> c002000000000000
> f002000000000000
> e300000000000000
> 0200000000000000
> 0a00000000000000
> 0100000000000000
> 0a00000000000000
> 646174655f616464
> 6564000000000000
> e300000000000000
> 0200000000000000
> 0200000000000000
> 0100000000000000
> 0200000000000000
> 6964000000000000
> e300000000000000
> 0200000000000000
> 0400000000000000
> 0100000000000000
> 0400000000000000
> 6e616d6500000000
> e300000000000000
> 0200000000000000
> 1800000000000000
> 0100000000000000
> 1800000000000000
> 73796e635f747261
> 6e73616374696f6e
> 5f76657273696f6e
> 0000000000000000
> e300000000000000
> 0200000000000000
> 0400000000000000
> 0100000000000000
> 0400000000000000
> 7479706500000000
> e300000000000000
> 0200000000000000
> 0300000000000000
> 0100000000000000
> 0300000000000000
> 75726c0000000000
> e300000000000000
> 0200000000000000
> 1100000000000000
> 0100000000000000
> 1100000000000000
> 3133303031353737
> 3430313837303032
> 3100000000000000
> e300000000000000
> 0200000000000000
> 0500000000000000
> 0100000000000000
> 0500000000000000
> 3330363133000000
> e300000000000000
> 0200000000000000
> 2200000000000000
> 0100000000000000
> 2200000000000000
> ec9584eab8b02045
> 5350202d20416e64
> 726f696420eba788
> ecbc93ec9d9820ec
> 95b1000000000000
> e300000000000000
> 0200000000000000
> 0400000000000000
> 0100000000000000
> 0400000000000000
> 3230343300000000
> e300000000000000
> 0200000000000000
> 0300000000000000
> 0100000000000000
> 0300000000000000
> 75726c0000000000
> e300000000000000
> 0200000000000000
> 7e00000000000000
> 0100000000000000
> 7e00000000000000
> 68747470733a2f2f
> 6d61726b65742e61
> 6e64726f69642e63
> 6f6d2f6465746169
> 6c733f69643d636f
> 6d2e686577697474
> 736f66742e626162
> 7926666561747572
> 653d746f702d7061
> 6964233f743d5732
> 3531624777734d53
> 77794c4449774e69
> 7769593239744c6d
> 686c64326c306448
> 4e765a6e5175596d
> 466965534a640000
> 
>    3!:3 (((<1 0) {>@(1 {>@((<1 0){ >@((<1 1) { >@((<1 1){])))))) newresult
> e300000000000000
> 2000000000000000
> 0100000000000000
> 0000000000000000
> 2800000000000000
> e300000000000000
> 2000000000000000
> 0100000000000000
> 0000000000000000
> 2800000000000000
> e300000000000000
> 2000000000000000
> 0c00000000000000
> 0200000000000000
> 0200000000000000
> 0600000000000000
> 9000000000000000
> c800000000000000
> f800000000000000
> 2801000000000000
> 7001000000000000
> a001000000000000
> d001000000000000
> 1002000000000000
> 4002000000000000
> 9002000000000000
> c002000000000000
> f002000000000000
> e300000000000000
> 0200000000000000
> 0a00000000000000
> 0100000000000000
> 0a00000000000000
> 646174655f616464
> 6564000000000000
> e300000000000000
> 0200000000000000
> 0200000000000000
> 0100000000000000
> 0200000000000000
> 6964000000000000
> e300000000000000
> 0200000000000000
> 0400000000000000
> 0100000000000000
> 0400000000000000
> 6e616d6500000000
> e300000000000000
> 0200000000000000
> 1800000000000000
> 0100000000000000
> 1800000000000000
> 73796e635f747261
> 6e73616374696f6e
> 5f76657273696f6e
> 0000000000000000
> e300000000000000
> 0200000000000000
> 0400000000000000
> 0100000000000000
> 0400000000000000
> 7479706500000000
> e300000000000000
> 0200000000000000
> 0300000000000000
> 0100000000000000
> 0300000000000000
> 75726c0000000000
> e300000000000000
> 0200000000000000
> 1100000000000000
> 0100000000000000
> 1100000000000000
> 3133303031353737
> 3430313837303032
> 3100000000000000
> e300000000000000
> 0200000000000000
> 0500000000000000
> 0100000000000000
> 0500000000000000
> 3330363133000000
> e300000000000000
> 0200000000000000
> 2200000000000000
> 0100000000000000
> 2200000000000000
> ec9584eab8b02045
> 5350202d20416e64
> 726f696420eba788
> ecbc93ec9d9820ec
> 95b1000000000000
> e300000000000000
> 0200000000000000
> 0400000000000000
> 0100000000000000
> 0400000000000000
> 3230343300000000
> e300000000000000
> 0200000000000000
> 0300000000000000
> 0100000000000000
> 0300000000000000
> 75726c0000000000
> e300000000000000
> 0200000000000000
> 7e00000000000000
> 0100000000000000
> 7e00000000000000
> 68747470733a2f2f
> 6d61726b65742e61
> 6e64726f69642e63
> 6f6d2f6465746169
> 6c733f69643d636f
> 6d2e686577697474
> 736f66742e626162
> 7926666561747572
> 653d746f702d7061
> 6964233f743d5732
> 3531624777734d53
> 77794c4449774e69
> 7769593239744c6d
> 686c64326c306448
> 4e765a6e5175596d
> 466965534a640000
> 
> 
> On Tue, Mar 4, 2014 at 12:40 PM, bill lam <bbill....@gmail.com> wrote:
> 
> > June,
> >
> > I changed json decoder to avoid intermediate box contenation, the
> > trade-off might be a much larger space requirement.  Please test
> > its performance, the space requirement, and will the result be
> > correct.
> >
> > Thanks.
> >
> > --
> > regards,
> > ====================================================
> > GPG key 1024D/4434BAB3 2008-08-24
> > gpg --keyserver subkeys.pgp.net --recv-keys 4434BAB3
> > gpg --keyserver subkeys.pgp.net --armor --export 4434BAB3
> >

> coclass 'json'
> enc_json=: 3 : 0
> select. t=. 3!:0 y
> case. 2;131072 do.
>   if. y-:'json_true' do. 'true'
>   elseif. y-:'json_false' do. 'false'
>   elseif. y-:'json_null' do. 'null'
>   elseif. do.
>     '"', '"',~ jsonesc utf8^:(131072=t) ,y
>   end.
> case. 1;4;8 do.
>   ":!.17 {.,y
> case. 32 do.
>   if. 2>$$y do.
>     if. 0=#y do.
>       '[]'
>     else.
>       s=. '['
>       for_v. y do.
>         s=. s , ',',~ enc_json >v
>       end.
>       ']',~ }:s
>     end.
>   elseif. 2=$$y do.
>     assert. 0 2 e.~ {.$y
>     if. 0=#y do.
>       '{}'
>     else.
>       s=. '{'
>       for_i. i.{:$y do.
>         s=. s , ':',~ enc_json (<0,i){::y
>         s=. s , ',',~ enc_json (<1,i){::y
>       end.
>       '}',~ }:s
>     end.
>   elseif. do. 13!:8[3
>   end.
> case. do. 13!:8[3
> end.
> )
> JSONESC0=: LF, CR, TAB, FF, (8{a.), '\/"'
> JSONESC1=: 'nrtfb\/"'
> JSONASC=: JSONESC0, 32}.127{.a.
> jsonesc=: 3 : 0
> txt=. y
> msk=. txt e. JSONESC0
> if. 1 e. msk do.
>   ndx=. , ((I. msk) + i. +/ msk) +/ 0 1
>   new=. , '\',.JSONESC1 {~ JSONESC0 i. msk#txt
>   txt=. new ndx } (1 + msk) # txt
> end.
> msk=. -. txt e. JSONASC
> if. 1 e. msk do.
>   new=. 'u',"1 '0123456789abcdef' {~ 16 16 16 16 #: a. i. msk # txt
>   ndx=., ((I. msk) + 5 * i. +/ msk) +/ i. 6
>   txt=. (, '\',("1) new) ndx } (1 + msk * 5) # txt
> end.
> txt
> )
> classes=. 3<. '"\[],{}:' (#@[ |&>: i.) a.
> classes=. 0 (I.a.e.' ',CRLF,TAB)} (]+4*0=])classes
> 
> words=: (0;(0 10#:10*".;._2]0 :0);classes)&;:
>   0.0  1.1  2.1  3.1  4.1
>   1.0  5.0  6.0  1.0  1.0
>   4.0  4.0  4.0  4.0  4.0
>   0.3  1.2  2.2  3.2  4.2
>   0.3  1.2  2.0  3.2  4.0
>   0.3  1.2  2.2  3.2  4.2
>   1.0  1.0  1.0  1.0  1.0
> )
> jsonValue=: 3 : 0
> if. 0=#y do. <y
> elseif. 'true'-:y do. 'json_true'
> elseif. 'false'-:y do. 'json_false'
> elseif. 'null'-:y do. 'json_null'
> elseif. '"'={. y do. evalbs }.}:y
> elseif. '0123456789.+-' -.@e.~ {. y do. evalbs y
> elseif. do. {. 0". 'Ee-_' charsub y
> end.
> )
> subst2=: (_2<\'\"\\\/\b\f\n\r\t')&(i.{(34 92 47 8 12 10 13 9{&.><a.),])"0
> hexchars=. 'ABCDEF0123456789abcdef'
> dfh=: 16 #. 16 | _6 + hexchars i. ]
> subst6=: (8 u:[:u:@dfh 2}.]) ::]^:(6&=@#*.('\'={.)*.'uU'e.~{.@}.)&.>
> 
> splitbs=: (0;(0 10#:10*".;._2]0 :0);(a.e.hexchars)+(2*a.='\')+3*a.e.'Uu')&;:
>  1.1  1.1  2.1 1.1
>  1.0  1.0  2.2 1.0
>  3.0  3.0  3.0 4.0
>  1.2  1.2  2.2 1.2
>  1.2  5.0  2.2 1.2
>  1.2  6.0  2.2 1.2
>  1.2  7.0  2.2 1.2
>  1.2  3.0  2.2 1.2
> )
> evalbs=: [:; [:subst2 [:subst6 splitbs^:(*@#)
> 'T_LBR T_RBR T_LCB T_RCB T_COM T_COL'=: ;:' [ ] { } , :'
> 
> token=: 3 : 0
> (_1+I=: I+1){::T
> )
> 
> dec_json=: 3 : 0
> T=: words (LF,' ') charsub y-.CR
> I=: 0
> > ". getVal token''
> )
> getVal=: 3 : 0
> select. y
> case. T_LBR do. getList token''
> case. T_LCB do. getHash token''
> case. do. '(',')',~ '<',5!:5<'t'[t=. jsonValue y
> end.
> )
> getList=: 3 : 0
> if. T_RBR -: y do. '(<0#<'''')' return. end.
> r=. ,getVal y
> while. -. T_RBR -: y=. token'' do.
>   assert T_COM -: y
>   r=. r, ',', getVal token''
> end.
> '(',')',~ '<', r
> )
> getHash=: 3 : 0
> if. T_RCB -: y do. '(<0#0 0$<'''')' return. end.
> r=. getPair y
> while. -. T_RCB -: y=. token'' do.
>   assert T_COM -: y
>   r=. r, ',.', getPair token''
> end.
> '(',')',~ '<', r
> )
> getPair=: 3 : 0
> h=. getVal y
> assert T_COL -: token''
> '(',')',~ h, ',:', getVal token''
> )
> gethash_json=: 4 : 0
> assert. 2=$$y
> assert. 32=3!:0 y
> x=. ,&.> boxopen x
> assert. 1=$x
> if. ({.x) e. {.y do.
>   ({:y){~({.y) i. {.x
> else.
>   _1
> end.
> )
> emptyhash_json=: 3 : 0
> (2=$$y) *. (0={.$y) *. 32=3!:0 y
> )
> emptyarray_json=: 3 : 0
> (2>$$y) *. (0=#y) *. 32=3!:0 y
> )
> dec_json_z_=: dec_json_json_
> enc_json_z_=: enc_json_json_
> gethash_json_z_=: gethash_json_json_
> emptyhash_json_z_=: emptyhash_json_json_
> emptyarray_json_z_=: emptyarray_json_json_


-- 
regards,
====================================================
GPG key 1024D/4434BAB3 2008-08-24
gpg --keyserver subkeys.pgp.net --recv-keys 4434BAB3
gpg --keyserver subkeys.pgp.net --armor --export 4434BAB3
----------------------------------------------------------------------
For information about J forums see http://www.jsoftware.com/forums.htm

Reply via email to