SlideShare ist ein Scribd-Unternehmen logo
1 von 50
Downloaden Sie, um offline zu lesen
Rationalを(もうちょっと)最適化してみた
斎藤ただし Tadashi Saito
Asakusa.rb
●
作業の歴史
●
過去のLT復習
●
最適化終了後の成果
●
とっても速い話
●
まとめ
御品書
(もうちょっと)?
●
RubyKaigi 2015のLTで最初の発表
斎藤のRational(C拡張)最適化の歴史
●
2015年度Ruby Association助成金プロジェクトに応募
●
採択、CRuby本体へのマージを目指して作業
●
RubyKaigi 2015のLTで中間発表
●
なんとかギリギリ2016年末のRuby 2.4に入った
●
mrknさん & 関係コミッター皆さんのおかげ
●
そして今日のTalk
ふりかえってみる
●
まずRubyKaigi 2015のスライドを(ざっくり)
復習
●
LTを引用するのでスライドのスピードが
上がります
Rational
有理数ライブ
ラリ
1
2
+
2
3
=?
Floatでは表現
できない(有限
精度、2進数)
BigDecimalで
も表現できない
(物理メモリは
有限)
Rational
1/2r + 2/3r
1/2r + 2/3r
#=> (7/6)
直感的な結果
Ruby 1.0か
ら存在
注: rational.rb
原作者&メンテナー
今日いらっしゃる石塚さん
(大きな拍手)
Ruby 1.9で
組み込みクラ
スに
Ruby 1.9.2で
はTimeの内部
表現に使用
Ruby 2.1で
はリテラルが
導入(1/2r)
どんどん重要
なクラスに
それほど速く
ない
rb_funcall()
C拡張なのに
Rubyレベルのメ
ソッド呼び出し
をしている
●
移植スピード?
●
Cで多態を実装する
のが大変だった?
Rubyレベルのメ
ソッド呼び出し
が存在していた
prof(1)でプ
ロファイルを
取ってみる
rb_funcall()
がたくさんの
時間を消費
Cレイヤーのみで
の素直な計算で置
き換えたい
Ruby
Association 助
成金プロジェク
トに応募
http://www.ruby.or.jp/ja/news/20150803.html
Ruby
Association 助
成金プロジェク
トに採択!!1
http://www.ruby.or.jp/ja/news/20151116.html
●
2015-10-30 採択結果の公表
●
2016-1-4 中間報告
●
2016-3-4 最終報告
●
2015-10-30 採択結果の公表
← HERE! #ragrant2015
●
2016-1-4 中間報告
●
2016-3-4 最終報告
どのくらい速く
なったか?
(作業中)
Integer#gcd +
+
huge
rational
+
float
+
fixnum
+
bignum -
- huge
rational
- float
- fixnum
- bignum *
* huge
rational
* float
* fixnum
* bignum /
/ float
/ huge
rational
/ fixnum
/ bignum
0.000
0.500
1.000
1.500
2.000
2.500
3.000
3.500
4.000
f
a
s
t
e
r
最大で3倍以上
速くなった!
Ruby 3x3!!!
復習おしまい
●
ここまでがRubyKaigi 2015時点での成果
●
スライドのスピードが落ちます
その後
●
2016年3月にRuby Association助成金プロジェ
クト最終報告を提出(終了)
●
バグを潰しつつBTSにissueを登録、色々あり
つつマージされる
●
2016年クリスマスにRuby 2.4.0リリース
●
作業の成果は既に皆さんの手元に
最終的には
●
どこまで速くなったか?
●
リリース済みの2.3.3 と2.4.0で比較
2.3.3 vs 2.4.0(比)
分かること
●
最大で3.6倍前後の高速化
●
手を入れた部分全体の平均でも1.6倍弱の
高速化
●
60メソッド(場合分け)の広範囲で高速化
●
触った部分でとても遅くなった所はなかった
広範囲の高速化の方法
●
基本的にrb_funcall()を置き換えただけ
●
引数を伴う場合(Rational.+(Integer)など)、
地道にクラスの数だけ場合分け
– 忘れると即SEGV
●
クラスに応じた関数を直に呼び出し
– 必要なら既存関数をexport
なんで一部だけ3倍以上も速く?
●
rb_funcall()の置き換えに加えて
●
約分の回避
●
既存の有理数関数を利用するため、(整数)を
(整数/1)という有理数として足し算・引き算していた
●
約分が可能か? チェックが毎回走る
●
最初から自力で通分して回避
グラフその2
とても速い(?)
●
140倍近く速い(?)
●
ところでベンチマークの方法
●
1秒間全力で計算を繰り返す
●
それを5回やる
●
全体では5秒ちょっとかかる、はず
実行の様子
とても速い(?)
●
なぜ……
2.4.0のバグでした
●
Bug #13084: String cast to Rational on 2.4.0p0 results in
SegFault with Mathn required
●
実行途中でSEGV…… (String#to_r)
●
�
●
気づくとn0kadaさんが直してくださった
●
報告から9時間でfix (!)
●
mathnとRationalを使う人は2.4.1に期待
まとめ
●
斎藤のRational最適化は無事終了
●
2.4.0でマージ
●
60パターンの広範囲で、最大3倍超・
平均1.6倍速の高速化
●
うっかり入ったバグは2.4.1で直ります
● �
Questions?

Weitere ähnliche Inhalte

Ähnlich wie Rationalを(もうちょっと)最適化してみた

rablについてざっくりだけ調べてみた #shinjukurb 新宿rb 41th
rablについてざっくりだけ調べてみた #shinjukurb 新宿rb 41thrablについてざっくりだけ調べてみた #shinjukurb 新宿rb 41th
rablについてざっくりだけ調べてみた #shinjukurb 新宿rb 41thKoichiro Sumi
 
Rk10trailer
Rk10trailerRk10trailer
Rk10trailermseki
 
いわみくとMeetup第15回
いわみくとMeetup第15回いわみくとMeetup第15回
いわみくとMeetup第15回Satomi Tsujita
 
Ruby開発の現場を支える技術
Ruby開発の現場を支える技術Ruby開発の現場を支える技術
Ruby開発の現場を支える技術hiroponz
 
Ruby on Rails を用いたWEBアプリケーションの開発
Ruby on Rails を用いたWEBアプリケーションの開発Ruby on Rails を用いたWEBアプリケーションの開発
Ruby on Rails を用いたWEBアプリケーションの開発Koichi Shimozono
 
RubyとRのおいしい関係
RubyとRのおいしい関係RubyとRのおいしい関係
RubyとRのおいしい関係sady_nitro
 
RubyKaigi2011の雰囲気
RubyKaigi2011の雰囲気RubyKaigi2011の雰囲気
RubyKaigi2011の雰囲気Sea Mountain
 
RakSulのInternal API開発で gRPCを導入した話
RakSulのInternal API開発で gRPCを導入した話RakSulのInternal API開発で gRPCを導入した話
RakSulのInternal API開発で gRPCを導入した話nixiesan
 
Tokyurubykaigi05
Tokyurubykaigi05Tokyurubykaigi05
Tokyurubykaigi05yamanekko
 
るりまの1/nはMatsue.rbでできています。
るりまの1/nはMatsue.rbでできています。るりまの1/nはMatsue.rbでできています。
るりまの1/nはMatsue.rbでできています。Sho Hashimoto
 
20130615 組込みの仕事場でRubyを使う
20130615 組込みの仕事場でRubyを使う20130615 組込みの仕事場でRubyを使う
20130615 組込みの仕事場でRubyを使うRyo Nagai
 
Ruby ビジネス創出展 Ruby初心者向けプログラミングセミナー
Ruby ビジネス創出展 Ruby初心者向けプログラミングセミナーRuby ビジネス創出展 Ruby初心者向けプログラミングセミナー
Ruby ビジネス創出展 Ruby初心者向けプログラミングセミナーTomoya Kawanishi
 
6時間と36 X日でここまでできた!Microsoft Robotics Studioを用いてライントレースロボットにリベンジ
6時間と36 X日でここまでできた!Microsoft Robotics Studioを用いてライントレースロボットにリベンジ6時間と36 X日でここまでできた!Microsoft Robotics Studioを用いてライントレースロボットにリベンジ
6時間と36 X日でここまでできた!Microsoft Robotics Studioを用いてライントレースロボットにリベンジasa88
 
Rails templateで開発の初速を上げよう
Rails templateで開発の初速を上げようRails templateで開発の初速を上げよう
Rails templateで開発の初速を上げよう豊明 尾古
 
Resemaraを支えた技術 フライングゲットガチャの舞台裏 #ksgstudy #ドリコム
Resemaraを支えた技術 フライングゲットガチャの舞台裏 #ksgstudy #ドリコムResemaraを支えた技術 フライングゲットガチャの舞台裏 #ksgstudy #ドリコム
Resemaraを支えた技術 フライングゲットガチャの舞台裏 #ksgstudy #ドリコムGo Sueyoshi (a.k.a sue445)
 
RubyKaigi Lightning Talks TwYM episode2
RubyKaigi Lightning Talks TwYM episode2RubyKaigi Lightning Talks TwYM episode2
RubyKaigi Lightning Talks TwYM episode2Kuniaki Igarashi
 
SpockからRSpecにきたときの気づき #coedorb
SpockからRSpecにきたときの気づき #coedorbSpockからRSpecにきたときの気づき #coedorb
SpockからRSpecにきたときの気づき #coedorbYoutarou TAKAHASHI
 
Railsチュートリアル(second)を終えて
Railsチュートリアル(second)を終えてRailsチュートリアル(second)を終えて
Railsチュートリアル(second)を終えてHirata Tomoko
 
Sidekiq Proを1年ほど使ってみて良かったところ、困ったところ | 新宿.rb 29th #shinjukurb
Sidekiq Proを1年ほど使ってみて良かったところ、困ったところ | 新宿.rb 29th #shinjukurbSidekiq Proを1年ほど使ってみて良かったところ、困ったところ | 新宿.rb 29th #shinjukurb
Sidekiq Proを1年ほど使ってみて良かったところ、困ったところ | 新宿.rb 29th #shinjukurbKoichiro Sumi
 

Ähnlich wie Rationalを(もうちょっと)最適化してみた (20)

rablについてざっくりだけ調べてみた #shinjukurb 新宿rb 41th
rablについてざっくりだけ調べてみた #shinjukurb 新宿rb 41thrablについてざっくりだけ調べてみた #shinjukurb 新宿rb 41th
rablについてざっくりだけ調べてみた #shinjukurb 新宿rb 41th
 
Rk10trailer
Rk10trailerRk10trailer
Rk10trailer
 
いわみくとMeetup第15回
いわみくとMeetup第15回いわみくとMeetup第15回
いわみくとMeetup第15回
 
Ruby開発の現場を支える技術
Ruby開発の現場を支える技術Ruby開発の現場を支える技術
Ruby開発の現場を支える技術
 
Ruby on Rails を用いたWEBアプリケーションの開発
Ruby on Rails を用いたWEBアプリケーションの開発Ruby on Rails を用いたWEBアプリケーションの開発
Ruby on Rails を用いたWEBアプリケーションの開発
 
RubyとRのおいしい関係
RubyとRのおいしい関係RubyとRのおいしい関係
RubyとRのおいしい関係
 
RubyKaigi2011の雰囲気
RubyKaigi2011の雰囲気RubyKaigi2011の雰囲気
RubyKaigi2011の雰囲気
 
RakSulのInternal API開発で gRPCを導入した話
RakSulのInternal API開発で gRPCを導入した話RakSulのInternal API開発で gRPCを導入した話
RakSulのInternal API開発で gRPCを導入した話
 
Tokyurubykaigi05
Tokyurubykaigi05Tokyurubykaigi05
Tokyurubykaigi05
 
るりまの1/nはMatsue.rbでできています。
るりまの1/nはMatsue.rbでできています。るりまの1/nはMatsue.rbでできています。
るりまの1/nはMatsue.rbでできています。
 
20130615 組込みの仕事場でRubyを使う
20130615 組込みの仕事場でRubyを使う20130615 組込みの仕事場でRubyを使う
20130615 組込みの仕事場でRubyを使う
 
Ruby ビジネス創出展 Ruby初心者向けプログラミングセミナー
Ruby ビジネス創出展 Ruby初心者向けプログラミングセミナーRuby ビジネス創出展 Ruby初心者向けプログラミングセミナー
Ruby ビジネス創出展 Ruby初心者向けプログラミングセミナー
 
6時間と36 X日でここまでできた!Microsoft Robotics Studioを用いてライントレースロボットにリベンジ
6時間と36 X日でここまでできた!Microsoft Robotics Studioを用いてライントレースロボットにリベンジ6時間と36 X日でここまでできた!Microsoft Robotics Studioを用いてライントレースロボットにリベンジ
6時間と36 X日でここまでできた!Microsoft Robotics Studioを用いてライントレースロボットにリベンジ
 
Rails templateで開発の初速を上げよう
Rails templateで開発の初速を上げようRails templateで開発の初速を上げよう
Rails templateで開発の初速を上げよう
 
Resemaraを支えた技術 フライングゲットガチャの舞台裏 #ksgstudy #ドリコム
Resemaraを支えた技術 フライングゲットガチャの舞台裏 #ksgstudy #ドリコムResemaraを支えた技術 フライングゲットガチャの舞台裏 #ksgstudy #ドリコム
Resemaraを支えた技術 フライングゲットガチャの舞台裏 #ksgstudy #ドリコム
 
RubyKaigi Lightning Talks TwYM episode2
RubyKaigi Lightning Talks TwYM episode2RubyKaigi Lightning Talks TwYM episode2
RubyKaigi Lightning Talks TwYM episode2
 
SpockからRSpecにきたときの気づき #coedorb
SpockからRSpecにきたときの気づき #coedorbSpockからRSpecにきたときの気づき #coedorb
SpockからRSpecにきたときの気づき #coedorb
 
Railsチュートリアル(second)を終えて
Railsチュートリアル(second)を終えてRailsチュートリアル(second)を終えて
Railsチュートリアル(second)を終えて
 
mrubyのすすめ
mrubyのすすめmrubyのすすめ
mrubyのすすめ
 
Sidekiq Proを1年ほど使ってみて良かったところ、困ったところ | 新宿.rb 29th #shinjukurb
Sidekiq Proを1年ほど使ってみて良かったところ、困ったところ | 新宿.rb 29th #shinjukurbSidekiq Proを1年ほど使ってみて良かったところ、困ったところ | 新宿.rb 29th #shinjukurb
Sidekiq Proを1年ほど使ってみて良かったところ、困ったところ | 新宿.rb 29th #shinjukurb
 

Mehr von Tadashi Saito

From String#undump to String#unescape
From String#undump to String#unescapeFrom String#undump to String#unescape
From String#undump to String#unescapeTadashi Saito
 
Rationalを最適化してみた
Rationalを最適化してみたRationalを最適化してみた
Rationalを最適化してみたTadashi Saito
 
Ruby本から読み解くRuby考古学 - Ruby Archaeology from the Ruby Book
Ruby本から読み解くRuby考古学 - Ruby Archaeology from the Ruby BookRuby本から読み解くRuby考古学 - Ruby Archaeology from the Ruby Book
Ruby本から読み解くRuby考古学 - Ruby Archaeology from the Ruby BookTadashi Saito
 
拡張ライブラリを作るとリア充
拡張ライブラリを作るとリア充拡張ライブラリを作るとリア充
拡張ライブラリを作るとリア充Tadashi Saito
 
次世代数値演算 ライブラリ Decimal という再発明の意義
次世代数値演算 ライブラリ Decimal という再発明の意義次世代数値演算 ライブラリ Decimal という再発明の意義
次世代数値演算 ライブラリ Decimal という再発明の意義Tadashi Saito
 

Mehr von Tadashi Saito (6)

From String#undump to String#unescape
From String#undump to String#unescapeFrom String#undump to String#unescape
From String#undump to String#unescape
 
Rationalを最適化してみた
Rationalを最適化してみたRationalを最適化してみた
Rationalを最適化してみた
 
Ruby本から読み解くRuby考古学 - Ruby Archaeology from the Ruby Book
Ruby本から読み解くRuby考古学 - Ruby Archaeology from the Ruby BookRuby本から読み解くRuby考古学 - Ruby Archaeology from the Ruby Book
Ruby本から読み解くRuby考古学 - Ruby Archaeology from the Ruby Book
 
詳解! Decimal
詳解! Decimal詳解! Decimal
詳解! Decimal
 
拡張ライブラリを作るとリア充
拡張ライブラリを作るとリア充拡張ライブラリを作るとリア充
拡張ライブラリを作るとリア充
 
次世代数値演算 ライブラリ Decimal という再発明の意義
次世代数値演算 ライブラリ Decimal という再発明の意義次世代数値演算 ライブラリ Decimal という再発明の意義
次世代数値演算 ライブラリ Decimal という再発明の意義
 

Rationalを(もうちょっと)最適化してみた