SlideShare a Scribd company logo
TBD
自己紹介
• @todesking
• ジャバ(バッチ) → Ruby(ソシャゲサーバサ
イド) → Scala(広告システムサーバサイド)
近況
• ビルドシステムと戦っている
http://twitter.com/todesking/status/488675512424734720!
sbt/ivy使えばパッケージ管理の問題を解決してくれるというのは幻覚だったということがわかった、社会は厳しい
何はともあれ
• みんな大好きなあの話をします
Scalaのコンパイルが
3倍
速くなった話
問題
https://twitter.com/todesking/status/449393123894906880!
Scala、みんなコンパイルの遅さに困ってるが解決手段が無いためコンパイル中に音楽を流すプラグインを作成して慰みを得ているということがわかった。Ruby
使ったほうがいいと思う。!
(́・_・`)
• https://twitter.com/
todesking/status/
449406714123927553
どれくらい遅いか
[Info] Compiling 278 Scala sources and 4
Java sources to target/scala-2.10/classes...
.
.
.
.
.
.
.
.[success] Total time: 425 s
?!
• 他のプロジェクト
[info] Compiling 234 Scala sources and 5
Java sources to target/scala-2.10/
classes...
.
.
[success] Total time: 64 s
!
はやい(相対的に)
さすがに死っぽいので
調査しました
• 特定のプロジェクトだけすごく遅い
• プロジェクトの設定?
• 使用ライブラリ?
hprof: JVM標準
プロファイラ
• jvmオプションつけてsbt compile
• 結果はjava.hprof.txtに出力されま
す
$ sbt -J-agentlib:hprof=cpu=samples,depth=5 
clean compile
結果見る
• depth=5で荒い解析
• クラスのロードが大量にされている……?
rank self accum count trace method
1 12.04% 12.04% 2158 300093 java.util.zip.ZipFile.getEntry
2 9.90% 21.95% 1775 300065 java.lang.Throwable.fillInStackTrace
3 7.21% 29.16% 1293 303874 java.lang.Class.forName0
4 5.40% 34.56% 967 300200 java.lang.Throwable.fillInStackTrace
5 2.76% 37.32% 495 300061 java.lang.ClassLoader.defineClass1
6 1.66% 38.98% 298 300616 java.lang.ClassLoader.findLoadedClass0
7 1.32% 40.30% 236 303922 scala.collection.IndexedSeqOptimized$cl
8 1.27% 41.57% 228 303902 scala.collection.IndexedSeqOptimized$cl
9 1.27% 42.84% 228 301496 java.net.SocketInputStream.socketRead0
10 1.15% 43.99% 206 300711 java.lang.ClassLoader.findLoadedClass0
11 1.03% 45.02% 184 304106 java.lang.Class.forName
12 0.95% 45.97% 170 300630 java.lang.ClassLoader.loadClass
13 0.86% 46.83% 155 304054 java.lang.Object.hashCode
14 0.84% 47.68% 151 303870 java.io.UnixFileSystem.getBooleanAttrib
15 0.84% 48.51% 150 303879 java.lang.ClassLoader.loadClass
16 0.81% 49.33% 146 304060 java.security.AccessController.doPrivil
スタックトレースの詳細
• 処理時間上位の処理を見ていく
• この処理がどこから呼ばれてるかを知りたい
• スタックトレースの深度を増やして再実行
TRACE 300093:
java.util.zip.ZipFile.getEntry(ZipFile.java:Unknown
java.util.zip.ZipFile.getEntry(ZipFile.java:306)
java.util.jar.JarFile.getEntry(JarFile.java:226)
java.util.jar.JarFile.getJarEntry(JarFile.java:209)
sun.misc.URLClassPath$JarLoader.getResource(URLClass
結果見る
• depth = 50
• トレース深度を増やしてみる
CPU SAMPLES BEGIN (total = 22833) Tue Jul 15 15:02:57 2014
rank self accum count trace method
1 0.58% 0.58% 132 312316 java.util.zip.ZipFile.getEntry
2 0.56% 1.14% 128 313147 java.util.zip.ZipFile.getEntry
3 0.53% 1.67% 121 313118 java.util.zip.ZipFile.getEntry
4 0.45% 2.12% 103 313343 java.lang.Object.hashCode
5 0.44% 2.56% 100 313093 java.util.zip.ZipFile.getEntry
6 0.42% 2.98% 96 306293 java.net.SocketInputStream.socketRea
7 0.42% 3.39% 95 312675 java.util.zip.ZipFile.getEntry
8 0.38% 3.78% 87 314506 java.util.zip.ZipFile.getEntry
9 0.36% 4.14% 83 313104 java.lang.Class.forName0
10 0.32% 4.45% 72 306826 java.net.SocketInputStream.socketRea
11 0.29% 4.74% 66 312099 java.util.zip.ZipFile.getEntry
12 0.28% 5.02% 63 313314 java.lang.Class.forName0
13 0.27% 5.29% 61 313184 java.lang.Class.forName0
14 0.25% 5.54% 57 312970 java.lang.Throwable.fillInStackTrace
15 0.25% 5.79% 57 313083 java.util.zip.ZipFile.getEntry
16 0.24% 6.03% 55 312783 java.lang.Class.forName0
結果見る
• 怪しいものが
TRACE 313147:
java.util.zip.ZipFile.getEntry(ZipFile.java:Unknown line)
java.util.zip.ZipFile.getEntry(ZipFile.java:306)
java.util.jar.JarFile.getEntry(JarFile.java:226)
java.util.jar.JarFile.getJarEntry(JarFile.java:209)
:
scala.tools.reflect.ToolBoxFactory$ToolBoxImpl.eval(ToolBoxFactory.scal
scala.reflect.macros.runtime.Evals$class.eval(Evals.scala:16)
scala.reflect.macros.runtime.Context.eval(Context.scala:6)
scalikejdbc.SQLInterpolationMacro$.selectDynamic(SQLInterpolationMacro.
sun.reflect.GeneratedMethodAccessor3.invoke(<Unknown Source>:Unknown li
java.lang.reflect.Method.invoke(Method.java:606)
scala.tools.nsc.typechecker.Macros$$anonfun$scala$tools$nsc$typechecker
原因特定
• scalikejdbcのマクロが原因
• context.eval()が遅い
26 object SQLInterpolationMacro {!
27 !
28 def selectDynamic[E: c.WeakTypeTag](c: Context)(name: c.Expr[
29 import c.universe._!
30 !
31 val nameOpt: Option[String] = try {!
32 Some(c.eval(c.Expr[String](c.resetAllAttrs(name.tree.dupl
33 } catch {!
34 case t: Throwable => None!
35 }!
36
ツイッター便利
https://twitter.com/todesking/status/461816289086820352
修正しました
• [success] Total time: 122 s
• scalikejdbc 1.7.7からは速いよ
https://github.com/scalikejdbc/scalikejdbc/pull/241
学び
• 基本的にコンパイルは遅い(社会は厳しい)
• でもユースケースによっては高速化の余地が!
• コンパイラがJVM上で動くので既存のプロファ
イリングノウハウが使えて便利
• Scalaエコシステムはフロンティア
• 目が届いてないとこが残ってるのでコントリビュートチャン
スだ
• ツイッター便利

More Related Content

PDF
はじめてのDynamoDBスキーマ設計
PPTX
Lv1から始めるWebサービスのインフラ構築
PDF
AWS Black Belt Techシリーズ AWS IAM
PDF
AWS初心者向けWebinar AWSとのネットワーク接続入門
PPTX
Awsをオンプレドメコンに連携させる
PDF
MySQL Index勉強会外部公開用
PDF
[Aurora事例祭り]Amazon Aurora を使いこなすためのベストプラクティス
PDF
20190723 AWS Black Belt Online Seminar AWS CloudHSM
はじめてのDynamoDBスキーマ設計
Lv1から始めるWebサービスのインフラ構築
AWS Black Belt Techシリーズ AWS IAM
AWS初心者向けWebinar AWSとのネットワーク接続入門
Awsをオンプレドメコンに連携させる
MySQL Index勉強会外部公開用
[Aurora事例祭り]Amazon Aurora を使いこなすためのベストプラクティス
20190723 AWS Black Belt Online Seminar AWS CloudHSM

What's hot (20)

PDF
The Twelve-Factor Appで考えるAWSのサービス開発
PDF
日本のお客様におけるAmazon Auroraへの移行・検証事例と技術ポイント
PDF
AWS Black Belt Online Seminar 2017 Amazon DynamoDB
PDF
20210119 AWS Black Belt Online Seminar AWS CloudTrail
PDF
20191016 AWS Black Belt Online Seminar Amazon Route 53 Resolver
PDF
202110 AWS Black Belt Online Seminar AWS Site-to-Site VPN
PDF
20190226 AWS Black Belt Online Seminar Amazon WorkSpaces
PDF
DevOps with Database on AWS
PDF
Amazon Aurora - Auroraの止まらない進化とその中身
PDF
20190821 AWS Black Belt Online Seminar AWS AppSync
PDF
20190129 AWS Black Belt Online Seminar AWS Identity and Access Management (AW...
PDF
AWS初心者向けWebinar AWS上でのDDoS対策
PDF
20191029 AWS Black Belt Online Seminar Elastic Load Balancing (ELB)
PPTX
監査要件を有するシステムに対する PostgreSQL 導入の課題と可能性
PDF
Garbage First Garbage Collection (G1 GC) #jjug_ccc #ccc_cd6
PDF
20200722 AWS Black Belt Online Seminar AWSアカウント シングルサインオンの設計と運用
PDF
Amazon DynamoDB Advanced Design Pattern
PDF
TypeScript製フレームワーク「Nest」のご紹介
PDF
20190911 AWS Black Belt Online Seminar AWS Batch
PDF
20180425 AWS Black Belt Online Seminar Amazon Relational Database Service (Am...
The Twelve-Factor Appで考えるAWSのサービス開発
日本のお客様におけるAmazon Auroraへの移行・検証事例と技術ポイント
AWS Black Belt Online Seminar 2017 Amazon DynamoDB
20210119 AWS Black Belt Online Seminar AWS CloudTrail
20191016 AWS Black Belt Online Seminar Amazon Route 53 Resolver
202110 AWS Black Belt Online Seminar AWS Site-to-Site VPN
20190226 AWS Black Belt Online Seminar Amazon WorkSpaces
DevOps with Database on AWS
Amazon Aurora - Auroraの止まらない進化とその中身
20190821 AWS Black Belt Online Seminar AWS AppSync
20190129 AWS Black Belt Online Seminar AWS Identity and Access Management (AW...
AWS初心者向けWebinar AWS上でのDDoS対策
20191029 AWS Black Belt Online Seminar Elastic Load Balancing (ELB)
監査要件を有するシステムに対する PostgreSQL 導入の課題と可能性
Garbage First Garbage Collection (G1 GC) #jjug_ccc #ccc_cd6
20200722 AWS Black Belt Online Seminar AWSアカウント シングルサインオンの設計と運用
Amazon DynamoDB Advanced Design Pattern
TypeScript製フレームワーク「Nest」のご紹介
20190911 AWS Black Belt Online Seminar AWS Batch
20180425 AWS Black Belt Online Seminar Amazon Relational Database Service (Am...
Ad

Similar to Scalaのコンパイルを3倍速くした話 (12)

PPTX
elixir in production
PDF
Rubyにおけるトレース機構の刷新
PDF
Introduction to guard + rspec
PDF
1周遅れのScala入学 #nds41
PDF
世界一速い他人のふんどしを使ったタイルサーバ
PDF
Re: 運用に自動化を求めるのは間違っているだろうか
PDF
scala-kaigi1-sbt
PDF
SmartNews TechNight Vol5 : SmartNews AdServer 解体新書 / ポストモーテム
KEY
OSS奨励賞受賞プレゼン 活動紹介
PDF
第2回 -Play部屋- Play 2.0はじめて&もくもく会
PPTX
Ctb57 with god7
PDF
負荷テストを行う際に知っておきたいこと 初心者編
elixir in production
Rubyにおけるトレース機構の刷新
Introduction to guard + rspec
1周遅れのScala入学 #nds41
世界一速い他人のふんどしを使ったタイルサーバ
Re: 運用に自動化を求めるのは間違っているだろうか
scala-kaigi1-sbt
SmartNews TechNight Vol5 : SmartNews AdServer 解体新書 / ポストモーテム
OSS奨励賞受賞プレゼン 活動紹介
第2回 -Play部屋- Play 2.0はじめて&もくもく会
Ctb57 with god7
負荷テストを行う際に知っておきたいこと 初心者編
Ad

More from tod esking (9)

PDF
Nyandoc: Scaladoc/Javadoc to markdown converter
PPTX
From Ruby to Scala
PDF
(うしなわれた)Fluentd output-convert_structure
KEY
スタート形態素解析
KEY
貧者のための入力デバイス
PDF
概観テキストマイニング
PDF
仕様変更で死なないためのユニットテスト
ODP
精神論によるいきいきとした組織づくりのご提案
PPT
分散バージョン管理システムGitの紹介
Nyandoc: Scaladoc/Javadoc to markdown converter
From Ruby to Scala
(うしなわれた)Fluentd output-convert_structure
スタート形態素解析
貧者のための入力デバイス
概観テキストマイニング
仕様変更で死なないためのユニットテスト
精神論によるいきいきとした組織づくりのご提案
分散バージョン管理システムGitの紹介

Scalaのコンパイルを3倍速くした話