diff options
author | murphy <murphy@rubychan.de> | 2011-06-11 17:37:58 +0000 |
---|---|---|
committer | murphy <murphy@rubychan.de> | 2011-06-11 17:37:58 +0000 |
commit | ff6ae481c2a20d66251d9af1c208ee0b23a5d4b4 (patch) | |
tree | 054f854d52a1e2c0938decf7b6c49ca6e7ddabc5 /etc/multicore/multi-slice.rb | |
parent | 699d9f3e788abd996b16bef6c30c90660b6efebe (diff) | |
download | coderay-ff6ae481c2a20d66251d9af1c208ee0b23a5d4b4.tar.gz |
multicore benchmarks are at https://github.com/rubychan/stringscanner-benchmarks
Diffstat (limited to 'etc/multicore/multi-slice.rb')
-rw-r--r-- | etc/multicore/multi-slice.rb | 161 |
1 files changed, 0 insertions, 161 deletions
diff --git a/etc/multicore/multi-slice.rb b/etc/multicore/multi-slice.rb deleted file mode 100644 index 33b8cd6..0000000 --- a/etc/multicore/multi-slice.rb +++ /dev/null @@ -1,161 +0,0 @@ -require 'strscan' -require 'benchmark' -require 'thread' - -class Scanner < StringScanner - - def initialize code - super code - end - - def tokenize encoder = Tokens.new - scan_tokens encoder - encoder - end - -protected - - def scan_tokens encoder - until eos? - if matched = scan(/ +/) - encoder.text_token matched, :space - elsif matched = scan(/\n/) - encoder.text_token matched, :space - elsif matched = scan(/!/) - encoder.text_token matched, :not_going_to_happen - elsif matched = scan(/=/) #/ - encoder.text_token matched, :not_going_to_happen - elsif matched = scan(/%/) - encoder.text_token matched, :not_going_to_happen - elsif matched = scan(/\d+/) - encoder.text_token matched, :number - elsif matched = scan(/\w+/) - encoder.text_token matched, :word - elsif matched = scan(/[,.]/) - encoder.text_token matched, :op - elsif scan(/\(/) - encoder.begin_group :par - elsif scan(/\)/) - encoder.end_group :par - else - raise - end - end - end - -end - - -class Tokens < Array - alias token push - alias text_token push - alias block_token push - def begin_group kind; push :begin_group, kind end - def end_group kind; push :end_group, kind end -end - - -class Encoder - - def setup - @out = '' - @opened = [] - end - - def finish - @out - end - - def encode scanner - setup - scanner.tokenize self - finish - end - - # def token content, kind - # if content.is_a? ::String - # text_token content, kind - # elsif content.is_a? ::Symbol - # block_token content, kind - # else - # raise 'Unknown token content type: %p' % [content] - # end - # end - - def text_token text, kind - # @out << - # if kind == :space - # text - # else - # text.gsub!(/[)\\]/, '\\\\\0') # escape ) and \ - # "#{kind}(#{text})" - # end - end - - # def block_token action, kind - # case action - # when :begin_group - # begin_group kind - # when :end_group - # end_group kind - # else - # raise - # end - # end - - def begin_group kind - # @opened << kind - # @out << "#{kind}<" - end - - def end_group kind - # @opened.pop - # @out << '>' - end - -end - -size = ((ARGV.first || 1).to_f * 1_000_000).to_i # size - -# generate string -code = "2011 alpha, beta, (gamma), delta.\n" -code *= (size.to_f / code.size).ceil -code.slice! size..-1 - -slice_size = (ARGV[1] || 100).to_i -N = 1 - -100.times do - out = Encoder.new.encode(Scanner.new(code)) -end - -1000.times do -2.times do - threads = [] - seconds = Benchmark.realtime do N.times do - chunk_offsets = [0] - code.lines.each_slice slice_size do |lines| - chunk_offsets << chunk_offsets.last + lines.join.bytesize - end - threads.clear - chunk_offsets.each_cons(2) do |this_chunk, next_chunk| - threads << Thread.new do - Thread.current[:out] = Encoder.new.encode Scanner.new(code[this_chunk...next_chunk]) - end - end - threads.each(&:join) - out = threads.map { |t| t[:out] }.join - end end - - mb = N * size / 1_000_000.0 - puts 'Multi-Threaded: %0.1f MB in %0.2fs = %0.1f MB/s @ %d threads' % [mb, seconds, mb / seconds, threads.size] -end -2.times do - seconds = Benchmark.realtime do N.times do - out = Encoder.new.encode(Scanner.new(code)) - end end - - mb = N * size / 1_000_000.0 - puts 'Single-Threaded: %0.1f MB in %0.2fs = %0.1f MB/s' % [mb, seconds, mb / seconds] -end -end
\ No newline at end of file |