I guess the benchmarks show that you are right. But the thing to worry about are the O(n^2) monsters, not mere factors of 2 or 3 or 10.
But regarding the benchmarks: the interpreter may have infelicities in treating the types of empty things. array =. (100000 2 ?@$ 200 10) (<;.0~ ,.)~"1 _ a. ~. $&.> array ┌─┬─┬─┬─┬─┬─┬─┬─┬─┬─┐ │3│8│2│7│9│1│4│6│0│5│ └─┴─┴─┴─┴─┴─┴─┴─┴─┴─┘ array =. (100000 2 ?@$ 200 10) (<;.0~ ,.)~"1 _ a. ~. $&.> array ┌─┬─┬─┬─┬─┬─┬─┬─┬─┬─┐ │8│1│6│5│3│4│2│0│9│7│ └─┴─┴─┴─┴─┴─┴─┴─┴─┴─┘ On Tue, Aug 19, 2014 at 4:55 PM, Henry Rich <[email protected]> wrote: > My experiments show ~. faster than ~.!.0 for boxed character arrays of > rank 2 (disagreeing with Roger's point 1) > > array =. (100000 2 ?@$ 200 10) (<;.0~ ,.)~"1 _ a. > 50 {."1 ": array > +--++-------+-------+--++---+--------+--------+--- > |YZ||�������|ABCDEFG| || |��������|��������|��� > +--++-------+-------+--++---+--------+--------+--- > array2 =. ,.~ array > $array2 > 100000 2 > 10 ts '~. array' > 0.0212086 1.57357e6 > 10 ts '~.!.0 array' NB. No change for rank 1 > 0.0211375 1.57389e6 > 10 ts '~. array2' > 0.0508845 2.09786e6 > 10 ts '~.!.0 array2' NB. Slowdown for rank 2 > 0.151277 2.22925e6 > > Henry Rich > > > On 8/19/2014 7:43 PM, Roger Hui wrote: > >> 0. For a floating point vector, ~.!.0 is faster than ~., but not to the >> extent that Bill Lam implied. >> >> timer=: 6!:2 >> x=: 1e6 ?@$ 0 >> >> 10 timer '~.x' >> 0.136236 >> 10 timer '~.!.0 x' >> 0.0814054 >> >> Same comments apply to other functions in the index-of family. >> >> 1. For non-numeric arguments (and boxed arrays not involving numbers), >> ~.!.0 should run at the same speed as ~. >> >> x=: a.{~ 1e6 12 ?@$ 256 >> 10 timer '~.x' >> 0.13204 >> 10 timer '~.!.0 x' >> 0.130772 >> >> 2. Floating point matrices can have O(n^2) performance. It's best to use >> ~.!.0 if you can get away with it. >> >> 3 : '10 timer ''~.t'' [ t=. 1.5,.y ?@$ 0'"0 ]10^0 1 2 3 4 >> 3.03225e_6 5.45805e_6 0.000412806 0.012665 1.01016 >> >> 3 : '10 timer ''~.!.0 t'' [ t=. 1.5,.y ?@$ 0'"0 ]10^0 1 2 3 4 >> 4.05855e_6 4.3851e_6 3.11155e_5 0.000177643 0.0015026 >> >> 3. Boxed arrays involving numerics (even all integers) can have O(n^2) >> performance. It's best to use ~.!.0 if you can get away with it. >> >> I don't remember the exact details of how this comes about. Best to check >> the source, or at least run a few (small) benchmarks. >> >> 3. The interpreter checks for interrupts predominantly during memory >> allocation. If there is a computation that runs for a long time and >> appears to be uninteruptible, this is the most likely culprit. Note: most >> anything in J can not proceed without allocating memory. >> ---------------------------------------------------------------------- >> For information about J forums see http://www.jsoftware.com/forums.htm >> >> ---------------------------------------------------------------------- > For information about J forums see http://www.jsoftware.com/forums.htm > ---------------------------------------------------------------------- For information about J forums see http://www.jsoftware.com/forums.htm
