Submit Search
Scalaのコンパイルを3倍速くした話
46 likes
21,279 views
tod esking
<marquee>
Technology
Read more
1 of 19
Download now
Downloaded 16 times
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
More Related Content
PDF
分散トレーシング技術について(Open tracingやjaeger)
NTT Communications Technology Development
PPTX
Ceph アーキテクチャ概説
Emma Haruka Iwao
PPTX
PostgreSQLのgitレポジトリから見える2021年の開発状況(第30回PostgreSQLアンカンファレンス@オンライン 発表資料)
NTT DATA Technology & Innovation
PPTX
もう知らずにはいられないGitOpsをArgoCDで学ぶ【WESEEK Tech Conf #3】
WESEEKWESEEK
PDF
kube-system落としてみました
Shuntaro Saiba
PPTX
root権限無しでKubernetesを動かす
Akihiro Suda
PDF
Harbor RegistryのReplication機能
Masanori Nara
PDF
コンテナとimmutableとわたし。あとセキュリティ。(Kubernetes Novice Tokyo #15 発表資料)
NTT DATA Technology & Innovation
分散トレーシング技術について(Open tracingやjaeger)
NTT Communications Technology Development
Ceph アーキテクチャ概説
Emma Haruka Iwao
PostgreSQLのgitレポジトリから見える2021年の開発状況(第30回PostgreSQLアンカンファレンス@オンライン 発表資料)
NTT DATA Technology & Innovation
もう知らずにはいられないGitOpsをArgoCDで学ぶ【WESEEK Tech Conf #3】
WESEEKWESEEK
kube-system落としてみました
Shuntaro Saiba
root権限無しでKubernetesを動かす
Akihiro Suda
Harbor RegistryのReplication機能
Masanori Nara
コンテナとimmutableとわたし。あとセキュリティ。(Kubernetes Novice Tokyo #15 発表資料)
NTT DATA Technology & Innovation
What's hot
(20)
PDF
Grafana LokiではじめるKubernetesロギングハンズオン(NTT Tech Conference #4 ハンズオン資料)
NTT DATA Technology & Innovation
PDF
PostgreSQLアーキテクチャ入門(INSIGHT OUT 2011)
Uptime Technologies LLC (JP)
PDF
Docker Compose 徹底解説
Masahito Zembutsu
PDF
Azure Monitor Logで実現するモダンな管理手法
Takeshi Fukuhara
PPTX
KeycloakでAPI認可に入門する
Hitachi, Ltd. OSS Solution Center.
PPTX
がっつりMongoDB事例紹介
Tetsutaro Watanabe
PDF
Dockerfileを改善するためのBest Practice 2019年版
Masahito Zembutsu
PPTX
Awsでのsql高可用構成 Always On
ShinodaYukihiro
PDF
DatadogでAWS監視やってみた
tyamane
PPTX
どうやって決める?kubernetesでのシークレット管理方法(Cloud Native Days 2020 発表資料)
NTT DATA Technology & Innovation
PDF
インフラCICDの勘所
Toru Makabe
PDF
MySQL・PostgreSQLだけで作る高速あいまい全文検索システム
Kouhei Sutou
PPTX
Prometheus入門から運用まで徹底解説
貴仁 大和屋
PDF
オープンソースのAPIゲートウェイ Kong ご紹介
briscola-tokyo
PDF
1日5分でPostgreSQLに詳しくなるアプリの開発 ~PostgRESTを使ってみた~(第38回PostgreSQLアンカンファレンス@オンライン 発...
NTT DATA Technology & Innovation
PDF
DockerCon EU 2015: Day 1 General Session
Docker, Inc.
PDF
ドメイン駆動設計という仕事の流儀
増田 亨
PDF
ログ解析を支えるNoSQLの技術
Drecom Co., Ltd.
PDF
マネージドPostgreSQLの実現に向けたPostgreSQL機能向上(PostgreSQL Conference Japan 2023 発表資料)
NTT DATA Technology & Innovation
PDF
20分でわかるgVisor入門
Shuji Yamada
Grafana LokiではじめるKubernetesロギングハンズオン(NTT Tech Conference #4 ハンズオン資料)
NTT DATA Technology & Innovation
PostgreSQLアーキテクチャ入門(INSIGHT OUT 2011)
Uptime Technologies LLC (JP)
Docker Compose 徹底解説
Masahito Zembutsu
Azure Monitor Logで実現するモダンな管理手法
Takeshi Fukuhara
KeycloakでAPI認可に入門する
Hitachi, Ltd. OSS Solution Center.
がっつりMongoDB事例紹介
Tetsutaro Watanabe
Dockerfileを改善するためのBest Practice 2019年版
Masahito Zembutsu
Awsでのsql高可用構成 Always On
ShinodaYukihiro
DatadogでAWS監視やってみた
tyamane
どうやって決める?kubernetesでのシークレット管理方法(Cloud Native Days 2020 発表資料)
NTT DATA Technology & Innovation
インフラCICDの勘所
Toru Makabe
MySQL・PostgreSQLだけで作る高速あいまい全文検索システム
Kouhei Sutou
Prometheus入門から運用まで徹底解説
貴仁 大和屋
オープンソースのAPIゲートウェイ Kong ご紹介
briscola-tokyo
1日5分でPostgreSQLに詳しくなるアプリの開発 ~PostgRESTを使ってみた~(第38回PostgreSQLアンカンファレンス@オンライン 発...
NTT DATA Technology & Innovation
DockerCon EU 2015: Day 1 General Session
Docker, Inc.
ドメイン駆動設計という仕事の流儀
増田 亨
ログ解析を支えるNoSQLの技術
Drecom Co., Ltd.
マネージドPostgreSQLの実現に向けたPostgreSQL機能向上(PostgreSQL Conference Japan 2023 発表資料)
NTT DATA Technology & Innovation
20分でわかるgVisor入門
Shuji Yamada
Ad
Similar to Scalaのコンパイルを3倍速くした話
(12)
PPTX
elixir in production
Tsunenori Oohara
PDF
Rubyにおけるトレース機構の刷新
Koichi Sasada
PDF
Introduction to guard + rspec
koko_u
PDF
1周遅れのScala入学 #nds41
Kazumune Katagiri
PDF
世界一速い他人のふんどしを使ったタイルサーバ
Naoshi Tabuchi
PDF
Re: 運用に自動化を求めるのは間違っているだろうか
Masahito Zembutsu
PDF
scala-kaigi1-sbt
Kenji Yoshida
PDF
SmartNews TechNight Vol5 : SmartNews AdServer 解体新書 / ポストモーテム
SmartNews, Inc.
KEY
OSS奨励賞受賞プレゼン 活動紹介
Hiromu Yakura
PDF
第2回 -Play部屋- Play 2.0はじめて&もくもく会
Kazuhiro Hara
PPTX
Ctb57 with god7
kingtomo
PDF
負荷テストを行う際に知っておきたいこと 初心者編
まべ☆てっく運営
elixir in production
Tsunenori Oohara
Rubyにおけるトレース機構の刷新
Koichi Sasada
Introduction to guard + rspec
koko_u
1周遅れのScala入学 #nds41
Kazumune Katagiri
世界一速い他人のふんどしを使ったタイルサーバ
Naoshi Tabuchi
Re: 運用に自動化を求めるのは間違っているだろうか
Masahito Zembutsu
scala-kaigi1-sbt
Kenji Yoshida
SmartNews TechNight Vol5 : SmartNews AdServer 解体新書 / ポストモーテム
SmartNews, Inc.
OSS奨励賞受賞プレゼン 活動紹介
Hiromu Yakura
第2回 -Play部屋- Play 2.0はじめて&もくもく会
Kazuhiro Hara
Ctb57 with god7
kingtomo
負荷テストを行う際に知っておきたいこと 初心者編
まべ☆てっく運営
Ad
More from tod esking
(9)
PDF
Nyandoc: Scaladoc/Javadoc to markdown converter
tod esking
PPTX
From Ruby to Scala
tod esking
PDF
(うしなわれた)Fluentd output-convert_structure
tod esking
KEY
スタート形態素解析
tod esking
KEY
貧者のための入力デバイス
tod esking
PDF
概観テキストマイニング
tod esking
PDF
仕様変更で死なないためのユニットテスト
tod esking
ODP
精神論によるいきいきとした組織づくりのご提案
tod esking
PPT
分散バージョン管理システムGitの紹介
tod esking
Nyandoc: Scaladoc/Javadoc to markdown converter
tod esking
From Ruby to Scala
tod esking
(うしなわれた)Fluentd output-convert_structure
tod esking
スタート形態素解析
tod esking
貧者のための入力デバイス
tod esking
概観テキストマイニング
tod esking
仕様変更で死なないためのユニットテスト
tod esking
精神論によるいきいきとした組織づくりのご提案
tod esking
分散バージョン管理システムGitの紹介
tod esking
Scalaのコンパイルを3倍速くした話
1.
TBD
2.
自己紹介 • @todesking • ジャバ(バッチ)
→ Ruby(ソシャゲサーバサ イド) → Scala(広告システムサーバサイド)
3.
近況 • ビルドシステムと戦っている http://twitter.com/todesking/status/488675512424734720! sbt/ivy使えばパッケージ管理の問題を解決してくれるというのは幻覚だったということがわかった、社会は厳しい
4.
何はともあれ • みんな大好きなあの話をします
5.
Scalaのコンパイルが 3倍 速くなった話
6.
問題 https://twitter.com/todesking/status/449393123894906880! Scala、みんなコンパイルの遅さに困ってるが解決手段が無いためコンパイル中に音楽を流すプラグインを作成して慰みを得ているということがわかった。Ruby 使ったほうがいいと思う。!
7.
(́・_・`) • https://twitter.com/ todesking/status/ 449406714123927553
8.
どれくらい遅いか [Info] Compiling 278
Scala sources and 4 Java sources to target/scala-2.10/classes... . . . . . . . .[success] Total time: 425 s
9.
?! • 他のプロジェクト [info] Compiling
234 Scala sources and 5 Java sources to target/scala-2.10/ classes... . . [success] Total time: 64 s ! はやい(相対的に)
10.
さすがに死っぽいので 調査しました • 特定のプロジェクトだけすごく遅い • プロジェクトの設定? •
使用ライブラリ?
11.
hprof: JVM標準 プロファイラ • jvmオプションつけてsbt
compile • 結果はjava.hprof.txtに出力されま す $ sbt -J-agentlib:hprof=cpu=samples,depth=5 clean compile
12.
結果見る • 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
13.
スタックトレースの詳細 • 処理時間上位の処理を見ていく • この処理がどこから呼ばれてるかを知りたい •
スタックトレースの深度を増やして再実行 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
14.
結果見る • 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
15.
結果見る • 怪しいものが 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
16.
原因特定 • 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
17.
ツイッター便利 https://twitter.com/todesking/status/461816289086820352
18.
修正しました • [success] Total
time: 122 s • scalikejdbc 1.7.7からは速いよ https://github.com/scalikejdbc/scalikejdbc/pull/241
19.
学び • 基本的にコンパイルは遅い(社会は厳しい) • でもユースケースによっては高速化の余地が! •
コンパイラがJVM上で動くので既存のプロファ イリングノウハウが使えて便利 • Scalaエコシステムはフロンティア • 目が届いてないとこが残ってるのでコントリビュートチャン スだ • ツイッター便利
Download