Sergey Martynoff wrote:
I'm attaching a new test file you can run along with a file of benchmarks.

It was a good idea to benchmark the sub. At least it is obvious
now, that replacement without backreferences should be handles
separately, the simplest way. I ran the benchmark on my windows
pc, and get similar (even more contrast) results.

Totals:
                                      Rate      replace_andy
replace_andy                  13224/s           --
replace_andy_with_patch 20224/s          53%
replace_josh_new2          27434/s         107%


I don't think using no strict 'refs' is a big trouble (at least it
is used quite often in so many modules), so IMO josh_new2 may be a
good candidate.

Yeah, the main downside of josh_new2 is that we store the matches for each match iteration. So if we had a file like:
("a" x 5_000_000 . 'q') x 5
and did a replace like:
s/(a+q)/$1bc/g
then we'd store at least 5 million bytes in the hash causing that much of an increase in memory. (Probably more/double with different character encodings and such.) With the replace_andy(/paul) versions, they pull the data from the string already in memory. It's the classic memory vs CPU trade-off. If we're worried about multi-megabyte matches, then I think it might be best to go with 'replace_andy_with_patch' which shows 'decent' average rates everywhere without using as much memory.

I do have one other idea I'm going to try out and see if it will work or not. I'll post that tomorrow if it pans out.

It's amazing how dog slow replacement gets when implemented in Perl. :P

-- Josh

_______________________________________________
templates mailing list
[email protected]
http://lists.template-toolkit.org/mailman/listinfo/templates

Reply via email to