about summary refs log tree commit diff
path: root/src/rustllvm/RustWrapper.cpp
diff options
context:
space:
mode:
authorAriel Ben-Yehuda <arielb1@mail.tau.ac.il>2015-08-24 23:27:00 +0300
committerAriel Ben-Yehuda <ariel.byd@gmail.com>2015-09-03 01:42:18 +0300
commitab86bf53eb2fb9289c7ce811d1615eff2c529e34 (patch)
treecb9012cce6643929300130b29cfc2b4713fc38dd /src/rustllvm/RustWrapper.cpp
parentcfd76b364cd01695517467299618ef63f1c0cc07 (diff)
downloadrust-ab86bf53eb2fb9289c7ce811d1615eff2c529e34.tar.gz
rust-ab86bf53eb2fb9289c7ce811d1615eff2c529e34.zip
consolidate type-variable handling in assemble_candidates
this resolves type-variables early in assemble_candidates and
bails out quickly if the self type is an inference variable (which would
fail anyway because of `assemble_candidates_from_projected_tys`).

In both these cases, `assemble_candidates_from_impls` would try to go
over all impls and match them, leading to O(n*m) performance. Fixing this
improves rustc type-checking performance by 10%. As type-checking is only
is 5% of compilation, this doesn't impact bootstrap times, but *does*
improve type-error-detection time which is nice.

Crates that have many dependencies and contain significant amounts of
generic functions could see a bigger perf boost. As a microbenchmark,
the crate generated by

echo '#![feature(rustc_private)]'
echo 'extern crate rustc_driver;'
for i in {1..1000}; do cat << _EOF_
    pub fn foo$i<T>() {
        let mut v = Vec::new();
        let _w = v.clone();
        v.push("");
    }
_EOF_
done

sees performance improve from 7.2 to 1.4 seconds. I imagine many crates
would fall somewhere in-between.
Diffstat (limited to 'src/rustllvm/RustWrapper.cpp')
0 files changed, 0 insertions, 0 deletions