Skip to content

Commit

Permalink
Regression: fix compilation performance on Windows (#20193)
Browse files Browse the repository at this point in the history
Caches isDirectory calls

Too many of them were added in
607e4d5
and this degraded compilation performance by up to 100% on Windows

Fixes #19924
backport to release-3.4.2
  • Loading branch information
jchyb authored May 7, 2024
2 parents e85fa42 + 2970646 commit 17c8766
Show file tree
Hide file tree
Showing 6 changed files with 2 additions and 33 deletions.
6 changes: 0 additions & 6 deletions compiler/src/dotty/tools/io/AbstractFile.scala
Original file line number Diff line number Diff line change
Expand Up @@ -136,12 +136,6 @@ abstract class AbstractFile extends Iterable[AbstractFile] {
/** Does this abstract file represent something which can contain classfiles? */
def isClassContainer: Boolean = isDirectory || (jpath != null && ext.isJarOrZip)

/** Create a file on disk, if one does not exist already. */
def create(): Unit

/** Delete the underlying file or directory (recursively). */
def delete(): Unit

/** Is this abstract file a directory? */
def isDirectory: Boolean

Expand Down
2 changes: 0 additions & 2 deletions compiler/src/dotty/tools/io/NoAbstractFile.scala
Original file line number Diff line number Diff line change
Expand Up @@ -17,8 +17,6 @@ import java.io.InputStream
object NoAbstractFile extends AbstractFile {
def absolute: AbstractFile = this
def container: AbstractFile = this
def create(): Unit = ???
def delete(): Unit = ???
def jpath: JPath = null
def input: InputStream = null
def isDirectory: Boolean = false
Expand Down
13 changes: 2 additions & 11 deletions compiler/src/dotty/tools/io/PlainFile.scala
Original file line number Diff line number Diff line change
Expand Up @@ -13,9 +13,8 @@ import java.nio.file.{InvalidPathException, Paths}

/** ''Note: This library is considered experimental and should not be used unless you know what you are doing.'' */
class PlainDirectory(givenPath: Directory) extends PlainFile(givenPath) {
override def isDirectory: Boolean = true
override val isDirectory: Boolean = true
override def iterator(): Iterator[PlainFile] = givenPath.list.filter(_.exists).map(new PlainFile(_))
override def delete(): Unit = givenPath.deleteRecursively()
}

/** This class implements an abstract file backed by a File.
Expand Down Expand Up @@ -78,7 +77,7 @@ class PlainFile(val givenPath: Path) extends AbstractFile {
}

/** Is this abstract file a directory? */
def isDirectory: Boolean = givenPath.isDirectory
val isDirectory: Boolean = givenPath.isDirectory // cached for performance on Windows

/** Returns the time that this abstract file was last modified. */
def lastModified: Long = givenPath.lastModified.toMillis
Expand Down Expand Up @@ -113,14 +112,6 @@ class PlainFile(val givenPath: Path) extends AbstractFile {
null
}

/** Does this abstract file denote an existing file? */
def create(): Unit = if (!exists) givenPath.createFile()

/** Delete the underlying file or directory (recursively). */
def delete(): Unit =
if (givenPath.isFile) givenPath.delete()
else if (givenPath.isDirectory) givenPath.toDirectory.deleteRecursively()

/** Returns a plain file with the given name. It does not
* check that it exists.
*/
Expand Down
6 changes: 0 additions & 6 deletions compiler/src/dotty/tools/io/VirtualDirectory.scala
Original file line number Diff line number Diff line change
Expand Up @@ -34,12 +34,6 @@ extends AbstractFile {
override def input: InputStream = sys.error("directories cannot be read")
override def output: OutputStream = sys.error("directories cannot be written")

/** Does this abstract file denote an existing file? */
def create(): Unit = { unsupported() }

/** Delete the underlying file or directory (recursively). */
def delete(): Unit = { unsupported() }

/** Returns an abstract file with the given name. It does not
* check that it exists.
*/
Expand Down
6 changes: 0 additions & 6 deletions compiler/src/dotty/tools/io/VirtualFile.scala
Original file line number Diff line number Diff line change
Expand Up @@ -82,12 +82,6 @@ class VirtualFile(val name: String, override val path: String) extends AbstractF
Iterator.empty
}

/** Does this abstract file denote an existing file? */
def create(): Unit = unsupported()

/** Delete the underlying file or directory (recursively). */
def delete(): Unit = unsupported()

/**
* Returns the abstract file in this abstract directory with the
* specified name. If there is no such file, returns null. The
Expand Down
2 changes: 0 additions & 2 deletions compiler/src/dotty/tools/io/ZipArchive.scala
Original file line number Diff line number Diff line change
Expand Up @@ -61,8 +61,6 @@ abstract class ZipArchive(override val jpath: JPath, release: Option[String]) ex
def isDirectory: Boolean = true
def lookupName(name: String, directory: Boolean): AbstractFile = unsupported()
def lookupNameUnchecked(name: String, directory: Boolean): AbstractFile = unsupported()
def create(): Unit = unsupported()
def delete(): Unit = unsupported()
def output: OutputStream = unsupported()
def container: AbstractFile = unsupported()
def absolute: AbstractFile = unsupported()
Expand Down

0 comments on commit 17c8766

Please sign in to comment.