For those interested in Benchmarks I have split my original benchmark routine 
into 2 scripts. One the Kernighan/Van Wyk benchmarks and an advanced benchmarks 
script. The advanced benchmarks were taken from some of the functionality that 
the Scheme language benchmarks for which I found J implementations. 

The deriv benchmark uses Raul’s suggestion with the polynomial taken from the 
data from the Scheme implementation. Itwon’t be a direct comparison to Scheme 
since Scheme does a full symbolic differentiation allowing undefined variable 
coefficients. In this respect the Scheme benchmark tests parsing nested 
S-expressions.

I added a QR decomposition benchmark from the QR essay and compare it to the 
foreign 128!:0. I also include a Schwarz-Rutishauser QR decamp implementation. 
This is translated from python code and uses for loops so on large matrices it 
is very slow. I comment out the test in the test harness.

Finally I added a matrix multiplication test given the recent discussion on 
Matrix multiplication on the programming forum. The test takes the Q and R 
matrices and multiplies them for timing. I added a match check on the original 
matrix since the data is randomly produced. 

The scripts are available at:
https://github.com/tmcguirefl/JBenchmarks

J902 on MacBook Pro Intel I7 quad core 2.9GHz
   ADVbmarks ''
tak: 0.045548 17344
fibN: 1e_6 13376
rsum: 0.005007 5.02125e6
mbrot: 0.875056 199360
deriv: 2.7e_5 9728
fftw: 0.000489 1.5751e6
ifftw: 0.000717 2.09894e6
ft: 3.4e_5 6528
fftws: 1.8e_5 5696
QRdata size: 700 400
QRrec: 0.079073 3.62602e7
QRfor: 0.090745 6.08386e7
MMult: 0.176499 3.3557e7
Match: 1 (not a timing, checks orig matrix matches the mult. QxR)

Of note to the matrix multiply discussion is that a 700x400 matrix takes less 
than a second on macOS 64 bit in J902. Granted the R matrix is upper triangular 
but if optimizations are taking place it is under the covers, since this is a 
straight J +/ . * implementation.

On J807 I took out the deriv and the rsum due to errors (my 806 doesn’t have 
the calculus lib and rsum had a stack error I assume 902 has improved 
recursion) and the results:
   ADVbmarks ''
tak: 0.069502 36032
fibN: 2e_6 8512
mbrot: 1.02267 200192
fftw: 0.000867 1.57523e6
ifftw: 0.000806 2.09907e6
ft: 5e_5 6848
fftws: 3.2e_5 7104
QRdata size: 700 400
QRrec: 0.08946 4.45858e7
QRfor: 0.100718 6.13482e7
MMult: 0.167292 4.29949e7
Match: 1 (not a timing, checks orig matrix matches the mult. QxR)

There appears to be an across the board speed up from 806 to 902 in everything 
but matrix multiplication. That may be due to differences in the random matrix 
generated for each test.

> On May 19, 2021, at 5:22 AM, Raul Miller <rauldmil...@gmail.com> wrote:
> 
> deriv_jcalculus_ does symbolic differentiation on tacit expressions.
> For example:
> 
>   load'math/calculus'
>   (3+*:) deriv_jcalculus_ 1
> 0"0 + +:
>   3 0 1&p. deriv_jcalculus_ 1
> 0 2&p.
>   (3+*:) deriv_jcalculus_ 1 i. 5
> 0 2 4 6 8
>   3 0 1&p. deriv_jcalculus_ 1 i. 5
> 0 2 4 6 8
> 
> (The right argument to deriv_jcalculus_ is how many times to take the
> derivative, a negative argument does symbolic integration instead,
> with an integration constant of 0. But integration is a bit fussier
> than derivation, so it has less support for variant expressions.)
> 
> FYI,
> 
> -- 
> Raul
> 
> On Wed, May 19, 2021 at 4:17 AM Thomas McGuire <tmcguir...@gmail.com 
> <mailto:tmcguir...@gmail.com>> wrote:
>> 
>> Thanks Raul,
>> I added your ‘tail' implementation to the code and it works without issue. 
>> The KJV text is listed in reverse line order in the output file.
>> 
>>    benchmarks ''
>> sumloop: 0.227858 8.39149e6
>> sumj: 0.000171 1.04986e6
>> ack: 2e_6 721472
>> array1: 5.6e_5 1.05107e6
>> array1t: 4.8e_5 1.05107e6
>> string1: 0.003969 2.88634e6
>> cat: 0.01474 2.51685e7
>> wc: 0.295076 1.58152e8
>> tail: 0.065197 3.77133e7
>> sum1: 0.12709 4.04989e7
>> sum1j: 0.000547 1.18086e6
>> 
>> I have placed the code on GitHub:
>> https://github.com/tmcguirefl/JBenchmarks
>> 
>> The scheme folks have put together a large set of benchmarks at:
>> https://www.ccs.neu.edu/home/will/Twobit/benchmarksAboutR6.html
>> 
>> When time permits I will go through them and implement the ones that would 
>> be J appropriate (some do symbolic differentiation which would be nontrivial 
>> for me to code into J).
>> 
>> Tom McGuire
>> 
>>> On May 18, 2021, at 9:04 PM, Raul Miller <rauldmil...@gmail.com> wrote:
>>> 
>>> Here's the tail benchmark written in J:
>>> 
>>> tail=: 4 : 0
>>> (;|.<;.2 freads x) fwrites y
>>> )
>>> 
>>> This is based on my reading of the C implementation of the tail
>>> benchmark vs the cat benchmark, and on the cat benchmark in this J
>>> implementation, except that I have failed to reproduce a bug in the C
>>> implementation which shows up when the file contains very long lines
>>> and instead I have assumed that the file ends in a newline (which is a
>>> valid assumption for the gutenberg kjv bible).
>>> 
>>> Let me know if you think I have made a mistake here.
>>> 
>>> Thanks,
>>> 
>>> --
>>> Raul
>>> 
>>> On Tue, May 18, 2021 at 7:02 PM Thomas McGuire <tmcguir...@gmail.com 
>>> <mailto:tmcguir...@gmail.com><mailto:tmcguir...@gmail.com 
>>> <mailto:tmcguir...@gmail.com>>> wrote:
>>>> 
>>>> I was going over Devon McCormick's notes from the latest NYCJUG meeting. 
>>>> There was a discussion about Benchmarks with an example of the 
>>>> Kernighan/Van Wyk benchmarks in LISP/Scheme. Devon had made the comment 
>>>> that for most things people use J for that correctness overshadowed 
>>>> performance.
>>>> 
>>>> The K/VW benchmarks were originally made for C and seem to test looping 
>>>> controls and memory allocation which at a time of low memory minicomputers 
>>>> and PCs, coupled with multiple available C compilers, made the benchmarks 
>>>> a nice way of comparing compiler implementations as well as new processor 
>>>> speed.
>>>> 
>>>> However it seemed like a simple project to exercise my J programming 
>>>> skills with so I have attached the program to this email.
>>>> 
>>>> Note: you will need to download the King James Version of the Bible from 
>>>> project Guttenburg (not included with the attachment) to run the full 
>>>> benchmarks. I also created my own file of floating point numbers to sum 
>>>> (routine to create a file of random floats is included). I have added some 
>>>> routines to accomplish similar functionality in the way I would do it in J 
>>>> (at least for my mere mortal understanding of J).
>>>> 
>>>> Running on my mac book pro (2016 with 2.9 Ghz Quad core I7) the results 
>>>> are:
>>>> 
>>>>  benchmarks ''
>>>> sumloop: 0.214383 8.39149e6
>>>> sumj: 0.000162 1.04986e6
>>>> ack: 4e_6 721472
>>>> array1: 0.000578 1.05107e6
>>>> array1t: 2.5e_5 1.05107e6
>>>> string1: 0.003237 2.88634e6
>>>> cat: 0.014234 2.51685e7
>>>> wc: 0.302383 1.58152e8
>>>> sum1: 0.124006 4.04989e7
>>>> sum1j: 0.000956 1.18086e6
>>>> 
>>>> thought I would share
>>>> 
>>>> Tom McGuire
>>>> ----------------------------------------------------------------------
>>>> For information about J forums see http://www.jsoftware.com/forums.htm 
>>>> <http://www.jsoftware.com/forums.htm><http://www.jsoftware.com/forums.htm 
>>>> <http://www.jsoftware.com/forums.htm>>
>>> ----------------------------------------------------------------------
>>> For information about J forums see http://www.jsoftware.com/forums.htm 
>>> <http://www.jsoftware.com/forums.htm><http://www.jsoftware.com/forums.htm 
>>> <http://www.jsoftware.com/forums.htm>>
>> ----------------------------------------------------------------------
>> For information about J forums see http://www.jsoftware.com/forums.htm 
>> <http://www.jsoftware.com/forums.htm>
> ----------------------------------------------------------------------
> For information about J forums see http://www.jsoftware.com/forums.htm 
> <http://www.jsoftware.com/forums.htm>
----------------------------------------------------------------------
For information about J forums see http://www.jsoftware.com/forums.htm

Reply via email to