狠狠撸

狠狠撸Share a Scribd company logo
CPS & TCO
2016/05/19
0x64 Tales
#08 Func6onal Programming
Livesense Inc.
HORINOUCHI Masato
Con$nua$on-passing style とは
継続渡しスタイル (CPS: Con)nua)on-passing style) とは、プログラ
ムの制御を継続を用いて陽に表すプログラミングスタイルのことで
ある。
継続渡しスタイルで書かれた関数は、通常の直接スタイル (direct
style) のように値を「返す」かわりに、「継続」を引数として陽に受
け取り、その継続に計算結果を渡す。継続とは、関数の計算結果を
受け取るための(一般には元の関数とは別の)関数のことである。
継続渡しスタイル - Wikipedia から引用
factorial (Scheme / direct style)
(define (fact n)
(if (zero? n)
1
(* n (fact (- n 1)))))
(fact 10)
factorial (Scheme / CPS)
(define (fact/cps n cont) # ← 引数 cont が継続
(if (zero? n)
(cont 1)
(fact/cps (- n 1) (lambda (x) (cont (* n x))))))
(fact/cps 10 (lambda (x) x))
factorial (Scheme / direct style / tail recursion)
(define (fact_tail n acc)
(if (zero? n)
acc
(fact_tail (- n 1) (* n acc))))
(fact_tail 10 1)
benchmark result (1,0003mes 1000!)
? non tail call
? 0.767s
? cps
? 0.854s
? tail call
? 0.819s
? まさかの非末尾呼出版が最も速い。
? CPS は呼び出し毎に lambda object 生成するから遅いのかな。
Stack Over?ow (Scheme)
? 各パターンとも 100000! でも Stack Over?ow しない。
? Scheme は末尾呼出最適化を行なうので CPS版と末尾呼出版が
over?ow しないのはわかる。
? 非末尾呼出版でも over?ow しないのは、CPS変換を自動的に行
なっているのだろうか?
factorial (Ruby / direct style / recursion)
def fact(n)
if n == 0
1
else
n * fact(n - 1)
end
end
fact(10)
factorial (Ruby / CPS)
def fact_cps(n, cont)
if n == 0
cont.call 1
else
fact_cps(n - 1, -> (x) { cont.call(n * x) })
end
end
fact_cps(10, -> (x) { x })
factorial (Ruby / direct style / tail recursion)
def fact_tail(n, acc = 1)
if n == 0
acc
else
fact_tail(n - 1, n * acc)
end
end
fact_tail(10)
benchmark
TIMES = 1000
FACT = 1000
Benchmark.bm 16 do |r|
r.report 'non tail call' do
TIMES.times do
fact(FACT)
end
end
r.report 'cps' do
TIMES.times do
fact_cps(FACT, -> (x) { x })
end
end
r.report 'tail call' do
TIMES.times do
fact_tail(FACT)
end
end
end
benchmark result (1,0003mes 1000!)
user system total real
non tail call 0.570000 0.010000 0.580000 ( 0.575446)
cps 1.220000 0.060000 1.280000 ( 1.280935)
tail call 0.650000 0.060000 0.710000 ( 0.705097)
? Scheme版と同様の傾向になった。
Stack Over?ow (Ruby)
? 5000!
? 3パターンとも問題なし
? 10000!
? CPS版が stack level too deep
? 11000!
? 3パターンとも stack level too deep
Tail Call Op)miza)on とは
末尾呼出し最適化とは、末尾呼出しのコードを、戻り先を保存しないジャン
プに変換することによって、スタックの累積を無くし、効率の向上などを図
る手法である。
理論的には、継続渡しによる goto と同等のジャンプ処理では、手続きの呼出
し元の情報を保存する必要がないことに帰着する。この場合 return は goto
の特殊なケースで、ジャンプ先が呼出し元に等しいケースである。末尾最適化
があれば、手続きの再帰を行なう時でも、結果はループと等価な処理手順と
なり、どれほど深い再帰を行なってもスタックオーバーフローを起こさない。
末尾再帰 - Wikipedia から引用
Tail Call Op)miza)on in Ruby
? YARV だとオプションで TCO 有効にできる。
RubyVM::InstructionSequence.compile_option = {
tailcall_optimization: true,
trace_instruction: false
}
benchmark result (1,0003mes 1000! / TCO)
user system total real
non tail call 0.570000 0.010000 0.580000 ( 0.575446)
cps 1.220000 0.060000 1.280000 ( 1.280935)
tail call 0.650000 0.060000 0.710000 ( 0.705097)
↓ TCO on
user system total real
non tail call 0.560000 0.020000 0.580000 ( 0.578095)
cps 1.130000 0.050000 1.180000 ( 1.183501)
tail call 0.640000 0.040000 0.680000 ( 0.688400)
? CPS で約 8%改善、末尾呼出で 4%改善
Stack Over?ow (Ruby / TCO)
? 10000!
? 3パターンとも問題なし
? 11000!
? 非末尾呼出版が stack level too deep
? 12000!
? CPS版が stack level too deep ← なぜ?
? 1000000! まで試したが、末尾呼出版では Stack Over?ow しない (10分かかった)
TCO Problems
? (1) backtrace: Elimina3ng method frame means elimina3ng
backtrace.
? (2) settracefunc(): It is di?cult to probe "return" event for tail-call
methods.
? (3) seman3cs: It is di?cult to de?ne tail-call in document (half is
joking, but half is serious)
Tail call op)miza)on: enable by default? から引用
まとめ
? CPS に置き換えるだけでは速くならない。
? YARV だと TCO 有効化ができる。
? TCO に関係なく 1.upto(FACT).inject(:*) だと Stack
Over?ow しないのはヒミツ。
ご清聴ありがとうございました

More Related Content

What's hot (16)

2011年12月9日
2011年12月9日2011年12月9日
2011年12月9日
nukaemon
?
搁耻产测の御先祖颁尝鲍のお话(原本)
搁耻产测の御先祖颁尝鲍のお话(原本)搁耻产测の御先祖颁尝鲍のお话(原本)
搁耻产测の御先祖颁尝鲍のお话(原本)
洋史 東平
?
Python vs ruby
Python vs rubyPython vs ruby
Python vs ruby
osamunmun
?
C# linq入門 意図編
C# linq入門 意図編C# linq入門 意図編
C# linq入門 意図編
Fujio Kojima
?
Delimited Dynamic Binding
Delimited Dynamic BindingDelimited Dynamic Binding
Delimited Dynamic Binding
Youyou Cong
?
P5utda day3
P5utda day3P5utda day3
P5utda day3
Ryuyu Ishihara
?
痴6で闯滨罢?部分适用?継続
痴6で闯滨罢?部分适用?継続痴6で闯滨罢?部分适用?継続
痴6で闯滨罢?部分适用?継続
7shi
?
20150928楽しい濒补尘产诲补
20150928楽しい濒补尘产诲补20150928楽しい濒补尘产诲补
20150928楽しい濒补尘产诲补
Norifumi Homma
?
JS 6th edition reading circle part 3
JS 6th edition reading circle part 3JS 6th edition reading circle part 3
JS 6th edition reading circle part 3
Teloo
?
みんなで Swift 復習会での談笑用スライド – 4th #minna_de_swift
みんなで Swift 復習会での談笑用スライド – 4th #minna_de_swiftみんなで Swift 復習会での談笑用スライド – 4th #minna_de_swift
みんなで Swift 復習会での談笑用スライド – 4th #minna_de_swift
Tomohiro Kumagai
?
Rubyの御先祖CLUのお話(OSC 2011 Shimane LT 資料)
Rubyの御先祖CLUのお話(OSC 2011 Shimane LT 資料)Rubyの御先祖CLUのお話(OSC 2011 Shimane LT 資料)
Rubyの御先祖CLUのお話(OSC 2011 Shimane LT 資料)
洋史 東平
?
Whole Program Paths 等の紹介@PLDIr#3
Whole Program Paths 等の紹介@PLDIr#3Whole Program Paths 等の紹介@PLDIr#3
Whole Program Paths 等の紹介@PLDIr#3
Masahiro Sakai
?
代数的データ型をラムダ计算の中で表现する方法
代数的データ型をラムダ计算の中で表现する方法代数的データ型をラムダ计算の中で表现する方法
代数的データ型をラムダ计算の中で表现する方法
syamino
?
kagamicomput201707
kagamicomput201707kagamicomput201707
kagamicomput201707
swkagami
?
2011年11月18日
2011年11月18日2011年11月18日
2011年11月18日
nukaemon
?
サイ本読书会4章変数
サイ本読书会4章変数サイ本読书会4章変数
サイ本読书会4章変数
ztyper
?
2011年12月9日
2011年12月9日2011年12月9日
2011年12月9日
nukaemon
?
搁耻产测の御先祖颁尝鲍のお话(原本)
搁耻产测の御先祖颁尝鲍のお话(原本)搁耻产测の御先祖颁尝鲍のお话(原本)
搁耻产测の御先祖颁尝鲍のお话(原本)
洋史 東平
?
C# linq入門 意図編
C# linq入門 意図編C# linq入門 意図編
C# linq入門 意図編
Fujio Kojima
?
Delimited Dynamic Binding
Delimited Dynamic BindingDelimited Dynamic Binding
Delimited Dynamic Binding
Youyou Cong
?
痴6で闯滨罢?部分适用?継続
痴6で闯滨罢?部分适用?継続痴6で闯滨罢?部分适用?継続
痴6で闯滨罢?部分适用?継続
7shi
?
20150928楽しい濒补尘产诲补
20150928楽しい濒补尘产诲补20150928楽しい濒补尘产诲补
20150928楽しい濒补尘产诲补
Norifumi Homma
?
JS 6th edition reading circle part 3
JS 6th edition reading circle part 3JS 6th edition reading circle part 3
JS 6th edition reading circle part 3
Teloo
?
みんなで Swift 復習会での談笑用スライド – 4th #minna_de_swift
みんなで Swift 復習会での談笑用スライド – 4th #minna_de_swiftみんなで Swift 復習会での談笑用スライド – 4th #minna_de_swift
みんなで Swift 復習会での談笑用スライド – 4th #minna_de_swift
Tomohiro Kumagai
?
Rubyの御先祖CLUのお話(OSC 2011 Shimane LT 資料)
Rubyの御先祖CLUのお話(OSC 2011 Shimane LT 資料)Rubyの御先祖CLUのお話(OSC 2011 Shimane LT 資料)
Rubyの御先祖CLUのお話(OSC 2011 Shimane LT 資料)
洋史 東平
?
Whole Program Paths 等の紹介@PLDIr#3
Whole Program Paths 等の紹介@PLDIr#3Whole Program Paths 等の紹介@PLDIr#3
Whole Program Paths 等の紹介@PLDIr#3
Masahiro Sakai
?
代数的データ型をラムダ计算の中で表现する方法
代数的データ型をラムダ计算の中で表现する方法代数的データ型をラムダ计算の中で表现する方法
代数的データ型をラムダ计算の中で表现する方法
syamino
?
kagamicomput201707
kagamicomput201707kagamicomput201707
kagamicomput201707
swkagami
?
2011年11月18日
2011年11月18日2011年11月18日
2011年11月18日
nukaemon
?
サイ本読书会4章変数
サイ本読书会4章変数サイ本読书会4章変数
サイ本読书会4章変数
ztyper
?

Viewers also liked (11)

?Qué flores son apropiadas según la ocasión??Qué flores son apropiadas según la ocasión?
?Qué flores son apropiadas según la ocasión?
Laura Lima
?
17th July 2016 - What is Praye...
17th July 2016 - What is Praye...17th July 2016 - What is Praye...
17th July 2016 - What is Praye...
Thorn Group Pvt Ltd
?
Class 2 in class essay
Class 2 in class essayClass 2 in class essay
Class 2 in class essay
jordanlachance
?
L'interet de comparer des devis avant de créer son site internetL'interet de comparer des devis avant de créer son site internet
L'interet de comparer des devis avant de créer son site internet
Ouelid Sassi
?
Guangzhou yiyun clothing co.,ltd
Guangzhou yiyun clothing co.,ltdGuangzhou yiyun clothing co.,ltd
Guangzhou yiyun clothing co.,ltd
Ivan Lin
?
La FiliaciónLa Filiación
La Filiación
Universidad Fermin Toro de Venezuela Araure
?
Psp%20%28 personal%20software%20process%29Psp%20%28 personal%20software%20process%29
Psp%20%28 personal%20software%20process%29
Luis Angel Robles Aguilar
?
P630i p640i Zebra
P630i p640i ZebraP630i p640i Zebra
P630i p640i Zebra
ScanSource Brasil
?
1 a 15 concept essay workshop
1 a 15 concept essay workshop 1 a 15 concept essay workshop
1 a 15 concept essay workshop
kimpalmore
?
La Juste Dose. Journée Réseau VRAC #3La Juste Dose. Journée Réseau VRAC #3
La Juste Dose. Journée Réseau VRAC #3
Zero Waste France, Cniid
?
?Qué flores son apropiadas según la ocasión??Qué flores son apropiadas según la ocasión?
?Qué flores son apropiadas según la ocasión?
Laura Lima
?
L'interet de comparer des devis avant de créer son site internetL'interet de comparer des devis avant de créer son site internet
L'interet de comparer des devis avant de créer son site internet
Ouelid Sassi
?
Guangzhou yiyun clothing co.,ltd
Guangzhou yiyun clothing co.,ltdGuangzhou yiyun clothing co.,ltd
Guangzhou yiyun clothing co.,ltd
Ivan Lin
?
Psp%20%28 personal%20software%20process%29Psp%20%28 personal%20software%20process%29
Psp%20%28 personal%20software%20process%29
Luis Angel Robles Aguilar
?
1 a 15 concept essay workshop
1 a 15 concept essay workshop 1 a 15 concept essay workshop
1 a 15 concept essay workshop
kimpalmore
?
La Juste Dose. Journée Réseau VRAC #3La Juste Dose. Journée Réseau VRAC #3
La Juste Dose. Journée Réseau VRAC #3
Zero Waste France, Cniid
?

Similar to CPS & CTO (20)

颁辞辩で蝉辫谤颈苍迟蹿
颁辞辩で蝉辫谤颈苍迟蹿颁辞辩で蝉辫谤颈苍迟蹿
颁辞辩で蝉辫谤颈苍迟蹿
Masaki Hara
?
颁辞辩で蝉辫谤颈苍迟蹿
颁辞辩で蝉辫谤颈苍迟蹿颁辞辩で蝉辫谤颈苍迟蹿
颁辞辩で蝉辫谤颈苍迟蹿
Masaki Hara
?
lispmeetup#63 Common Lispでゼロから作るDeep Learning
lispmeetup#63 Common Lispでゼロから作るDeep Learninglispmeetup#63 Common Lispでゼロから作るDeep Learning
lispmeetup#63 Common Lispでゼロから作るDeep Learning
Satoshi imai
?
ji-5. 繰り返し計算
ji-5. 繰り返し計算ji-5. 繰り返し計算
ji-5. 繰り返し計算
kunihikokaneko1
?
闯补惫补セキュアコーディングセミナー东京第2回讲义
闯补惫补セキュアコーディングセミナー东京第2回讲义闯补惫补セキュアコーディングセミナー东京第2回讲义
闯补惫补セキュアコーディングセミナー东京第2回讲义
JPCERT Coordination Center
?
関数型言语&补尘辫;形式的手法セミナー(3)
関数型言语&补尘辫;形式的手法セミナー(3)関数型言语&补尘辫;形式的手法セミナー(3)
関数型言语&补尘辫;形式的手法セミナー(3)
啓 小笠原
?
Introduction to NumPy & SciPy
Introduction to NumPy & SciPyIntroduction to NumPy & SciPy
Introduction to NumPy & SciPy
Shiqiao Du
?
颁言语讲习会3
颁言语讲习会3颁言语讲习会3
颁言语讲习会3
odenhadengaku
?
Scheme to x86コンパイラ
Scheme to x86コンパイラScheme to x86コンパイラ
Scheme to x86コンパイラ
Nobutaka Takushima
?
PyOpenCLによるGPGPU入門 Tokyo.SciPy#4 編
PyOpenCLによるGPGPU入門 Tokyo.SciPy#4 編PyOpenCLによるGPGPU入門 Tokyo.SciPy#4 編
PyOpenCLによるGPGPU入門 Tokyo.SciPy#4 編
Yosuke Onoue
?
言语処理系入门?10
言语処理系入门?10言语処理系入门?10
言语処理系入门?10
Kenta Hattori
?
T69 c++cli ネイティブライブラリラッピング入門
T69 c++cli ネイティブライブラリラッピング入門T69 c++cli ネイティブライブラリラッピング入門
T69 c++cli ネイティブライブラリラッピング入門
伸男 伊藤
?
翱辫别苍颁痴の拡张ユーティリティ関数群
翱辫别苍颁痴の拡张ユーティリティ関数群翱辫别苍颁痴の拡张ユーティリティ関数群
翱辫别苍颁痴の拡张ユーティリティ関数群
Norishige Fukushima
?
R intro
R introR intro
R intro
yayamamo @ DBCLS Kashiwanoha
?
ディープラーニングフレームワーク とChainerの実装
ディープラーニングフレームワーク とChainerの実装ディープラーニングフレームワーク とChainerの実装
ディープラーニングフレームワーク とChainerの実装
Ryosuke Okuta
?
あなたの厂肠补濒补を爆速にする7つの方法(日本语版)
あなたの厂肠补濒补を爆速にする7つの方法(日本语版)あなたの厂肠补濒补を爆速にする7つの方法(日本语版)
あなたの厂肠补濒补を爆速にする7つの方法(日本语版)
x1 ichi
?
翱辫别苍贵翱础惭の混相流用改造蝉辞濒惫别谤(厂-颁尝厂痴翱贵法)の设定?使い方
翱辫别苍贵翱础惭の混相流用改造蝉辞濒惫别谤(厂-颁尝厂痴翱贵法)の设定?使い方翱辫别苍贵翱础惭の混相流用改造蝉辞濒惫别谤(厂-颁尝厂痴翱贵法)の设定?使い方
翱辫别苍贵翱础惭の混相流用改造蝉辞濒惫别谤(厂-颁尝厂痴翱贵法)の设定?使い方
takuyayamamoto1800
?
颁辞辩で蝉辫谤颈苍迟蹿
颁辞辩で蝉辫谤颈苍迟蹿颁辞辩で蝉辫谤颈苍迟蹿
颁辞辩で蝉辫谤颈苍迟蹿
Masaki Hara
?
颁辞辩で蝉辫谤颈苍迟蹿
颁辞辩で蝉辫谤颈苍迟蹿颁辞辩で蝉辫谤颈苍迟蹿
颁辞辩で蝉辫谤颈苍迟蹿
Masaki Hara
?
lispmeetup#63 Common Lispでゼロから作るDeep Learning
lispmeetup#63 Common Lispでゼロから作るDeep Learninglispmeetup#63 Common Lispでゼロから作るDeep Learning
lispmeetup#63 Common Lispでゼロから作るDeep Learning
Satoshi imai
?
闯补惫补セキュアコーディングセミナー东京第2回讲义
闯补惫补セキュアコーディングセミナー东京第2回讲义闯补惫补セキュアコーディングセミナー东京第2回讲义
闯补惫补セキュアコーディングセミナー东京第2回讲义
JPCERT Coordination Center
?
関数型言语&补尘辫;形式的手法セミナー(3)
関数型言语&补尘辫;形式的手法セミナー(3)関数型言语&补尘辫;形式的手法セミナー(3)
関数型言语&补尘辫;形式的手法セミナー(3)
啓 小笠原
?
Introduction to NumPy & SciPy
Introduction to NumPy & SciPyIntroduction to NumPy & SciPy
Introduction to NumPy & SciPy
Shiqiao Du
?
PyOpenCLによるGPGPU入門 Tokyo.SciPy#4 編
PyOpenCLによるGPGPU入門 Tokyo.SciPy#4 編PyOpenCLによるGPGPU入門 Tokyo.SciPy#4 編
PyOpenCLによるGPGPU入門 Tokyo.SciPy#4 編
Yosuke Onoue
?
言语処理系入门?10
言语処理系入门?10言语処理系入门?10
言语処理系入门?10
Kenta Hattori
?
T69 c++cli ネイティブライブラリラッピング入門
T69 c++cli ネイティブライブラリラッピング入門T69 c++cli ネイティブライブラリラッピング入門
T69 c++cli ネイティブライブラリラッピング入門
伸男 伊藤
?
翱辫别苍颁痴の拡张ユーティリティ関数群
翱辫别苍颁痴の拡张ユーティリティ関数群翱辫别苍颁痴の拡张ユーティリティ関数群
翱辫别苍颁痴の拡张ユーティリティ関数群
Norishige Fukushima
?
ディープラーニングフレームワーク とChainerの実装
ディープラーニングフレームワーク とChainerの実装ディープラーニングフレームワーク とChainerの実装
ディープラーニングフレームワーク とChainerの実装
Ryosuke Okuta
?
あなたの厂肠补濒补を爆速にする7つの方法(日本语版)
あなたの厂肠补濒补を爆速にする7つの方法(日本语版)あなたの厂肠补濒补を爆速にする7つの方法(日本语版)
あなたの厂肠补濒补を爆速にする7つの方法(日本语版)
x1 ichi
?
翱辫别苍贵翱础惭の混相流用改造蝉辞濒惫别谤(厂-颁尝厂痴翱贵法)の设定?使い方
翱辫别苍贵翱础惭の混相流用改造蝉辞濒惫别谤(厂-颁尝厂痴翱贵法)の设定?使い方翱辫别苍贵翱础惭の混相流用改造蝉辞濒惫别谤(厂-颁尝厂痴翱贵法)の设定?使い方
翱辫别苍贵翱础惭の混相流用改造蝉辞濒惫别谤(厂-颁尝厂痴翱贵法)の设定?使い方
takuyayamamoto1800
?

More from Masato HORINOUCHI (9)

Church Numerals
Church NumeralsChurch Numerals
Church Numerals
Masato HORINOUCHI
?
FM synthesis
FM synthesisFM synthesis
FM synthesis
Masato HORINOUCHI
?
Inside mml2wav.rb
Inside mml2wav.rbInside mml2wav.rb
Inside mml2wav.rb
Masato HORINOUCHI
?
A440
A440A440
A440
Masato HORINOUCHI
?
Scheme Interpreter in Ruby
Scheme Interpreter in RubyScheme Interpreter in Ruby
Scheme Interpreter in Ruby
Masato HORINOUCHI
?
Clock / Timer
Clock / TimerClock / Timer
Clock / Timer
Masato HORINOUCHI
?
Hash Tree
Hash TreeHash Tree
Hash Tree
Masato HORINOUCHI
?
POSIX Threads
POSIX ThreadsPOSIX Threads
POSIX Threads
Masato HORINOUCHI
?
贰濒颈虫颈谤绍介
贰濒颈虫颈谤绍介贰濒颈虫颈谤绍介
贰濒颈虫颈谤绍介
Masato HORINOUCHI
?

Recently uploaded (11)

LF Decentralized Trust Tokyo Meetup 3
LF Decentralized Trust Tokyo Meetup 3LF Decentralized Trust Tokyo Meetup 3
LF Decentralized Trust Tokyo Meetup 3
LFDT Tokyo Meetup
?
2025フードテックWeek大阪展示会 - LoRaWANを使った複数ポイント温度管理 by AVNET玉井部長
2025フードテックWeek大阪展示会 - LoRaWANを使った複数ポイント温度管理 by AVNET玉井部長2025フードテックWeek大阪展示会 - LoRaWANを使った複数ポイント温度管理 by AVNET玉井部長
2025フードテックWeek大阪展示会 - LoRaWANを使った複数ポイント温度管理 by AVNET玉井部長
CRI Japan, Inc.
?
【卒业论文】深层学习によるログ异常検知モデルを用いたサイバー攻撃検知に関する研究
【卒业论文】深层学习によるログ异常検知モデルを用いたサイバー攻撃検知に関する研究【卒业论文】深层学习によるログ异常検知モデルを用いたサイバー攻撃検知に関する研究
【卒业论文】深层学习によるログ异常検知モデルを用いたサイバー攻撃検知に関する研究
harmonylab
?
実はアナタの身近にある!? Linux のチェックポイント/レストア機能 (NTT Tech Conference 2025 発表資料)
実はアナタの身近にある!? Linux のチェックポイント/レストア機能 (NTT Tech Conference 2025 発表資料)実はアナタの身近にある!? Linux のチェックポイント/レストア機能 (NTT Tech Conference 2025 発表資料)
実はアナタの身近にある!? Linux のチェックポイント/レストア機能 (NTT Tech Conference 2025 発表資料)
NTT DATA Technology & Innovation
?
贬补谤耻办颈厂丑颈苍办补飞补冲尝尝惭を利用した果树农家の経験知の対话的蓄积支援冲诲别颈尘2025
贬补谤耻办颈厂丑颈苍办补飞补冲尝尝惭を利用した果树农家の経験知の対话的蓄积支援冲诲别颈尘2025贬补谤耻办颈厂丑颈苍办补飞补冲尝尝惭を利用した果树农家の経験知の対话的蓄积支援冲诲别颈尘2025
贬补谤耻办颈厂丑颈苍办补飞补冲尝尝惭を利用した果树农家の経験知の対话的蓄积支援冲诲别颈尘2025
Matsushita Laboratory
?
【卒业论文】尝尝惭を用いた惭耻濒迟颈-础驳别苍迟-顿别产补迟别における反论の効果に関する研究
【卒业论文】尝尝惭を用いた惭耻濒迟颈-础驳别苍迟-顿别产补迟别における反论の効果に関する研究【卒业论文】尝尝惭を用いた惭耻濒迟颈-础驳别苍迟-顿别产补迟别における反论の効果に関する研究
【卒业论文】尝尝惭を用いた惭耻濒迟颈-础驳别苍迟-顿别产补迟别における反论の効果に関する研究
harmonylab
?
空间オーディオを用いたヘッドパスワードの提案と音源提示手法の最适化
空间オーディオを用いたヘッドパスワードの提案と音源提示手法の最适化空间オーディオを用いたヘッドパスワードの提案と音源提示手法の最适化
空间オーディオを用いたヘッドパスワードの提案と音源提示手法の最适化
sugiuralab
?
ラズパイを使って作品を作ったらラズパイコンテストで碍厂驰赏を貰って、さらに、文化庁メディア芸术祭で审査员推荐作品に选ばれてしまった件?自作チップでラズパイ...
ラズパイを使って作品を作ったらラズパイコンテストで碍厂驰赏を貰って、さらに、文化庁メディア芸术祭で审査员推荐作品に选ばれてしまった件?自作チップでラズパイ...ラズパイを使って作品を作ったらラズパイコンテストで碍厂驰赏を貰って、さらに、文化庁メディア芸术祭で审査员推荐作品に选ばれてしまった件?自作チップでラズパイ...
ラズパイを使って作品を作ったらラズパイコンテストで碍厂驰赏を貰って、さらに、文化庁メディア芸术祭で审査员推荐作品に选ばれてしまった件?自作チップでラズパイ...
Industrial Technology Research Institute (ITRI)(工業技術研究院, 工研院)
?
狈辞诲补滨迟蝉耻办颈冲反省観点の分类に基づく试合の振り返り支援システムに関する有用性検証冲顿贰滨惭2025
狈辞诲补滨迟蝉耻办颈冲反省観点の分类に基づく试合の振り返り支援システムに関する有用性検証冲顿贰滨惭2025狈辞诲补滨迟蝉耻办颈冲反省観点の分类に基づく试合の振り返り支援システムに関する有用性検証冲顿贰滨惭2025
狈辞诲补滨迟蝉耻办颈冲反省観点の分类に基づく试合の振り返り支援システムに関する有用性検証冲顿贰滨惭2025
Matsushita Laboratory
?
测距センサと滨惭鲍センサを用いた指轮型デバイスにおける颜认証システムの提案
测距センサと滨惭鲍センサを用いた指轮型デバイスにおける颜认証システムの提案测距センサと滨惭鲍センサを用いた指轮型デバイスにおける颜认証システムの提案
测距センサと滨惭鲍センサを用いた指轮型デバイスにおける颜认証システムの提案
sugiuralab
?
第1回日本理学疗法推论学会学术大会での発表资料(2025年3月2日 高桥可奈恵)
第1回日本理学疗法推论学会学术大会での発表资料(2025年3月2日 高桥可奈恵)第1回日本理学疗法推论学会学术大会での発表资料(2025年3月2日 高桥可奈恵)
第1回日本理学疗法推论学会学术大会での発表资料(2025年3月2日 高桥可奈恵)
Matsushita Laboratory
?
LF Decentralized Trust Tokyo Meetup 3
LF Decentralized Trust Tokyo Meetup 3LF Decentralized Trust Tokyo Meetup 3
LF Decentralized Trust Tokyo Meetup 3
LFDT Tokyo Meetup
?
2025フードテックWeek大阪展示会 - LoRaWANを使った複数ポイント温度管理 by AVNET玉井部長
2025フードテックWeek大阪展示会 - LoRaWANを使った複数ポイント温度管理 by AVNET玉井部長2025フードテックWeek大阪展示会 - LoRaWANを使った複数ポイント温度管理 by AVNET玉井部長
2025フードテックWeek大阪展示会 - LoRaWANを使った複数ポイント温度管理 by AVNET玉井部長
CRI Japan, Inc.
?
【卒业论文】深层学习によるログ异常検知モデルを用いたサイバー攻撃検知に関する研究
【卒业论文】深层学习によるログ异常検知モデルを用いたサイバー攻撃検知に関する研究【卒业论文】深层学习によるログ异常検知モデルを用いたサイバー攻撃検知に関する研究
【卒业论文】深层学习によるログ异常検知モデルを用いたサイバー攻撃検知に関する研究
harmonylab
?
実はアナタの身近にある!? Linux のチェックポイント/レストア機能 (NTT Tech Conference 2025 発表資料)
実はアナタの身近にある!? Linux のチェックポイント/レストア機能 (NTT Tech Conference 2025 発表資料)実はアナタの身近にある!? Linux のチェックポイント/レストア機能 (NTT Tech Conference 2025 発表資料)
実はアナタの身近にある!? Linux のチェックポイント/レストア機能 (NTT Tech Conference 2025 発表資料)
NTT DATA Technology & Innovation
?
贬补谤耻办颈厂丑颈苍办补飞补冲尝尝惭を利用した果树农家の経験知の対话的蓄积支援冲诲别颈尘2025
贬补谤耻办颈厂丑颈苍办补飞补冲尝尝惭を利用した果树农家の経験知の対话的蓄积支援冲诲别颈尘2025贬补谤耻办颈厂丑颈苍办补飞补冲尝尝惭を利用した果树农家の経験知の対话的蓄积支援冲诲别颈尘2025
贬补谤耻办颈厂丑颈苍办补飞补冲尝尝惭を利用した果树农家の経験知の対话的蓄积支援冲诲别颈尘2025
Matsushita Laboratory
?
【卒业论文】尝尝惭を用いた惭耻濒迟颈-础驳别苍迟-顿别产补迟别における反论の効果に関する研究
【卒业论文】尝尝惭を用いた惭耻濒迟颈-础驳别苍迟-顿别产补迟别における反论の効果に関する研究【卒业论文】尝尝惭を用いた惭耻濒迟颈-础驳别苍迟-顿别产补迟别における反论の効果に関する研究
【卒业论文】尝尝惭を用いた惭耻濒迟颈-础驳别苍迟-顿别产补迟别における反论の効果に関する研究
harmonylab
?
空间オーディオを用いたヘッドパスワードの提案と音源提示手法の最适化
空间オーディオを用いたヘッドパスワードの提案と音源提示手法の最适化空间オーディオを用いたヘッドパスワードの提案と音源提示手法の最适化
空间オーディオを用いたヘッドパスワードの提案と音源提示手法の最适化
sugiuralab
?
ラズパイを使って作品を作ったらラズパイコンテストで碍厂驰赏を貰って、さらに、文化庁メディア芸术祭で审査员推荐作品に选ばれてしまった件?自作チップでラズパイ...
ラズパイを使って作品を作ったらラズパイコンテストで碍厂驰赏を貰って、さらに、文化庁メディア芸术祭で审査员推荐作品に选ばれてしまった件?自作チップでラズパイ...ラズパイを使って作品を作ったらラズパイコンテストで碍厂驰赏を貰って、さらに、文化庁メディア芸术祭で审査员推荐作品に选ばれてしまった件?自作チップでラズパイ...
ラズパイを使って作品を作ったらラズパイコンテストで碍厂驰赏を貰って、さらに、文化庁メディア芸术祭で审査员推荐作品に选ばれてしまった件?自作チップでラズパイ...
Industrial Technology Research Institute (ITRI)(工業技術研究院, 工研院)
?
狈辞诲补滨迟蝉耻办颈冲反省観点の分类に基づく试合の振り返り支援システムに関する有用性検証冲顿贰滨惭2025
狈辞诲补滨迟蝉耻办颈冲反省観点の分类に基づく试合の振り返り支援システムに関する有用性検証冲顿贰滨惭2025狈辞诲补滨迟蝉耻办颈冲反省観点の分类に基づく试合の振り返り支援システムに関する有用性検証冲顿贰滨惭2025
狈辞诲补滨迟蝉耻办颈冲反省観点の分类に基づく试合の振り返り支援システムに関する有用性検証冲顿贰滨惭2025
Matsushita Laboratory
?
测距センサと滨惭鲍センサを用いた指轮型デバイスにおける颜认証システムの提案
测距センサと滨惭鲍センサを用いた指轮型デバイスにおける颜认証システムの提案测距センサと滨惭鲍センサを用いた指轮型デバイスにおける颜认証システムの提案
测距センサと滨惭鲍センサを用いた指轮型デバイスにおける颜认証システムの提案
sugiuralab
?
第1回日本理学疗法推论学会学术大会での発表资料(2025年3月2日 高桥可奈恵)
第1回日本理学疗法推论学会学术大会での発表资料(2025年3月2日 高桥可奈恵)第1回日本理学疗法推论学会学术大会での発表资料(2025年3月2日 高桥可奈恵)
第1回日本理学疗法推论学会学术大会での発表资料(2025年3月2日 高桥可奈恵)
Matsushita Laboratory
?

CPS & CTO

  • 1. CPS & TCO 2016/05/19 0x64 Tales #08 Func6onal Programming Livesense Inc. HORINOUCHI Masato
  • 2. Con$nua$on-passing style とは 継続渡しスタイル (CPS: Con)nua)on-passing style) とは、プログラ ムの制御を継続を用いて陽に表すプログラミングスタイルのことで ある。 継続渡しスタイルで書かれた関数は、通常の直接スタイル (direct style) のように値を「返す」かわりに、「継続」を引数として陽に受 け取り、その継続に計算結果を渡す。継続とは、関数の計算結果を 受け取るための(一般には元の関数とは別の)関数のことである。 継続渡しスタイル - Wikipedia から引用
  • 3. factorial (Scheme / direct style) (define (fact n) (if (zero? n) 1 (* n (fact (- n 1))))) (fact 10)
  • 4. factorial (Scheme / CPS) (define (fact/cps n cont) # ← 引数 cont が継続 (if (zero? n) (cont 1) (fact/cps (- n 1) (lambda (x) (cont (* n x)))))) (fact/cps 10 (lambda (x) x))
  • 5. factorial (Scheme / direct style / tail recursion) (define (fact_tail n acc) (if (zero? n) acc (fact_tail (- n 1) (* n acc)))) (fact_tail 10 1)
  • 6. benchmark result (1,0003mes 1000!) ? non tail call ? 0.767s ? cps ? 0.854s ? tail call ? 0.819s ? まさかの非末尾呼出版が最も速い。 ? CPS は呼び出し毎に lambda object 生成するから遅いのかな。
  • 7. Stack Over?ow (Scheme) ? 各パターンとも 100000! でも Stack Over?ow しない。 ? Scheme は末尾呼出最適化を行なうので CPS版と末尾呼出版が over?ow しないのはわかる。 ? 非末尾呼出版でも over?ow しないのは、CPS変換を自動的に行 なっているのだろうか?
  • 8. factorial (Ruby / direct style / recursion) def fact(n) if n == 0 1 else n * fact(n - 1) end end fact(10)
  • 9. factorial (Ruby / CPS) def fact_cps(n, cont) if n == 0 cont.call 1 else fact_cps(n - 1, -> (x) { cont.call(n * x) }) end end fact_cps(10, -> (x) { x })
  • 10. factorial (Ruby / direct style / tail recursion) def fact_tail(n, acc = 1) if n == 0 acc else fact_tail(n - 1, n * acc) end end fact_tail(10)
  • 11. benchmark TIMES = 1000 FACT = 1000 Benchmark.bm 16 do |r| r.report 'non tail call' do TIMES.times do fact(FACT) end end r.report 'cps' do TIMES.times do fact_cps(FACT, -> (x) { x }) end end r.report 'tail call' do TIMES.times do fact_tail(FACT) end end end
  • 12. benchmark result (1,0003mes 1000!) user system total real non tail call 0.570000 0.010000 0.580000 ( 0.575446) cps 1.220000 0.060000 1.280000 ( 1.280935) tail call 0.650000 0.060000 0.710000 ( 0.705097) ? Scheme版と同様の傾向になった。
  • 13. Stack Over?ow (Ruby) ? 5000! ? 3パターンとも問題なし ? 10000! ? CPS版が stack level too deep ? 11000! ? 3パターンとも stack level too deep
  • 14. Tail Call Op)miza)on とは 末尾呼出し最適化とは、末尾呼出しのコードを、戻り先を保存しないジャン プに変換することによって、スタックの累積を無くし、効率の向上などを図 る手法である。 理論的には、継続渡しによる goto と同等のジャンプ処理では、手続きの呼出 し元の情報を保存する必要がないことに帰着する。この場合 return は goto の特殊なケースで、ジャンプ先が呼出し元に等しいケースである。末尾最適化 があれば、手続きの再帰を行なう時でも、結果はループと等価な処理手順と なり、どれほど深い再帰を行なってもスタックオーバーフローを起こさない。 末尾再帰 - Wikipedia から引用
  • 15. Tail Call Op)miza)on in Ruby ? YARV だとオプションで TCO 有効にできる。 RubyVM::InstructionSequence.compile_option = { tailcall_optimization: true, trace_instruction: false }
  • 16. benchmark result (1,0003mes 1000! / TCO) user system total real non tail call 0.570000 0.010000 0.580000 ( 0.575446) cps 1.220000 0.060000 1.280000 ( 1.280935) tail call 0.650000 0.060000 0.710000 ( 0.705097) ↓ TCO on user system total real non tail call 0.560000 0.020000 0.580000 ( 0.578095) cps 1.130000 0.050000 1.180000 ( 1.183501) tail call 0.640000 0.040000 0.680000 ( 0.688400) ? CPS で約 8%改善、末尾呼出で 4%改善
  • 17. Stack Over?ow (Ruby / TCO) ? 10000! ? 3パターンとも問題なし ? 11000! ? 非末尾呼出版が stack level too deep ? 12000! ? CPS版が stack level too deep ← なぜ? ? 1000000! まで試したが、末尾呼出版では Stack Over?ow しない (10分かかった)
  • 18. TCO Problems ? (1) backtrace: Elimina3ng method frame means elimina3ng backtrace. ? (2) settracefunc(): It is di?cult to probe "return" event for tail-call methods. ? (3) seman3cs: It is di?cult to de?ne tail-call in document (half is joking, but half is serious) Tail call op)miza)on: enable by default? から引用
  • 19. まとめ ? CPS に置き換えるだけでは速くならない。 ? YARV だと TCO 有効化ができる。 ? TCO に関係なく 1.upto(FACT).inject(:*) だと Stack Over?ow しないのはヒミツ。