Leopold Toetsch <[EMAIL PROTECTED]> writes: > I've stripped down the whole stack code to use one item per chunk. It > passes all tests (3 disabled that push infintely and check for > CHECK_LIMIT and t/pmc/eval_6 which is borken). > > This slows down register saving (and other stack operations) > considerably whithout any additional measures[1]: > > $ perl tools/dev/parrotbench.pl -c=parrotbench.conf -b='^oof' -t > Numbers are cpu times in seconds. (lower is better) > p-j-Oc parr-j parr-C perl-th perl python ruby > oofib 4.150s 11.530s 12.450s 4.100s 3.540s 2.140s 2.170s > > p-j-Oc = parrot -j -Oc where savetop is optimized to pushtopp > parr-j = parrot -j, all 4 registers are saved (both unoptimized build)
Interesting. I redid oofib.imc to only save the registers it cares about rather than using savetop, and here are my numbers (admittedly on a PowerMac G5: parrot parrotj parrotC perl python ruby oofib 3.770s 3.190s 2.950s 2.210s 1.100s 1.770s oofibt 7.750s 7.370s 6.960s 2.210s 1.140s 1.800s oofibt is the original version, oofib is my rewrite (attached). The perl, python & ruby equivalents were generated with a simple copy... For reference, here are the numbers using a CVS fresh parrot: parrot parrotj parrotC perl python ruby oofib 3.770s 3.150s 3.100s 2.210s 1.080s 1.960s oofibt 6.700s 6.240s 6.170s 2.330s 1.040s 1.890s So it looks like saving single registers is a win whichever parrot you're using...
.pcc_sub _main prototyped .param pmc argv .sym int argc argc = argv .sym pmc N N = new PerlInt N = 28 if argc <= 1 goto noarg $S0 = argv[1] N = $S0 noarg: .sym float start time start .local pmc A .local pmc B .local pmc b A = newclass "A" B = subclass A, "B" find_type $I0, "B" b = new $I0 .sym pmc r r = b."fib"(N) .sym float fin time fin print "fib(" print N print ") = " print r print " " sub fin, start print fin print "s\n" end .end .namespace ["A"] .sub fib method .param pmc n if n >= 2 goto rec .pcc_begin_return .return n .pcc_end_return rec: .sym pmc n1 .sym pmc n2 .sym pmc r1 .sym pmc r2 n1 = new PerlInt n2 = new PerlInt n1 = n - 1 n2 = n - 2 P5 = n1 I0 = 1 I1 = 0 I2 = 0 I3 = 1 I4 = 0 S1 = "fibA" save P1 save n2 save self callmethodcc restore self r1 = P5 restore P5 I0 = 1 I1 = 0 I2 = 0 I3 = 1 I4 = 0 S1 = "fibB" save r1 callmethodcc restore r1 restore P1 P5 = P5 + r1 I0 = 1 I1 = 0 I2 = 0 I3 = 1 I4 = 0 invoke P1 end .end .sub fibA method .param pmc n if n >= 2 goto rec .pcc_begin_return .return n .pcc_end_return rec: .sym pmc n1 .sym pmc n2 .sym pmc r1 .sym pmc r2 n1 = n - 1 n2 = n - 2 P5 = n1 I0 = 1 I1 = 0 I2 = 0 I3 = 1 I4 = 0 S1 = "fib" save P1 save n2 save self callmethodcc restore self r1 = P5 restore P5 I0 = 1 I1 = 0 I2 = 0 I3 = 1 I4 = 0 S1 = "fibB" save r1 callmethodcc restore r1 restore P1 P5 = P5 + r1 I0 = 1 I1 = 0 I2 = 0 I3 = 1 I4 = 0 invoke P1 .end .namespace ["B"] .sub fibB method .param pmc n if n >= 2 goto rec .pcc_begin_return .return n .pcc_end_return rec: .sym pmc n1 .sym pmc n2 .sym pmc r1 .sym pmc r2 n1 = new PerlInt n2 = new PerlInt n1 = n - 1 n2 = n - 2 P5 = n1 I0 = 1 I1 = 0 I2 = 0 I3 = 1 I4 = 0 S1 = "fib" save P1 save n2 save self callmethodcc restore self r1 = P5 restore P5 I0 = 1 I1 = 0 I2 = 0 I3 = 1 I4 = 0 S1 = "fibA" save r1 callmethodcc restore r1 restore P1 P5 = P5 + r1 I0 = 1 I1 = 0 I2 = 0 I3 = 1 I4 = 0 invoke P1 .end