JE's handling of short loops has been much sped up in J9.03, so the fact that you are not seeing much performance difference says that this program is not spending its time in interpretive overhead.  The next step would be to run jpm to see what it IS doing, but I am more interested in comparing the interpretive overhead of Python vs J.

Henry Rich

On 9/7/2021 4:48 AM, Jan-Pieter Jacobs wrote:
@Raul: Frankly, I didn't try to understand neither the specs for the
checksum, nor what was going on in the Python code. I just copied it,
adapted it, and made sure my version yields the same as python.

@Henry: it seemed like that in my previous test, indeed. however, I tried
on a different computer where I do have different versions of J available,
but found the difference very small.
The test with Python was a lot faster here as well.
I guess the difference I reported yesterday was more due to a speedup in
the Python interpreter (between 3.8.x on my pc vs. 3.9.y on my phone) than
between J versions. Another explanation could be that there's a huge
(relative) difference between non-avx (my phone), avx (my pc used for my
previous comparison) and avx2 (reported below).

The results of my new comparison (j901, j902, j903-beta o, python 3.9.5)
are:
100 runs in:
j901:    1m11,783s
j902:    1m12,730s
j903:    1m11,945s
pyhon: 0m18,722s

So it seems mostly that the python interpreter made a speed jump between
3.8 (used for my first test) and 3.9 (used in the above test).

More details below:

## j901##
  ~/j901/bin/jconsole -js 'exit 0: echo JVERSION'
Engine: j901/j64avx/linux
Release-f: commercial/2020-06-11T15:57:46
Library: 9.01.24
Platform: Linux 64
Installer: J901 install
InstallPath: /home/jpjacobs/j901
Contact: www.jsoftware.com

time for((i=0;i<100;++i)); do ~/j901/bin/jconsole fannkuch-redux901.ijs 8;
done
real    1m11,783s
user    1m9,646s
sys     0m1,236s

## j902 ##
  ~/j902/bin/jconsole -js 'exit 0: echo JVERSION'
Engine: j902/j64avx/linux
Release-b: commercial/2021-02-18T11:51:27
Library: 9.02.08
Platform: Linux 64
Installer: J902 install
InstallPath: /home/jpjacobs/j902
Contact: www.jsoftware.com

time for((i=0;i<100;++i)); do ~/j902/bin/jconsole fannkuch-redux_noai.ijs 8
;done

real    1m12,730s
user    1m10,801s
sys     0m1,018s

## j903 ##
  ~/j903/bin/jconsole -js 'exit 0: echo JVERSION'
Engine: j903/j64avx/linux
Beta-o: commercial/2021-08-24T18:59:22
Library: 9.03.06
Platform: Linux 64
Installer: J903 install
InstallPath: /home/jpjacobs/j903
Contact: www.jsoftware.com

time for((i=0;i<100;++i)); do ~/j903/bin/jconsole fannkuch-redux_noai.ijs 8
;done
real    1m11,945s
user    1m9,551s
sys     0m1,035s

## python 3.9.5 ##
python --version
Python 3.9.5

time for((i=0;i<100;++i)); do python fannkuch-redux.py 8; done
real    0m18,722s
user    0m17,733s
sys     0m0,999s


On Mon, Sep 6, 2021, 19:13 Raul Miller <[email protected]> wrote:

I did not see the ordering of the permutations specified in the
benchmark. And, the order should not matter (since both >. and + are
both commutative and associative, and those are what we are using to
combine the values obtained from the different permutations).

However, changing the while. in my bgame1 to whilst. might be
necessary. (This will change the number of iterations when 1 is the
first value in the permutation.)

That said, if the checksum is positive for length two permutations,
that implementation has not fully implemented the benchmark as
documented at
https://benchmarksgame-team.pages.debian.net/benchmarksgame/description/fannkuchredux.html

For length 2 permutations, there are two permutations to consider: 1 2
and 2 1. These either both require 1 flip or one of them requires 1
flip and the other requires 0 flips. And the benchmark states that odd
flip counts are negative.

FYI,

--
Raul



On Mon, Sep 6, 2021 at 12:55 PM Jan-Pieter Jacobs
<[email protected]> wrote:
Hi Raul,

The output produced by the python version is:
Pfannkuchen(2) = 1
2
Pfannkuchen(3) = 2
4
Pfannkuchen(4) = 4
11
Pfannkuchen(5) = 7
49
Pfannkuchen(6) = 10
228
Pfannkuchen(7) = 16

with the bare numbers being the checksums, so it seems there's something
off with the checksums.

Note that the permutations are not in the order A. produces them for
(i.e.
(i.!n)A. i. n). You can get the order used by using a negative number as
input to either the J or python script I provided.

Jan-Pieter

On Mon, Sep 6, 2021, 17:00 Raul Miller <[email protected]> wrote:

I am not quite sure that I have implemented this properly (I didn't
see any example results to check against), but I think that this
should be close to what that benchmark asks for:

bgame1=:{{
   P=. y
   N=. 0
   while. 1~:{.P do.
     N=. N+1
     F=. {.P
     P=. (|.F{.P) (i.F)} P
   end.
   N
}}

bgame=:{{
   P=. i.y
   CHK=.MAX=. 0
   for_J. i.!y do.
     MAX=.MAX>.N=. bgame1 1+J A. P
     CHK=. CHK+N*_1^2|N
   end.
   MAX,CHK
}}

   bgame 7
16 _108
    timespacex 'bgame 7'
0.016073 69408

If my result here seems to be correct, implementing a "parallel"
version which spins up multiple J instances should be relatively
straightforward.

I hope this helps,

--
Raul

On Mon, Sep 6, 2021 at 9:49 AM Jan-Pieter Jacobs
<[email protected]> wrote:
Hi,

I converted one of the BenchmarkGame problem's python solution (

https://benchmarksgame-team.pages.debian.net/benchmarksgame/description/fannkuchredux.html
)
to J.
I just transliterated the Python solution (including all the stinking
loops, ugly workarounds for generators etc), sticking to the
original as
much as possible, so I am sure a faster solution must exist in J,
and I
also did not implement the parallel part of the python solution once
arguments get large: this solution works till permutations of length
8.
This is mainly because I wrote this on my phone and neither J's nor
Python's parallelism is supported on my OS.

The scripts used are in attachment (strip the .txt from the names)

Results (abbreviated output; ran in powershell on Windows 10 on an
Intel
core i7-8665U):

PS C:\Users\myuser\j903-user\temp> Measure-Command { For($i=0; $i -lt
100;
$i++) {..\..\j903\bin\jconsole.exe fannkuch-redux_noai.ijs 8}}

TotalMilliseconds : 53978,1287

PS C:\Users\myuser\j903-user\temp> Measure-Command { For($i=0; $i -lt
100;
$i++) {python fannkuch-redux.py 8}}

TotalMilliseconds : 50086,8826

PS C:\Users\myuser\j903-user\temp> python --version
Python 3.8.3

PS C:\Users\myuser\j903-user\temp> ..\..\j903\bin\jconsole.exe -js
'exit
0:
echo JVERSION'
Engine: j903/j64avx2/windows
Beta-o: commercial/2021-08-24T18:57:03
Library: 9.03.06
Platform: Win 64
Installer: J903 install
InstallPath: c:/users/myuser/j903
Contact: www.jsoftware.com

    100 * 53978.1287 % 50086.8826
107.769

Jconsole takes 7.8% longer than Python averaged over 100 runs.

Which is quite good, I think, when compared with j903-beta a (most
recent
available for my phone, Android 32 (armeabi-v7a)) and python 3.9.6;
there
50 runs of J took 2m19.879s vs. python 0m49.456s.

That is, J takes 182.8% longer than Python, averaged over 50 runs!

I'm also curious to see how the best J solution ranks compared to the
above, as well as the paralnel version.


Best regards,

Jan-Pieter

On Sun, Aug 29, 2021, 04:59 Henry Rich <[email protected]> wrote:

In beta-o I have rewritten the parser one more time.  I don't see
how
it
can get much faster.  In a weakly-typed language like J there is
only
so
much analysis that can be done before executing a sentence.  I
wonder
how J performs compared to other popular languages, especially
Python
which is what the cool kids are using.  If anyone is willing to do
the
comparison, I'd be obliged.

I am thinking of measuring the execution time of a simple program,
one
that does scalar-only operations so we are focusing on the
parser.  A
sample J program would be:

v =: {{ totl =. 0 for_i. y do. totl =. totl + i * i_index end.
totl }}
10 (6!:2) 'v a' [ a =. i. 1e6

Large improvement would require heroic intervention: parsing &
caching
sentences on the fly &  watching assignments to make sure the
cached
parse is valid.  I would rather avoid that.

Henry Rich

--
This email has been checked for viruses by AVG.
https://www.avg.com


----------------------------------------------------------------------
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

----------------------------------------------------------------------
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


--
This email has been checked for viruses by AVG.
https://www.avg.com

----------------------------------------------------------------------
For information about J forums see http://www.jsoftware.com/forums.htm

Reply via email to