GiganticMinecraft/SeichiAssist

[1.18] `Material` に対する match を error にする Scalafix rule を書く

Closed this issue · 10 comments

kory33 commented

#2115 にて露呈した問題で、1.13 以降の Spigot API では org.bukkit.Material の case 数が 1800 個を超えており、t: Material について t match { ... } と書くだけでコンパイル時間が 200 秒ほど増える現象が発生していた。

このため、org.bukkit.Material が scrutinee に来る match 式は Scalafix rule にてエラーとしたい (少数のそのような match が紛れ込んだ場合、数分程度コンパイル時間が伸び、気づかないことがありそうなので)。

んなことある?????

メモ: 帰ったらプロファイル結果を貼る
ついでに精査してscala/bugに上げる

kory33 commented

@KisaragiEffective

メモ: 帰ったらプロファイル結果を貼る ついでに精査してscala/bugに上げる

#2115 で入ってる d7cdb12 で Chrome Trace 生成するようにしたんで、 sbt compile するだけでプロファイル結果が生成されるようにはなってます

kory33 commented

(昨日軽くデバッガーで scalac の様子を覗いてたんですが、match optimization で unreachable arm の存在を調べるために明大論理ソルバを持ち出しているっぽくて、そこで無限に時間が掛かっていました 普通に想定していない大きさの enum という説はある)

1ad23ea

↑OnClickTitleMenuとBreakUtil.isAffectedByGravityはまぁ仕方ないだろうという気持ちになるが、それ以外は自明なパターンなので意味不明

最小化するため、試しに

enum Hello {
    E1,
    /* ... */
    E2000
}
object App {
    def main(args: Array[String]): Unit = {
        val x: Hello = Hello.E1
        x match {
            case Hello.E4 => println("E4")
            case _        => println("other")
        }
    }
}

という例を持ち出したら普通に4分程度かかった。sbt clean; compileをして上記コードをコンパイルした結果、scala.tools.nsc.transform.patmat.PatternMatching$OptimizeMatchTranslator.{unreachableCase,exhaustive}がCPU時間の99.9%を占めていたのでmatch関連なのは間違いない。

@kory33

(昨日軽くデバッガーで scalac の様子を覗いてたんですが、match optimization で unreachable arm の存在を調べるために明大論理ソルバを持ち出しているっぽくて、そこで無限に時間が掛かっていました 普通に想定していない大きさの enum という説はある)

もしかして: 命題論理ソルバ?

最小化するため、試しに

enum Hello {
    E1,
    /* ... */
    E2000
}
object App {
    def main(args: Array[String]): Unit = {
        val x: Hello = Hello.E1
        x match {
            case Hello.E4 => println("E4")
            case _        => println("other")
        }
    }
}

という例を持ち出したら普通に4分程度かかった。sbt clean; compileをして上記コードをコンパイルした結果、scala.tools.nsc.transform.patmat.PatternMatching$OptimizeMatchTranslator.{unreachableCase,exhaustive}がCPU時間の99.9%を占めていたのでmatch関連なのは間違いない。

tracked: scala/bug#12873

(scrutinee: @unchecked)もワークアラウンドになるらしいが、やりたくないなぁという気持ち