Description
#60444 has introduced a severe perf regression when building/testing the conch-runtime
crate.
Previously a test run would take ~5 mins, and with the latest nightly (rustc 1.36.0-nightly (372be4f36 2019-05-14)
) it now takes ~82(!!) mins.
$ git clone https://github.com/ipetkov/conch-runtime.git $ cd conch-runtime $ cargo test --lib # snip Finished dev [unoptimized + debuginfo] target(s) in 4m 16s $ cargo clean $ cargo +nightly test --lib # snip Finished dev [unoptimized + debuginfo] target(s) in 82m 54s
Crate info
The crate offers the functionality to execute shell programs. Each piece of the grammar is represented as a node which can hold generic sub-nodes. The reasoning for this is so that the crate consumer could customize their AST with different/custom nodes, while reusing existing implementations.The shell grammar is deeply recursive. Basically each command can vary in complexity (compound commands such as case
, for
, or simple commands like echo foo
), but is ultimately made up of a list of shell words (literals, interpolations, etc.). Because each word can contain a command substitution, the AST type is recursive (a Command<W>
has a Word<C>
type, which gives us Command<Word<Command<...>>
).
There are two "top-level" type definitions which seek to unify the entire AST tree concretely which are basically TopLevelCommand(Command<TopLevelWord>)
TopLevelWord(Word<TopLevelCommand>)
.
The crate also heavily uses generics and trait bounds (perhaps overly so), however, there's hopefully some low hanging fruits that can reduce the 16x slow down in performance.