Dan Sugalski wrote:

[ this came up WRT calling conventions ]

I assume he's doing bsr/ret to get into and out of the sub, which is going to be significantly faster.

Who says that?

As already stated, I don't consider these as either light-weight nor faster. Here is a benchmark.

Below are 2 version of a recursive factorial program. fact(100) is calculated 1000 times:

PIR           1.1 s
bsr/ret       2.4 s
PIR/tailcall  0.2s

Unoptimized Parrot, default i.e. slow run core.

leo
.sub optc @IMMEDIATE
    # TODO turn on -Oc
    # print "optc\n"
.end
.sub _main @MAIN
    .param pmc argv
    .local pmc count, product
    .local float start, end
    count = new PerlInt
    count = 1000
    .local int argc
    argc = elements argv
    if argc < 2 goto def
    $S0 = argv[1]
    count = $S0
def:
    .local int i
    i = 0
    start = time
    .local pmc n
loop:
    n = clone count
    product = new PerlInt
    product = 1
    product = _fact(product, n)
    inc i
    if i < 1000 goto loop
    end = time
    end -= start
     print product
     print "\n"
    print end
    print "\n"
.end
.sub _fact
   .param pmc product
   .param pmc count
   if count > 1 goto recurs
   .return (product)
recurs:
   product *= count
   dec count
   product = _fact(product, count)
   .return (product)
.end

.sub optc @IMMEDIATE
    # TODO turn on -Oc
    # print "optc\n"
.end
.sub _main @MAIN
    .param pmc argv
    .local pmc count, product
    .local float start, end
    count = new PerlInt
    count = 1000
    .local int argc
    argc = elements argv
    if argc < 2 goto def
    $S0 = argv[1]
    count = $S0
def:
    .local int i
    i = 0
    start = time
    .local pmc n
loop:
    n = clone count
    product = new PerlInt
    product = 1
    save n
    save product
    bsr fact
    restore product
    inc i
    if i < 1000 goto loop
    end = time
    end -= start
    print product
    print "\n"
    print end
    print "\n"
    goto ex

fact:
    saveall
    .local pmc product, count
    restore product
    restore count
    if count > 1 goto recurs
    restoreall
    save product
    ret
recurs:
    product *= count
    dec count
    save count
    save product
    bsr fact
    restore product
    restoreall
    save product
    ret
ex:
.end

Reply via email to