Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

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

Closed
kory33 opened this issue Sep 17, 2023 · 10 comments
Closed
Assignees

Comments

@kory33
Copy link
Member

kory33 commented Sep 17, 2023

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

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

kory33 added a commit that referenced this issue Sep 17, 2023
これでコンパイル時間が大幅に短縮される (2000秒 -> 110秒)。詳細は #2226 を参照のこと。
@KisaragiEffective
Copy link
Member

んなことある?????

@KisaragiEffective
Copy link
Member

KisaragiEffective commented Sep 17, 2023

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

@kory33
Copy link
Member Author

kory33 commented Sep 17, 2023

@KisaragiEffective

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

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

@kory33
Copy link
Member Author

kory33 commented Sep 17, 2023

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

@KisaragiEffective
Copy link
Member

1ad23ea

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

@KisaragiEffective
Copy link
Member

最小化するため、試しに

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関連なのは間違いない。

@KisaragiEffective
Copy link
Member

@kory33

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

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

@KisaragiEffective
Copy link
Member

最小化するため、試しに

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

@KisaragiEffective
Copy link
Member

closed by #2227

@KisaragiEffective
Copy link
Member

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

outductor pushed a commit that referenced this issue Sep 30, 2023
これでコンパイル時間が大幅に短縮される (2000秒 -> 110秒)。詳細は #2226 を参照のこと。
outductor pushed a commit that referenced this issue Sep 30, 2023
これでコンパイル時間が大幅に短縮される (2000秒 -> 110秒)。詳細は #2226 を参照のこと。
outductor pushed a commit that referenced this issue Oct 5, 2023
これでコンパイル時間が大幅に短縮される (2000秒 -> 110秒)。詳細は #2226 を参照のこと。
rito528 pushed a commit that referenced this issue Oct 14, 2023
これでコンパイル時間が大幅に短縮される (2000秒 -> 110秒)。詳細は #2226 を参照のこと。
outductor pushed a commit that referenced this issue Oct 19, 2023
これでコンパイル時間が大幅に短縮される (2000秒 -> 110秒)。詳細は #2226 を参照のこと。
rito528 pushed a commit that referenced this issue Oct 22, 2023
これでコンパイル時間が大幅に短縮される (2000秒 -> 110秒)。詳細は #2226 を参照のこと。
outductor pushed a commit that referenced this issue Oct 27, 2023
これでコンパイル時間が大幅に短縮される (2000秒 -> 110秒)。詳細は #2226 を参照のこと。
outductor pushed a commit that referenced this issue Oct 27, 2023
これでコンパイル時間が大幅に短縮される (2000秒 -> 110秒)。詳細は #2226 を参照のこと。
rito528 pushed a commit that referenced this issue Nov 2, 2023
これでコンパイル時間が大幅に短縮される (2000秒 -> 110秒)。詳細は #2226 を参照のこと。
rito528 pushed a commit that referenced this issue Nov 2, 2023
これでコンパイル時間が大幅に短縮される (2000秒 -> 110秒)。詳細は #2226 を参照のこと。
rito528 pushed a commit that referenced this issue Nov 7, 2023
これでコンパイル時間が大幅に短縮される (2000秒 -> 110秒)。詳細は #2226 を参照のこと。
outductor pushed a commit that referenced this issue Nov 17, 2023
これでコンパイル時間が大幅に短縮される (2000秒 -> 110秒)。詳細は #2226 を参照のこと。
rito528 pushed a commit that referenced this issue Dec 3, 2023
これでコンパイル時間が大幅に短縮される (2000秒 -> 110秒)。詳細は #2226 を参照のこと。
rito528 pushed a commit that referenced this issue Dec 15, 2023
これでコンパイル時間が大幅に短縮される (2000秒 -> 110秒)。詳細は #2226 を参照のこと。
rito528 pushed a commit that referenced this issue Jan 8, 2024
これでコンパイル時間が大幅に短縮される (2000秒 -> 110秒)。詳細は #2226 を参照のこと。
rito528 pushed a commit that referenced this issue May 30, 2024
これでコンパイル時間が大幅に短縮される (2000秒 -> 110秒)。詳細は #2226 を参照のこと。
rito528 pushed a commit that referenced this issue Jun 21, 2024
これでコンパイル時間が大幅に短縮される (2000秒 -> 110秒)。詳細は #2226 を参照のこと。
outductor pushed a commit that referenced this issue Jul 7, 2024
これでコンパイル時間が大幅に短縮される (2000秒 -> 110秒)。詳細は #2226 を参照のこと。
outductor pushed a commit that referenced this issue Jul 10, 2024
これでコンパイル時間が大幅に短縮される (2000秒 -> 110秒)。詳細は #2226 を参照のこと。
outductor pushed a commit that referenced this issue Jul 12, 2024
これでコンパイル時間が大幅に短縮される (2000秒 -> 110秒)。詳細は #2226 を参照のこと。
outductor pushed a commit that referenced this issue Jul 25, 2024
これでコンパイル時間が大幅に短縮される (2000秒 -> 110秒)。詳細は #2226 を参照のこと。
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

3 participants