有多个 `package` 声明会减慢编译器的速度吗?

Does having multiple `package` declarations slow the compiler down?

我知道将包声明拆分成多行会创建隐式导入。所以这个:

package com.me.project
package module

等于:

package com.me.project.module
import com.me.project._

但是,如果 project 包中的对象发生更改,是否会触发 sbt 重新编译当前文件,还是取决于更改的对象是否在当前范围内实际调用?基本上,我想知道是否更明确,例如:

package com.me.project.module
import com.me.project.UtilClass
import com.me.project.Rng

与前两种方法相比,是否有助于加快编译时间?

不,加速任何事情都无济于事。实际上,这可能意味着您的编译时间甚至会增加,因为进行单次导入意味着编译器必须解析更多代码行。但是因为那仍然只需要纳秒,所以它并不算数。

导入声明只不过是向编译器提供有关在何处查找声明的信息。除非您从代码中引用它,否则编译器不需要对该信息做任何事情。在这种情况下,编译器也必须编译该文件,以便能够确定您的代码是否会进行类型检查。

换句话说,如果您实际上使用了数百个声明中的两个声明,那么它们是唯一会在更改时触发源代码重新编译的声明。

我并不是说这是唯一可能的行为,因为它可以以任何方式实现,但是以一种方式实现编译器,当对应于导入的代码时,它会触发代码的重新编译声明更改没有多大意义,当您考虑它时,这就是为什么它非常肯定地说它不会这样做的原因。因为,会发生什么?每个源文件都可能包含一个包声明和一些导入。如果您的代码因为通配符导入范围内的声明之一发生更改而被重新编译,那么所有其他文件也需要发生这种情况。并且因为您可以确定在每个应用程序中,所有现有导入或多或少都跨越了整个类路径,所以仅仅因为一个文件更改就需要重新编译整个类路径,这不是期望的行为。