遅延評価でパーサコンビネータを高速化した話 http://connpass.com/event/39553/
Ԇ ධ Ձ ͱ ݈ ߁2 0 1 6 - 1 0 - 1 6 O U C C LT ձ # 5@susisu2413
View Slide
Ԇ ධ Ձ Ͱύ ʔ α ί ϯ Ϗω ʔ λ Λޮ Խ ͠ ͨ Λ ͠ · ͢
ύ ʔ α ί ϯ Ϗω ʔ λ ʁ
ߏ จ ղ ੳ ͢ Δ ͭh t t p s : / / e n . w i k i p e d i a . o rg / w i k i /P a r s e r _ c o m b i n a t o r
ೖ ྗΤ ϥ ʔ ΓύʔαύʔαΛؔͰදݱʢ࣮༻্ΦϒδΣΫτͰϥοϓʣ
ೖ ྗΤ ϥ ʔ Γύʔαύ ʔ α ύ ʔ αύʔαίϯϏωʔλύʔαίϯϏωʔλͰΑΓෳࡶͳύʔαΛߏங
༗ ໊ ͳ ͷP a r s e c ( H a s k e l l )h t t p s : / / g i t h u b . c o m / a s l a t t e r / p a r s e cP a r s i m m o n ( J a v a S c r i p t )h t t p s : / / g i t h u b . c o m / j n e e n / p a r s i m m o n
࡞ ͬͯ Έ ͨʢ 2 લ ʣ
J a v a S c r i p t ͰP a r s e c ؙ ύ Ϋ Ϧh t t p s : / / g i t h u b . c o m / s u s i s u / L o q u a t
ͱ ͯ ศ རࣗ ࡞ ε Ϋ Ϧ ϓ τ ݴ ޠG r a s s ί ϯύ Π ϥ︙
ੑ ೳ ʁ
1000ߦͷ JSON × 1000ճ (Node.js v6.7.0) ൺ ֱParsimmon: 4.8 secPEG.js: 8.47 secLoquat: 72724msࣗ࡞: ? sec
1000ߦͷ JSON × 1000ճ ൺ ֱParsimmon: 4.8 secPEG.js: 8.47 secࣗ࡞: 72.7 sec
ͳ ͥ ͍ ʁ
V 8 ͷ ϓ ϩ ϑ Ν Π ϥ Ͱ ௐ Δnode --prof parse.jsnode --prof-process isolate-0x*-v8.loghttps://github.com/v8/v8/wiki/Using%20V8’s%20internal%20profiler
͍ ͷ ͨ ͪύ ʔ α ͷ ݁ ߹จ ࣈ ͷ ύ ʔεΤ ϥ ʔ ॲ ཧ
ࠓ ͷ ϝ Π ϯΤ ϥ ʔ ॲ ཧ
Τ ϥ ʔ ॲ ཧߏ จ ղ ੳ ࣦ ഊ ࣌ ʹ ώ ϯ τ Λ ग़ ͢ ͨ Ίϝ ο η ʔ δ ྻ ͷ ݁ ߹ ͳ Ͳ
ࣦ ഊ ͠ ͨ ͱ ͖ ͷ Έ ඞ ཁ
ࣦ ഊ ͢ Δ · Ͱ ܭ ࢉ ͠ ͳ ͍
Ԇ ධ Ձ
ܭ ࢉ Λ Ԇ ͞ ͤ Δ ʹ ʁlet x = 1 + 2;
Ϋ ϩ ʔ δ ϟ ʹ ͢ Ε ྑ ͍let x = () => 1 + 2;
ຖ ճ ؔ ݺ ͼ ग़ ͠Ω ϟ ο γ ϡ ͞ Ε ͳ ͍ ͍ ͮ Β ͍
Φ ϒ δΣ Ϋ τ Ͱ ϥ ο ϓ
ΠϯλʔϑΣʔε͕ڞ௨ͨ̎ͭ͠ͷΫϥεΛ࡞ParseErrorLazyParseError௨ৗ൛Ԇ൛
σʔλΛՃ͢Δͱ͖Ԇ൛ͰܭࢉΛԆͤ͞ΔParseErrorLazyParseErrorՃʢ݁߹ͳͲʣՃ
௨ৗ൛Ͱ getter ͦͷ··Λฦ͢ParseErrorLazyParseError
Ԇ൛Ͱ getter ධՁ͔ͯ͠ΒΛฦ͢ParseErrorLazyParseErrorධՁ݁ՌΩϟογϡ
݁ Ռ
1000ߦͷ JSON × 1000ճ ൺ ֱݩ: 72.7 secվྑ൛: 28.4 secԆධՁ͋Γ: ? sec
1000ߦͷ JSON × 1000ճ ൺ ֱԆධՁ͋Γ: 11.2 secݩ: 72.7 secվྑ൛: 28.4 sec
1000ߦͷ JSON × 1000ճ ൺ ֱParsimmon: 4.8 secPEG.js: 8.47 secվྑ൛ + ԆධՁ: 11.2 sec
· ͱ Ί
Ԇ ධ Ձ ͍ ͍ ͧܭ ࢉ ͷ ޮ Խଞ ʹ ॥ ఆ ٛ ͳ Ͳ
ܽ ͋ Δ ͷ Ͱ ҙ࣌ ؒ ɾ ۭ ؒ త ί ε τࢥ Θ ͵ ε λ ο Ϋ ͷ ফ අ
ύ ʔ α ί ϯ Ϗω ʔ λ v 2͝ ظ Լ ͞ ͍h t t p s : / / g i t h u b . c o m / s u s i s u / l o q u a t - c o re