[Date Prev][Date Next][Thread Prev][Thread Next]
[Date Index]
[Thread Index]
- Subject: Re: OCaml vs. Lua for Datalog
- From: "John D. Ramsdell" <ramsdell0@...>
- Date: Wed, 6 Feb 2013 17:01:29 -0500
I have not tried LuaJIT, but forecasts say I might be snowed in
soon--a perfect time to investigate it.
John
On Tue, Feb 5, 2013 at 10:08 PM, Dimiter 'malkia' Stanev
<malkia@gmail.com> wrote:
> Have you tried this against luajit?
>
> http://luajit.org
>
>
> On 2/5/2013 3:25 PM, John D. Ramsdell wrote:
>>
>> I came across the sources to an implementation of Datalog I wrote in
>> OCaml and placed them on GitHub at
>> <https://github.com/ramsdell/ocaml-datalog>. The algorithm is
>> identical to the one I wrote in Lua, in fact, the OCaml version
>> preceded the Lua version. I used a test suite created by Simon
>> Cruanes and compared the elapse time and the max resident memory size
>> of the two programs. Lua was a bit slower and used more memory. Not
>> unexpected I suppose.
>>
>> John
>>
>> ---------------------------------------------------------
>>
>> Lua vs. OCaml Datalog Performance
>>
>> Elapsed Time Max Resident
>>
>> induction 200
>> Lua 0.25 Sec 3916 KB
>> OCaml 0.03 Sec 3884 KB
>>
>> induction 500
>> Lua 1.42 Sec 8328 KB
>> OCaml 0.20 Sec 4800 KB
>>
>> induction 1000
>> Lua 5.65 Sec 14440 KB
>> OCaml 0.77 Sec 6808 KB
>>
>> induction 1500
>> Lua 14.26 Sec 20668 KB
>> OCaml 1.16 Sec 8844 KB
>>
>> reachable 200
>> Lua 1.05 Sec 40316 KB
>> OCaml 0.25 Sec 15608 KB
>>
>> reachable 500
>> Lua 7.14 Sec 229216 KB
>> OCaml 3.37 Sec 81852 KB
>>
>> reachable 1000
>> Lua 40.16 Sec 972408 KB
>> OCaml 25.36 Sec 323516 KB
>>
>> reachable 1500
>> Lua 97.66 Sec 2169556 KB
>> OCaml 61.68 Sec 681012 KB
>> ---------------------------------------------------------
>> #! /bin/sh
>>
>> # Compares the performance of Datalog in Lua and Datalog in OCaml
>>
>> # Based on a test suite by Simon Cruanes <https://github.com/c-cube>
>>
>> # Be sure to make OCaml Datalog with "make native-code"
>>
>> # Location of Datalog in Lua
>> DATALOG=${1:-datalog}
>>
>> # Sizes of test cases
>> TESTS="200 500 1000 1500"
>>
>> # Time format
>> export TIME="\t%e Sec\t%M KB"
>>
>> # INDUCTION TEST
>>
>> # Generate a recursive induction example of given size; it makes rules
>> # p(n+1) if p(n),q(n+1)
>> # and
>> # q(n+1) if p(n), q(n)
>> # for n ranging in [0...size], and adds facts p(0) and q(0)
>>
>> induction() {
>> local n=${1:-10}
>> echo '% Problem size: '$n
>> for ((i=0; i<$n; i++))
>> do
>> let j=$i+1
>> echo 'p('$j') :- p('$i'), q('$j').'
>> echo 'q('$j') :- p('$i'), q('$i').'
>> done
>> echo 'p(0).'
>> echo 'q(0).'
>> echo 'p(X)?'
>> }
>>
>> # REACHABLE TEST
>>
>> # Generate a graph example of given size. It produces a cyclic graph
>> # with vertices in [0...size-1] and edges from i to i+1 mod size. The
>> # single rule computes a transitive closure of the graph, the
>> # predicate reachable() describes a clique of size size.
>>
>> reachable() {
>> local n=${1:-10}
>> echo '% Problem size: '$n
>> echo 'reachable(X,Y) :- edge(X,Y).'
>> echo 'reachable(X,Y) :- edge(X,Z), reachable(Z,Y).'
>> for ((i=0; i<$n; i++))
>> do
>> let j=$i+1
>> echo 'edge('$i', '$j').'
>> done
>> echo 'edge('$n', 0).'
>> echo 'reachable(X,Y)?'
>> }
>>
>> printf "\tLua vs. OCaml Datalog Performance\n\n"
>> printf "\tElapsed Time\tMax Resident\n"
>>
>> for i in ${TESTS}
>> do
>> echo
>> echo induction $i
>> echo -n Lua
>> induction $i | /usr/bin/time $DATALOG -o /dev/null
>> echo -n OCaml
>> induction $i | /usr/bin/time ./datalog -o /dev/null
>> done
>>
>> for i in ${TESTS}
>> do
>> echo
>> echo reachable $i
>> echo -n Lua
>> reachable $i | /usr/bin/time $DATALOG -o /dev/null
>> echo -n OCaml
>> reachable $i | /usr/bin/time ./datalog -o /dev/null
>> done
>>
>>
>