# New Ticket Created by Leopold Toetsch
# Please include the string: [perl #17495]
# in the subject line of all future correspondence about this issue.
# <URL: http://rt.perl.org/rt2/Ticket/Display.html?id=17495 >
Appended patch is somewhat experimental and needs probably a configure
test for the availability of nested functions, and I don't know the
influence on other platforms/compilers (mine is i386-linux/gcc 2.95.2).
Anyway here is what happens:
Computed goto is the fastest dispatcher and the default runmode, if the
C compiler supports it.
Profiling e.g. life shows, that most time is spent in trace_system_stack:
14.42 1.23 0.46 5575 0.08 0.09 trace_system_stack
^^^^
(Total runtime 3.19 secs)
Now, trace_system_stack walks a ~1300 entries deeper stack in CGoto
run mode, because of the jump table in cg_core. Don't ask me about this
difference to 900 ops, gdb says so.
Attached patch now sets interpreter->lo_var_ptr beyond this jump table,
reducing the time of trace_system_stack to 0.04s for above case.
The following test shows a +10% speed increase:
With patch:
$ perl6 -k ../../examples/assembly/life.pasm
5000 generations in 30.183968 seconds. 165.650851 generations/sec
A total of 578912 bytes were allocated
A total of 42743 DOD runs were made
A total of 33 collection runs were made
Copying a total of 535056 bytes
There are 24 active Buffer structs
There are 1024 total Buffer structs
[lt@thu8:~/src/parrot-leo/languages/perl6]
Without patch:
$ perl6 -k ../../examples/assembly/life.pasm
5000 generations in 34.604442 seconds. 144.490121 generations/sec
A total of 578912 bytes were allocated
A total of 42924 DOD runs were made
A total of 33 collection runs were made
Copying a total of 535056 bytes
There are 25 active Buffer structs
There are 1024 total Buffer structs
leo
-- attachment 1 ------------------------------------------------------
url: http://rt.perl.org/rt2/attach/38261/31102/23f109/cgoto.patch
--- parrot/ops2cgc.pl Thu Jul 11 10:25:47 2002
+++ parrot-leo/ops2cgc.pl Sun Sep 22 18:42:28 2002
@@ -158,6 +158,14 @@
print SOURCE <<END_C;
NULL
};
+/* #ifdef HAVE_NESTED_FUNC */
+ static void _check(void);
+ static void _check(void) {
+ int lo_var_ptr;
+ interpreter->lo_var_ptr = (void*)&lo_var_ptr;
+ }
+ _check();
+/* #endif */
goto *ops_addr[*cur_opcode];