处理使用诸如circe,enumeratum和shapeless
等库的scala项目我们定义了一些枚举,即Region; EntityType和EntityAction 例如
sealed trait EntityAction extends EnumEntry with Hyphencase
case object EntityAction extends Enum[EntityAction] with CirceEnum[EntityAction] {
//noinspection ScalaStyle
case object * extends EntityAction
case object CreateUser extends EntityAction
... omitted ...
}
我们还有一个定义为
的权限模型case class Permission(
resource: EntityType,
regions: Set[Region],
actions: Set[EntityAction],
instances: Set[String]
)
我们还有一个UserEntityModel(以json格式保存在我们的数据存储中)和一个作为http响应的一部分返回的UserModel
case class UserEntityV1(
override val entityKey: EntityKey,
firstName: String,
lastName: String,
override val email: String,
override val permissions: Set[Permission],
override val revokedPermissions: Set[Permission],
override val status: EntityStatus
...
) extends UserEntity
EntityKey包含Region枚举,省略的字段包含非枚举类型
case class User(
override val uuid: Option[String] = None,
firstName: String,
lastName: String,
email: String,
status: EntityStatus,
permissions: Set[Permission],
revokedPermissions: Set[Permission]
...
) extends HasPayload
如果没有UserEntity和User模型的权限和revokedPermissions,clean compile
时间不到3分钟。包含这些字段后,编译器将运行到
java.lang.OutOfMemoryError: GC overhead limit exceeded
at java.util.Arrays.copyOfRange(Arrays.java:3664)
at java.lang.String.<init>(String.java:201)
at java.lang.StringBuilder.toString(StringBuilder.java:407)
at scala.tools.nsc.transform.Erasure.fullNameInSig$1(Erasure.scala:261)
at scala.tools.nsc.transform.Erasure.classSig$1(Erasure.scala:292)
at scala.tools.nsc.transform.Erasure.jsig$1(Erasure.scala:336)
at scala.tools.nsc.transform.Erasure.boxedSig$1(Erasure.scala:243)
at scala.tools.nsc.transform.Erasure.argSig$1(Erasure.scala:281)
at scala.tools.nsc.transform.Erasure.$anonfun$javaSig$8(Erasure.scala:295)
at scala.tools.nsc.transform.Erasure.classSig$1(Erasure.scala:295)
at scala.tools.nsc.transform.Erasure.jsig$1(Erasure.scala:336)
at scala.tools.nsc.transform.Erasure.boxedSig$1(Erasure.scala:243)
at scala.tools.nsc.transform.Erasure.argSig$1(Erasure.scala:281)
at scala.tools.nsc.transform.Erasure.$anonfun$javaSig$8(Erasure.scala:295)
at scala.tools.nsc.transform.Erasure.classSig$1(Erasure.scala:295)
at scala.tools.nsc.transform.Erasure.jsig$1(Erasure.scala:336)
at scala.tools.nsc.transform.Erasure.boxedSig$1(Erasure.scala:243)
at scala.tools.nsc.transform.Erasure.argSig$1(Erasure.scala:281)
at scala.tools.nsc.transform.Erasure.$anonfun$javaSig$8(Erasure.scala:295)
at scala.tools.nsc.transform.Erasure.classSig$1(Erasure.scala:295)
at scala.tools.nsc.transform.Erasure.jsig$1(Erasure.scala:336)
at scala.tools.nsc.transform.Erasure.boxedSig$1(Erasure.scala:243)
at scala.tools.nsc.transform.Erasure.argSig$1(Erasure.scala:281)
at scala.tools.nsc.transform.Erasure.$anonfun$javaSig$8(Erasure.scala:295)
at scala.tools.nsc.transform.Erasure.classSig$1(Erasure.scala:295)
at scala.tools.nsc.transform.Erasure.jsig$1(Erasure.scala:336)
at scala.tools.nsc.transform.Erasure.boxedSig$1(Erasure.scala:243)
at scala.tools.nsc.transform.Erasure.argSig$1(Erasure.scala:281)
at scala.tools.nsc.transform.Erasure.$anonfun$javaSig$8(Erasure.scala:295)
at scala.tools.nsc.transform.Erasure.classSig$1(Erasure.scala:295)
at scala.tools.nsc.transform.Erasure.jsig$1(Erasure.scala:336)
at scala.tools.nsc.transform.Erasure.jsig$1(Erasure.scala:359)
我们通过定义.sbtopts来解决它 玩了几个变种,因为它是当前的.sbtopts是
-J-Xms1024M
-J-Xmx4G
-J-XX:ReservedCodeCacheSize=256M
-J-XX:MaxMetaspaceSize=1024M
-J-Xss2M
使用diff Xss值以及指定-mem,似乎没有太大的差异。
但是,如果包含这些字段,clean compile
时间平均值现在几乎为7分钟(因为用户实体在少数地方使用)
所有迹象都指向宏编译。我们正在使用自动推导。有没有办法保持样板免费并保持枚举的类型安全,但减少编译时间。
当前版本
scala version = 2.12.1
sbt version = 0.13.13
circeVersion = "0.7.0"
enumeratumVersion = "1.5.10"
enumeratumCirceVersion = "1.5.10"
shapelessVersion = "2.3.2"
在更新到最新版本的库和scala 2.12.3时,编译时间会跳到差不多20分钟
尝试执行debugging slow compile time
中的一些步骤据我所知,它可以保持其专业阶段