I would propose, estimate the ops you need and test it :)
I haven't completed testing yet, however it's becoming clear to me that this is likely to be a pointless effort
There are so many variables that can affect performance here that the results I may find in these tests are unlikely to have any relation to the performance of rules in practice.
1. making continuations affects the performance of *other* code (COW)
2. the "let" operation is missing and all attempts to fake it are silly
3. to really test it, I'd need to make subrules full subroutines, but then the performance difference will probably disappear in the overhead of all other stuff. To test I'd need large, realistic patterns; and I'm certainly not in the mood to write PIR for them manually.
And it appears that on my machine continuations and garbage collection have a quarrel, which also makes testing problematic.
I guess the only way to find out is to implement both systems and compare them using a large test set of realistic grammars. Or ofcourse just implement it using continuations (system #1), since the speed difference probably isn't gonna be huge anyway.
Here is my test program for continuation and the results on my machine:
# "aaab" ~~ / ^ [ a | a* ] ab <fail> /
set I5, 1000
sweepoff # or bus error
collectoff # or segmentation fault
begin:
set S0, "aaab"
set I0, 0 new P0, .Continuation
set_addr I1, second
set P0, I1 rx_literal S0, I0, "a", backtrack
branch thirdsecond:
new P0, .Continuation
set_addr I1, fail
set P0, I1deeper:
rx_literal S0, I0, "a", third
save P0 # normally hypothesize
new P0, .Continuation
set_addr I1, unwind
set P0, I1
branch deeper
unwind:
dec I0 # normally de-hypothesize
restore P0 # normally de-hypothesizethird:
rx_literal S0, I0, "ab", backtrack
sub I0, 2 # normally de-hypothesizebacktrack:
invokefail:
dec I5
if I5, begin
endOPERATION PROFILE
CODE OP FULL NAME CALLS TOTAL TIME AVG TIME
----- ------------ ------- ---------- ----------
0 end 1 0.000029 0.000029
40 set_addr_i_ic 5000 0.024928 0.000005
46 set_i_ic 1001 0.010573 0.000011
60 set_s_sc 1000 0.005717 0.000006
66 set_p_i 5000 0.016201 0.000003
213 if_i_ic 1000 0.002848 0.000003
274 dec_i 4000 0.011390 0.000003
370 sub_i_ic 1000 0.004227 0.000004
675 save_p 3000 0.192309 0.000064
682 restore_p 3000 0.246457 0.000082
719 branch_ic 4000 0.012216 0.000003
770 sweepoff 1 0.000014 0.000014
772 collectoff 1 0.000003 0.000003
786 new_p_ic 5000 0.179403 0.000036
819 invoke 5000 0.026285 0.000005
962 rx_literal_s_i_sc_ic 10000 0.054260 0.000005
----- ------------ ------- ---------- ----------
16 48004 0.786861 0.000016iBook; PPC G3; 700 Mhz
-- Matthijs van Duin -- May the Forth be with you!
