Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.
RubyKaigi 2007 SessionC                      Ruby    An Example of Ruby Program Faster Than C                  makoto kuwa...
…copyright(c) 2007 kuwata-lab.com all rights reserved.
2007         Script Languages in 2007       copyright(c) 2007 kuwata-lab.com all rights reserved.
PS3         Break Away from PS3 Syndrome‣ PS3/PSP …  •‣ Wii/DS …  •           copyright(c) 2007 kuwata-lab.com all rights ...
Script Languages cant be Center Player‣                                                                 Java    • Java    ...
Problems and Truth about Script Languages✓✓✓           copyright(c) 2007 kuwata-lab.com all rights reserved.
About This Presentationcopyright(c) 2007 kuwata-lab.com all rights reserved.
Point                      ≠Language Speed ≠ Application Speed      copyright(c) 2007 kuwata-lab.com all rights reserved.
Overview‣   :‣   : C                       Ruby‣   : eRuby‣   :                    C        ≦                             ...
Conclusion‣    •‣    •        copyright(c) 2007 kuwata-lab.com all rights reserved.
eRuby     Introduction to eRuby copyright(c) 2007 kuwata-lab.com all rights reserved.
eRuby                       What is eRuby?‣   eRuby (Embedded Ruby) …                                           Ruby      ...
Example<table> <tbody><% for item in list %>  <tr>    <td><%= item %></td>  </tr><% end %> </tbody>            <% ... ... ...
C         eruby        Ruby Script Translated by erubyprint "<table>n"print " <tbody>n" for item in list ; print "n"print ...
ERB              Ruby Script Translated by ERB_erbout = ""; _erbout.concat "<table>n"_erbout.concat " <tbody>n" for item i...
Output Example<table> <tbody>  <tr>    <td>AAA</td>  </tr>  <tr>    <td>BBB</td>  </tr>  <tr>    <td>CCC</td>  </tr> </tbo...
Benchmark Environment                                              1: <html>‣ 400                                         ...
Benchmark Result50.037.525.012.5  0       C     eruby                                         ERB           copyright(c) 2...
#1:MyEruby#1: First Implementation  copyright(c) 2007 kuwata-lab.com all rights reserved.
#1:            #1: First Implementation ### Program   input.each_line do |line|      line.scan(/(.*?)(<%=?|%>)/) do       ...
#1:                                                      (2)           #1: First Implementation (2)                       ...
#1:                    #1: Benchmark Result100 75 50 25  0      C     eruby                      ERB                      ...
#2:       #2: Never Split Into Lines      copyright(c) 2007 kuwata-lab.com all rights reserved.
#2:           #2: Never Split into Lines## Before  input.each_line do |line|    line.scan(/(.*?)(<%=?|%>)/).each do      ....
#2:                                                               (2)         #2: Never Split into Lines (2)              ...
#2:                          #2: Benchmark Result100 75 50 25  0      C    eruby             ERB                  MyEruby1...
#2:                  #2: Benchmark Result201510 5 0       C      eruby                                    MyEruby2        ...
#3:  #3: Replace Parsing with Pattern Matching         copyright(c) 2007 kuwata-lab.com all rights reserved.
#3:       #3: Replace Parsing with Pattern Matching## Beforeinput.scan(/(.*?)(<%=?|%>)/m) do  case $2  when <%= ; kind = :...
#3:                   #3: Benchmark Result201510 5 0      C    eruby                 MyEruby2                            M...
#4:      #4: Tune Up Regular Expressions        copyright(c) 2007 kuwata-lab.com all rights reserved.
#4:         #4: Tune Up Regular Expressions## Beforeinput.scan(/(.*?)<%(=)?(.*?)%>/m) do  text, equal, code = $1, $2, $3  ...
#4:                      #4: Benchmark Result201510 5 0     C    eruby       MyEruby2                 MyEruby3            ...
#5:  #5: Inline Expansion of Method Call      copyright(c) 2007 kuwata-lab.com all rights reserved.
#5:        #5: Inline Expansion of Method Call### Before    ...    s << _convert_str(code, :expr)    s << _convert_str(cod...
#5:                      #5: Benchmark Result201510 5 0     C    eruby MyEruby2           MyEruby3            MyEruby4    ...
#6:                 #6: Array Buffer      copyright(c) 2007 kuwata-lab.com all rights reserved.
#6:                       #6: Array Buffer                                                                      Ruby### Be...
#6:                      #6: Benchmark Result201510 5 0           by                       2                              ...
#7:          #7: Interpolationcopyright(c) 2007 kuwata-lab.com all rights reserved.
#7:                   #7: Interpolation                                                                  Ruby### Before_bu...
#7:                        #7: Benchmark Result201510 5 0             y                    2                              ...
#8:                  #7: File Caching      copyright(c) 2007 kuwata-lab.com all rights reserved.
#8:                      #8: File Caching## Afterdef convert_file(filename, cachename=nil) cachename ||= filename + .cache if...
#8:               #8: Benchmark Result201510 5 0               y               2               3               4          ...
#9:          #7: Make Methods  copyright(c) 2007 kuwata-lab.com all rights reserved.
#9:                      #9: Make Methods### Before prog = myeruby.convert_file(filename) eval prog### After                ...
#9:               #9: Benchmark Result201510 5 0               y               2               3               4          ...
Principles of Tuning                                                                     :##2                   1         ...
Comparison with Competitors Lang                        Solution                              Time(sec)Ruby      eruby    ...
Summarycopyright(c) 2007 kuwata-lab.com all rights reserved.
Result‣C      1.5                    Ruby    •                        2                                    3    •‣    •   ...
Conclusion‣    •‣    •        copyright(c) 2007 kuwata-lab.com all rights reserved.
one more minute...   copyright(c) 2007 kuwata-lab.com all rights reserved.
Erubis             •    ERB             3          eruby              10%             •eRuby        •                     ...
thank youcopyright(c) 2007 kuwata-lab.com all rights reserved.
Upcoming SlideShare
Loading in …5
×

Cより速いRubyプログラム

8,559 views

Published on

RubyKaigi2007 Presentation

Published in: Technology
  • Be the first to comment

Cより速いRubyプログラム

  1. 1. RubyKaigi 2007 SessionC Ruby An Example of Ruby Program Faster Than C makoto kuwata http://www.kuwata-lab.com copyright(c) 2007 kuwata-lab.com all rights reserved.
  2. 2. …copyright(c) 2007 kuwata-lab.com all rights reserved.
  3. 3. 2007 Script Languages in 2007 copyright(c) 2007 kuwata-lab.com all rights reserved.
  4. 4. PS3 Break Away from PS3 Syndrome‣ PS3/PSP … •‣ Wii/DS … • copyright(c) 2007 kuwata-lab.com all rights reserved.
  5. 5. Script Languages cant be Center Player‣ Java • Java • ≠‣ • • copyright(c) 2007 kuwata-lab.com all rights reserved.
  6. 6. Problems and Truth about Script Languages✓✓✓ copyright(c) 2007 kuwata-lab.com all rights reserved.
  7. 7. About This Presentationcopyright(c) 2007 kuwata-lab.com all rights reserved.
  8. 8. Point ≠Language Speed ≠ Application Speed copyright(c) 2007 kuwata-lab.com all rights reserved.
  9. 9. Overview‣ :‣ : C Ruby‣ : eRuby‣ : C ≦ Ruby ≪≪≪≪≪ C copyright(c) 2007 kuwata-lab.com all rights reserved.
  10. 10. Conclusion‣ •‣ • copyright(c) 2007 kuwata-lab.com all rights reserved.
  11. 11. eRuby Introduction to eRuby copyright(c) 2007 kuwata-lab.com all rights reserved.
  12. 12. eRuby What is eRuby?‣ eRuby (Embedded Ruby) … Ruby ( )‣ eRuby … Ruby Ruby • eruby … C • ERB … pure Ruby Ruby1.8 copyright(c) 2007 kuwata-lab.com all rights reserved.
  13. 13. Example<table> <tbody><% for item in list %> <tr> <td><%= item %></td> </tr><% end %> </tbody> <% ... ... %><table> <%= ... ... %> copyright(c) 2007 kuwata-lab.com all rights reserved.
  14. 14. C eruby Ruby Script Translated by erubyprint "<table>n"print " <tbody>n" for item in list ; print "n"print " <tr>n"print " <td>"; print(( item )); print "</td>n"print " </tr>n" end ; print "n"print " </tbody>n" printprint "<table>n" 1 copyright(c) 2007 kuwata-lab.com all rights reserved.
  15. 15. ERB Ruby Script Translated by ERB_erbout = ""; _erbout.concat "<table>n"_erbout.concat " <tbody>n" for item in list ; _erbout.concat "n"_erbout.concat " <tr>n"_erbout.concat " <td>"; _erbout.concat(( item ).to_s);_erbout.concat "</td>n"_erbout.concat " </tr>n" end ; _erbout.concat "n"_erbout.concat " </tbody>n"_erbout.concat "<table>n"_erbout 1 copyright(c) 2007 kuwata-lab.com all rights reserved.
  16. 16. Output Example<table> <tbody> <tr> <td>AAA</td> </tr> <tr> <td>BBB</td> </tr> <tr> <td>CCC</td> </tr> </tbody> :<table> copyright(c) 2007 kuwata-lab.com all rights reserved.
  17. 17. Benchmark Environment 1: <html>‣ 400 ..... : 53 10,000 53: <table> 54: <% for item in list %> 55: <tr>‣ 10 56: <td><%= item[symbol] %></td> 57: <td><%= item[name] %></td>‣ MacOS X 10.4 Tiger ..... 79: </tr> : 17 (CoreDuo 1.83GHz) x20 80: <% end %>‣ Ruby 1.8.6, eruby 1.0.5 81: </table> ..... :5 85: </html> copyright(c) 2007 kuwata-lab.com all rights reserved.
  18. 18. Benchmark Result50.037.525.012.5 0 C eruby ERB copyright(c) 2007 kuwata-lab.com all rights reserved.
  19. 19. #1:MyEruby#1: First Implementation copyright(c) 2007 kuwata-lab.com all rights reserved.
  20. 20. #1: #1: First Implementation ### Program input.each_line do |line| line.scan(/(.*?)(<%=?|%>)/) do case $2 when <% ; ... 1 when <%= ; ... when %> ; ... ... end end ...http://www.kuwata-lab.com/presen/erubybench-1.1.zip copyright(c) 2007 kuwata-lab.com all rights reserved.
  21. 21. #1: (2) #1: First Implementation (2) Ruby### Translated_buf = ""; _buf << "<html>n";_buf << "<body>n" 1_buf << " <table>n" for item in list ; _buf << "n";_buf << " <tr>n"_buf << " <td>"; _buf << (item[name]).to_s;_buf << "</td>n";_buf << " </tr>n"; end ; _buf << "n";... copyright(c) 2007 kuwata-lab.com all rights reserved.
  22. 22. #1: #1: Benchmark Result100 75 50 25 0 C eruby ERB MyEruby1 copyright(c) 2007 kuwata-lab.com all rights reserved.
  23. 23. #2: #2: Never Split Into Lines copyright(c) 2007 kuwata-lab.com all rights reserved.
  24. 24. #2: #2: Never Split into Lines## Before input.each_line do |line| line.scan(/(.*?)(<%=?|%>)/).each do ... end end## After input.scan(/(.*?)(<%=?|%>)/m).each do ... end copyright(c) 2007 kuwata-lab.com all rights reserved.
  25. 25. #2: (2) #2: Never Split into Lines (2) Ruby## Before_buf << "<html>n"_buf << " <body>n"_buf << " <h1>title</h1>n"## After_buf << <html> <body> <h1>title</h1>; copyright(c) 2007 kuwata-lab.com all rights reserved.
  26. 26. #2: #2: Benchmark Result100 75 50 25 0 C eruby ERB MyEruby1 MyEruby2 copyright(c) 2007 kuwata-lab.com all rights reserved.
  27. 27. #2: #2: Benchmark Result201510 5 0 C eruby MyEruby2 copyright(c) 2007 kuwata-lab.com all rights reserved.
  28. 28. #3: #3: Replace Parsing with Pattern Matching copyright(c) 2007 kuwata-lab.com all rights reserved.
  29. 29. #3: #3: Replace Parsing with Pattern Matching## Beforeinput.scan(/(.*?)(<%=?|%>)/m) do case $2 when <%= ; kind = :expr when <% ; kind = :stmt when %> ; kind = :text ...## Afterinput.scan(/(.*?)<%(=?)(.*?)%>/m) do text, equal, code = $1, $2, $3 s << _convert_str(text, :text) s << _convert_str(code, equal=== ? :expr : :stmt) ... copyright(c) 2007 kuwata-lab.com all rights reserved.
  30. 30. #3: #3: Benchmark Result201510 5 0 C eruby MyEruby2 MyEruby3 copyright(c) 2007 kuwata-lab.com all rights reserved.
  31. 31. #4: #4: Tune Up Regular Expressions copyright(c) 2007 kuwata-lab.com all rights reserved.
  32. 32. #4: #4: Tune Up Regular Expressions## Beforeinput.scan(/(.*?)<%(=)?(.*?)%>/m) do text, equal, code = $1, $2, $3 ...## Afterpos = 0input.scan(/<%(=)?(.*?)%>/m) do equal, code = $1, $2 match = Regexp.last_match len = match.begin(0) - pos text = eruby_str[pos, len] pos = match.end(0) ... copyright(c) 2007 kuwata-lab.com all rights reserved.
  33. 33. #4: #4: Benchmark Result201510 5 0 C eruby MyEruby2 MyEruby3 MyEruby4 copyright(c) 2007 kuwata-lab.com all rights reserved.
  34. 34. #5: #5: Inline Expansion of Method Call copyright(c) 2007 kuwata-lab.com all rights reserved.
  35. 35. #5: #5: Inline Expansion of Method Call### Before ... s << _convert_str(code, :expr) s << _convert_str(code, :stmt) s << _convert_str(text, :text) ...### After ... s << "_buf << (#{code}).to_s; " s << "#{code}; " s << "_buf << #{text.gsub(/[]/, &)}; " ... copyright(c) 2007 kuwata-lab.com all rights reserved.
  36. 36. #5: #5: Benchmark Result201510 5 0 C eruby MyEruby2 MyEruby3 MyEruby4 MyEruby5 copyright(c) 2007 kuwata-lab.com all rights reserved.
  37. 37. #6: #6: Array Buffer copyright(c) 2007 kuwata-lab.com all rights reserved.
  38. 38. #6: #6: Array Buffer Ruby### Before_buf = ;_buf << <td>; _buf << (n).to_s; _buf << </td>;_buf### After String#<<_buf = []; 1 Array#push()_buf.push(<td>, n, </td>);_buf.join copyright(c) 2007 kuwata-lab.com all rights reserved.
  39. 39. #6: #6: Benchmark Result201510 5 0 by 2 3 4 5 6 by by by by by u er ru ru ru ru ru yE yE yE yE yE M M M M copyright(c) 2007 kuwata-lab.com all rights reserved. M C
  40. 40. #7: #7: Interpolationcopyright(c) 2007 kuwata-lab.com all rights reserved.
  41. 41. #7: #7: Interpolation Ruby### Before_buf << <tr><td>; _buf << (n).to_s; _buf << </td></tr>; String#<<### After_buf << %Q`<tr><td>#{n}</td> "...str..."</tr>` %Q`...str...` copyright(c) 2007 kuwata-lab.com all rights reserved.
  42. 42. #7: #7: Benchmark Result201510 5 0 y 2 3 4 5 6 7 ub by by by by by by er ru ru ru ru ru ru yE yE yE yE yE yE M M M M M copyright(c) 2007 kuwata-lab.com all rights reserved. M C
  43. 43. #8: #7: File Caching copyright(c) 2007 kuwata-lab.com all rights reserved.
  44. 44. #8: #8: File Caching## Afterdef convert_file(filename, cachename=nil) cachename ||= filename + .cache if or prog = convert(File.read(filename)) (prog) else prog = end return prog Rubyend copyright(c) 2007 kuwata-lab.com all rights reserved.
  45. 45. #8: #8: Benchmark Result201510 5 0 y 2 3 4 5 6 7 8 ub by by by by by by by er ru ru ru ru ru ru ru yE yE yE yE yE yE yE M M M M M M M copyright(c) 2007 kuwata-lab.com all rights reserved. C
  46. 46. #9: #7: Make Methods copyright(c) 2007 kuwata-lab.com all rights reserved.
  47. 47. #9: #9: Make Methods### Before prog = myeruby.convert_file(filename) eval prog### After Ruby def define_method(body, args=[]) eval "def self.evaluate(#{args.join(,)}); #{body}; end" end prog = myeruby.convert_file(filename) args = [list] myeruby.define_method(prog, args) myeruby.evaluate() copyright(c) 2007 kuwata-lab.com all rights reserved.
  48. 48. #9: #9: Benchmark Result201510 5 0 y 2 3 4 5 6 7 8 9 ub by by by by by by by by er ru ru ru ru ru ru ru ru yE yE yE yE yE yE yE yE M M M M M M M M copyright(c) 2007 kuwata-lab.com all rights reserved. C
  49. 49. Principles of Tuning :##2 1 69.17#8 2.44#9 2.26#2 1 4.91#5 2.11#6 Array#push() 0.94#7 0.94#3 4.20#4 2.12 copyright(c) 2007 kuwata-lab.com all rights reserved.
  50. 50. Comparison with Competitors Lang Solution Time(sec)Ruby eruby 15.32 ERB 42.67 MyEruby7 (interporation) 10.42 MyEruby8 (cached) 8.02 MyEruby9 (method) 5.11 Perl Template-Toolkit 26.40Python Django 50.55 Kid (TurboGears) 344.16 Java Jakarta Velocity 13.24 copyright(c) 2007 kuwata-lab.com all rights reserved.
  51. 51. Summarycopyright(c) 2007 kuwata-lab.com all rights reserved.
  52. 52. Result‣C 1.5 Ruby • 2 3 •‣ • Java Ruby copyright(c) 2007 kuwata-lab.com all rights reserved.
  53. 53. Conclusion‣ •‣ • copyright(c) 2007 kuwata-lab.com all rights reserved.
  54. 54. one more minute... copyright(c) 2007 kuwata-lab.com all rights reserved.
  55. 55. Erubis • ERB 3 eruby 10% •eRuby • <% %> • <%= %> HTML escape • YAML • Ruby • (C/Java/PHP/Perl/Scheme/JavaSript) • RoR 30% ( ) copyright(c) 2007 kuwata-lab.com all rights reserved.
  56. 56. thank youcopyright(c) 2007 kuwata-lab.com all rights reserved.

×