Wenn ich diesen Code ausführen:Warum ist der Zugriff auf ein Element eines großen Vektors von Strukturen im Debug-Modus langsamer als der Zugriff auf ein kleiner?
#[derive(Copy, Clone)]
pub struct Element {
pub key: u64,
}
pub fn test1(u: usize) {
let now = std::time::SystemTime::now();
let tt = vec![Element { key: 0 }; u];
for _ in 0..10000000 as u64 {
if tt[155].key == 893472348628 {}
}
match now.elapsed() {
Ok(elapsed) => {
println!(
"With struct, size of vec={}: Time elapsed: {}.{} seconds",
u,
elapsed.as_secs(),
elapsed.subsec_nanos()
);
}
Err(e) => {
println!("Error: {:?}", e);
panic!();
}
}
}
pub fn test2(u: usize) {
let now = std::time::SystemTime::now();
let tt = vec![0u64; u];
for _ in 0..10000000 as u64 {
if tt[155] == 893472348628 {}
}
match now.elapsed() {
Ok(elapsed) => {
println!(
"With u64, size of vec={}: Time elapsed: {}.{} seconds",
u,
elapsed.as_secs(),
elapsed.subsec_nanos()
);
}
Err(e) => {
println!("Error: {:?}", e);
panic!();
}
}
}
fn main() {
test1(100000);
test1(100000000);
test2(100000);
test2(100000000);
}
ich diese Ergebnisse:
With struct, size of vec=100000: Time elapsed: 1.268881822 seconds
With struct, size of vec=100000000: Time elapsed: 12.470818140 seconds
With u64, size of vec=100000: Time elapsed: 1.171180429 seconds
With u64, size of vec=100000000: Time elapsed: 1.230393828 seconds
Ich sehe keinen Grund, warum der zweite Funktionsaufruf 10-mal langsamer als die ersten sein soll. Ich habe es in Debug-Modus kompilieren seit Release-Modus diese Zeilen ignoriert:
if tt[155].key == 893472348628 {}
Ich habe eine 64-Bit-Linux-Rechner mit 8 GB RAM, vielleicht hat es etwas damit zu tun?
Ich möchte Ihnen die Änderungen empfehlen, die Sie an Ihrem Beitrag vorgenommen haben. Die Frage ist jetzt in einem * viel * besseren Zustand und konkret genug, um beantwortet zu werden. – Shepmaster