-
Notifications
You must be signed in to change notification settings - Fork 346
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
Showing
2 changed files
with
53 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,52 @@ | ||
--- | ||
id: compiler-performance | ||
title: "Compiler performance" | ||
--- | ||
Quill will probably make the slow scala compiler even slower, since a lot of additional `Parsing`, `Typechecking`, `Implicit resolution` works introduced to expand a Query. | ||
|
||
Following tips may help improving compilation time. | ||
|
||
## Use `-Yprofile-trace` scalac options. | ||
With `-Yprofile-trace` option, a chrome trace file will be produced after compilation. | ||
It will help figure out what slowing down the compiler. | ||
|
||
Note, this option need some tweak if you are running on java 9 or newer version. | ||
|
||
## Split large module into multiple submodules | ||
Since scalac is not fully parallelized, split into indepdent submodules can significantly reduce build time on multi-core cpu. | ||
|
||
## Define decoder/encoder directly instead of `MappedEncoding` | ||
|
||
`MappedEncoding` introduce more implicit resolutions, which may slow down compiler. | ||
|
||
It is possible to define instance directly. | ||
|
||
```scala | ||
case class FooId(id: Long) | ||
implicit val fooIdEncoder: Encoder[FooId] = mappedEncoder(MappedEncoding[FooId, Long](_.id), longEncoder) | ||
implicit val fooIdDecoder: Decoder[FooId] = mappedDecoder(MappedEncoding[Long, FooId](FooId(_)), longDecoder) | ||
``` | ||
|
||
## Share `QueryMeta` instance | ||
|
||
`QueryMeta` generation requires `Decoder` resolution, tree generation, typechecking, etc which can be very slow. | ||
|
||
`QueryMeta` is not shared by default, so define shared `QueryMeta` instance may reduce build time. | ||
|
||
```scala | ||
val ctx = SqlMirrorContext(MirrorIdiom, Literal) | ||
|
||
// Prevent using default macro generated query meta instance. | ||
// Use `-` instead of `*` if `-Xsource:3` not enabled. | ||
import ctx.{ materializeQueryMeta => *, * } | ||
|
||
// Instance type must not be specified here, otherwise it will become dynamic query. | ||
implicit val orderQueryMeta = ctx.materializeQueryMeta[Order] | ||
|
||
ctx.run { | ||
query[Order] | ||
} | ||
``` | ||
Note, to use [`-Xsource:3`](https://github.com/scala/scala/pull/10439) scalac options, `-Xmigration` or `-Wconf:cat=scala3-migration:w` is required. | ||
|
||
Otherwise, it will not compile due to lack of explicit type of implicit definition. |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters