Rustを1.36.0からバージョン1.38.0に更新した後、プログラムの実行速度が約50%遅くなっていることに気付きました。
を使用してperf
、プログラム時間の半分がalloc::vec::Vec<T>::retain
新しいバージョンで費やされていることを発見しました。古いバージョンでは、この機能は表示されません。retain
1.38.0ではなぜそんなに長くかかるのでしょうか?
への呼び出しretain
は次のように行われます:
some_vec.retain(|&x| x < DEADLINE);
deadline
は定数u32
でsome_vec
あり、Vec<u32>
です。
retain
どちらのバージョンでも、呼び出しなしでプログラムを実行しました。この場合、1.38.0は平均してまだ遅いですが、以前に見られた50%を超えるのではなく、最大10%だけ遅くなりました。
テストで何が起こったかを要約するには:
バージョン1.36.0
- with
retain
:〜18秒 - なし
retain
:〜11秒
バージョン1.38.0
- あり
retain
:〜28秒 - なし
retain
:〜12秒
再現可能な例として、以下を試すことができます。
use std::time::Instant;
fn main() {
let start = Instant::now();
let mut my_vec: Vec<u32>;
for _ in 0..100_000 {
my_vec = (0..10_000).collect();
my_vec.retain(|&x| x < 9000);
my_vec.retain(|&x| x < 8000);
my_vec.retain(|&x| x < 7000);
my_vec.retain(|&x| x < 6000);
my_vec.retain(|&x| x < 5000);
my_vec.retain(|&x| (x < 5) & (x > 2));
}
let duration = start.elapsed();
println!("Program took: {:?}", duration);
}
cargo +1.36.0 run --release
その後cargo +1.38.0 run --release
。
この小さな例では、私は得ました:
$ cargo +1.36.0 run --release
Program took: 4.624297719s
$ cargo +1.38.0 run --release
Program took: 8.293383522s
3
これはRust langチームに報告する必要があると思います。
—
Peter Hall
フィードバックに応じて質問を改善していただきありがとうございます。あなたは本当にそれを好転させました!返事をいただければ幸いです。
—
trentcl
私は少し掘り下げました:1.37.0は1.36.0のように高速です。毎晩遅いです。1.37と1.38の生成されたMIRは、コメントと関数の相対的な順序を無視すると同じように見えます。これは、rustcがLLVMパスの数/順序/種類を変更したか、rustcが使用するLLVMのバージョンが1.37の間で変更されたことを意味します。 1.38。これは、LLVM回帰およびrustc回帰です。残念ながら、どのように見分けるかわかりません。
—
trentcl