From 57255012b71a5dd6d0c4c4fa0681b9d67995226e Mon Sep 17 00:00:00 2001 From: Yorick Peterse Date: Fri, 2 May 2014 00:40:10 +0200 Subject: [PATCH] Patch the Ragel lexer after generating it. This further increases throughput of the lexer. On MRI this seems to save around one second or so. It now sits at ~6,8 seconds in the big XML benchmark. On JRuby, combined with some JIT options and invoke dynamic enabled, this can reduce the average lexing time to around 3,5 seconds. Rubinius, also with a few aggressive JIT options, seems to stick around 9 seocnds. --- task/lexer.rake | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/task/lexer.rake b/task/lexer.rake index 5c5004e..e1b58f8 100644 --- a/task/lexer.rake +++ b/task/lexer.rake @@ -2,6 +2,20 @@ rule '.rb' => '.rl' do |task| Cliver.assert('ragel', '~> 6.7') sh "ragel -F1 -R #{task.source} -o #{task.name}" + + puts "Applying patch http://git.io/ow6e1A to #{task.name}" + + # Patches the lexer based on http://git.io/ow6e1A. + input = File.read(task.source) + output = File.read(task.name) + getkey = input.match(/getkey\s+(.+);/)[1] + + output = output.gsub(getkey, '_wide') + output = output.gsub('_trans = if', "_wide = #{getkey}\n _trans = if") + + File.open(task.name, 'w') do |handle| + handle.write(output) + end end desc 'Generates the lexer'