scala.js の IRCache
IRをJARとかファイルからインメモリに読んでくるIO操作をキャッシュしている。
これどれくらい早くなんの???
sbt plugin の場合キャッシュの読み書きは ScalaJSPluginInternal.scala
の scalaJSIR
task の中から。
- なんかコメントも
Update IR Cache
とか行って cache を保存しますみたいな顔してるけど 、実際はIRContiner
->IRFile
への変換。 - 多分だけど IRContainer は File (path) や JAR への参照で、
IRFile
はその中身 - IRContainer を受け取って、その中身をインメモリに展開するところをキャッシュしてる
cache を instantiate して
コメントに
cache.cached
で IRContainer
から IRFile
に変換、
あっ zenn って github のリンク貼ると展開してくれるんだ、便利〜〜〜
``
実装はこっち
PersistedFiles
ってなんですかね、まあ後で読んでいこう。
まずは IRContainer
と IRFile
からやで
IRContainer ってなんですか?
"A virtual file containing Scala.js IR." container 自体は path (JAR or SJSIR の file か...) と、version (hash とか、mtimeとか) を持つ。この version を使って invalidate するんかな。
sjsirFiles
メソッドが生えていて、これでsjsirの中身を取得できるらしい
いかれた IRContainer の実装を紹介するぜ
NodeJARIR
sjsirを含む JAR ファイルへの参照
def sjsirFiles
は JAR から file 読んで MemIRFileImpl
返す。
別の実装
うーん?なんか IRFile
から IRContainer
作ってるだけ、生の sjsir ファイルから作るんやろうな。
IRFile とは?
sjsir のファイル or インメモリのvirtualfile
-
entryPointInfo
とか -
tree
でif.Trees.ClassDef
-
version
もあるよ
IRFile の実装
NodeIRFileImpl
treeの実装がこんな感じでfile読み込みをしていることから、ファイルシステム上のファイルを指す IRFile
なんだろうな
MemClassDefIRFileImpl
単一 classdef を持つ IR のインメモリ表現
PersistentIRFile
これ実は cache から帰ってくる IRFile の実装はこれになってる。
引数に IRFileImpl
受け取って、loadTree
で underlying +irFile
を読み込んでるだけ
IRContainer -> IRFile with cache のおさらい
こんな感じでしたね PersistedFile
って何?
PersistedFile
はいはい ._files
で Seq[PersistedIRFile]
を返すのね。この _files
はどこで更新されるのかというと update
というメソッド
なんかこういうのやってるね
_files = {
performIO(file.sjsirFiles).map { files =>
files.map { file =>
new PersistentIRFile(IRFileImpl.fromIRFile(file))
}
}
version.sameVesrion がどうのこうのみたいなのやってるしここで cache invalidate してそう
まず最初に _version
(前回読み込んだ IRContainer の version) を比較、同じバージョンなら " yeepeeh, nothing to do" 確かに。statsReused
を更新する、なんで?
if (_version.sameVersion(file.version)) {
// yeepeeh, nothing to do
statsReused.incrementAndGet()
なんか synchronized
ブロックの中でもやってるけどなんで? マルチスレッドでやってるからだと思うけど、直後に synchronized ブロック内で同じ操作やる意味ある?
synchronized {
if (_version.sameVersion(file.version)) {
// someone else had the same idea and did our work
statsReused.incrementAndGet()
この PersistedFiles#update
は誰から呼ばれるのかというと CacheImpl#update(files: Seq[IRContainer])
なんとなく流れがわかったね。