Rust 1.38.0にアップデートした後、Vec :: retainの実行が遅くなるのはなぜですか?


8

Rustを1.36.0からバージョン1.38.0に更新した後、プログラムの実行速度が約50%遅くなっていることに気付きました。

を使用してperf、プログラム時間の半分がalloc::vec::Vec<T>::retain新しいバージョンで費やされていることを発見しました。古いバージョンでは、この機能は表示されません。retain1.38.0ではなぜそんなに長くかかるのでしょうか?

への呼び出しretainは次のように行われます:

some_vec.retain(|&x| x < DEADLINE);

deadlineは定数u32some_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

2
私は少し掘り下げました:1.37.0は1.36.0のように高速です。毎晩遅いです。1.37と1.38の生成されたMIRは、コメントと関数の相対的な順序を無視すると同じように見えます。これは、rustcがLLVMパスの数/順序/種類を変更したか、rustcが使用するLLVMのバージョンが1.37の間で変更されたことを意味します。 1.38。これは、LLVM回帰およびrustc回帰です。残念ながら、どのように見分けるかわかりません。
trentcl

ここで @Miguelが提出されたことをバグレポートです
harmic

回答:


2

一般に、rust.godbolt.orgは、生成されたコードの品質をチェックするのに役立ちます(ただし、最適化フラグを追加することを忘れないでください!)

あなたの場合、生成されたコードretainは明らかに悪化しています:https : //rust.godbolt.org/z/ZhVCDg

したがって、それをパフォーマンスの低下としてRustに報告する必要があります。


1
@Peter Hallが提案したように、私はすでに錆びていることを報告しました。
ミゲル

4
好奇心旺盛な方へ:github.com/rust-lang/rust/issues/65970
mcarton
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.