Scala	
 Performance	
 Tuning	
 Tips	
 
	
 
水島宏太
自己紹介	
 
n 
n 
n 

Twitter:	
 @kmizu	
 
GitHub:	
 https://github.com/kmizu	
 
Scalaの普及活動やってます	
 
n 

n 

Scala	
 Conference	
 in	
 Japan	
 座長	
 

形式言語、構文解析好き	
 
n 
n 

プログラミング言語Onionを開発	
 
新しい言語も開発中
トレードマーク?
アジェンダ	
 
n 
n 
n 
n 
n 
n 

Scalaの概要	
 
Scalaの性能特性	
 
Java	
 VMの特性	
 
デモ:向聴数計算プログラム	
 
Scala特有のはなし	
 
まとめ
Scalaとは	
 
n 

JVM上で動作するプログラミング言語	
 
※言語と処理系は本来分けて論じるべき	
 
	
 

n 

JVMのクラスファイルにコンパイル	
 

n 

静的型付きオブジェクト指向言語	
 
関数型プログラミングも積極的に支援	
 

n 
Scala略式年表	
 
n 

2003年:誕生	
 

n 

2006年:Scala	
 2.0	
 

n 

2008年:Twitterで採用開始	
 

	
 
n 

2011年:Typesafe社設立
Fibonacci	
 in	
 Scala	
 
object	
 Fibonacci	
 {	
 
	
 	
 def	
 main(args	
 :Array[String])	
 =	
 {	
 
	
 	
 	
 	
 lazy	
 val	
 fib:	
 Stream[Int]	
 =	
 	
 
	
 	
 	
 	
 	
 	
 0	
 #::	
 1	
 #::	
 fib.zip(fib.tail).map{	
 	
 
	
 	
 	
 	
 	
 	
 	
 	
 case	
 (a,	
 b)	
 =>	
 a	
 +	
 b	
 	
 
	
 	
 	
 	
 	
 	
 }	
 
	
 	
 	
 	
 println(fib.take(10).toList)	
 
	
 	
 }	
 
}	
 
//=>	
 List(0,	
 1,	
 1,	
 2,	
 3,	
 5,	
 8,	
 13,	
 21,	
 34)
Scalaの性能特性	
 
n 

ほとんどの場合は十分な性能	
 
n 

n 

Javaと本当に同程度の速度を出す方法	
 
n 
n 

n 
n 

たまにかなり遅くなる事がある	
 
高階関数を使わない	
 
変更可能なコレクションだけを使う	
 

縛りプレイは止めよう	
 
JVMを知ろう	
 
n 

楽して高速化する
Java	
 VMの特性(Java/Scala共通)	
 
n 

高度な最適化コンパイラ	
 
n 

n 

簡単なチューニングは効果が薄い	
 
n 
n 
n 

n 

特に所謂Server	
 VM(C2コンパイラ)	
 
メソッドのインライン化	
 
フィールドへの直接アクセス	
 
staticメソッドを使う	
 

メモリ管理のチューニングは効果的	
 
n 

どこでオブジェクトを確保しているか
デモ:向聴数計算プログラム	
 
	
 
	
 
	
 
	
 

https://github.com/kmizu/shanten_benchmark
Scala特有のはなし	
 
n 

メモリ確保箇所を見落としがち	
 

n 

注意する必要がある項目:	
 
n 
n 
n 
n 

無名関数	
 
for構文:無名関数が作られる	
 
implicit	
 conversion(<	
 Scala	
 2.10)	
 
boxing/unboxing	
 
n 

基本型相当のオブジェクトの出し入れ時
やってはいけない	
 
n 

闇雲に全体をJava風に書き換える	
 
n 
n 
n 

n 

高階関数をループ構文に置き換える	
 
implicit	
 conversionを使わない	
 
for構文をループに置き換える	
 

ボトルネックを見極める	
 
n 
n 

メモリ確保回数が異常に多い箇所	
 
使えるならプロファイラを使う
まとめ	
 
n 

Java	
 VMを知ることが高速化への近道	
 
n 

n 

Java風コードへの書き換えは慎重に	
 
n 

n 

特にメモリ確保・GCの仕組み	
 

効果があまりない場合も多い	
 

隠れたメモリ確保に注意をはらう	
 
n 

boxing/unboxingは見落としがち
もっとJava	
 VMを知りたい人へ	
 
n 

Java仮想マシン仕様を読む	
 

n 

OpenJDKのソースコードを読む	
 
n 

詳しい人と一緒に読みましょう	
 
n 

n 

心が折れます	
 

クラスファイルを逆アセンブルする	
 
n 

javap!	
 javap!
Java	
 VMに関する余談	
 
n 

意外な最適化が効果的なこともある	
 
n 

インタフェース型→クラス型への置換	
 
n 

n 

剰余演算→ビット演算への置換	
 
n 

n 

invokeinterface,	
 invokevirtualの違い	
 
Java	
 VMでも効く	
 

Java	
 VMの進化で無効になるかも

Scala Performance Tuning Tips