sapling/eden/scm/lib/dag/benches/segment_sizes.rs

78 lines
2.7 KiB
Rust
Raw Normal View History

/*
* Copyright (c) Facebook, Inc. and its affiliates.
*
* This software may be used and distributed according to the terms of the
* GNU General Public License version 2.
*/
dag: add benchmark about various "segment size" choices Summary: Add a benchmark testing various segment sizes - time to build segments, log size, and ancestor calcuation performance. An initial output looks like: building segment_size=4 0.223 ms segments: [34859, 10972, 3156, 834, 218, 55, 13, 3] log len: 1194609 ancestor calcuation segment_size=4 1.510 s building segment_size=8 0.193 ms segments: [34859, 5472, 737, 95, 11, 1] log len: 958272 ancestor calcuation segment_size=8 1.630 s building segment_size=10 0.213 ms segments: [34859, 4339, 460, 46, 4] log len: 918468 ancestor calcuation segment_size=10 1.739 s building segment_size=12 0.187 ms segments: [34859, 3613, 316, 26, 2] log len: 893901 ancestor calcuation segment_size=12 1.934 s building segment_size=14 0.202 ms segments: [34859, 3034, 228, 16, 1] log len: 873677 ancestor calcuation segment_size=14 2.311 s building segment_size=16 0.199 ms segments: [34859, 2601, 172, 10] log len: 858211 ancestor calcuation segment_size=16 2.139 s building segment_size=18 0.193 ms segments: [34859, 2280, 133, 7] log len: 847505 ancestor calcuation segment_size=18 2.301 s building segment_size=20 0.175 ms segments: [34859, 2043, 105, 5] log len: 839458 ancestor calcuation segment_size=20 2.335 s building segment_size=22 0.187 ms segments: [34859, 1847, 85, 3] log len: 832764 ancestor calcuation segment_size=22 2.500 s building segment_size=24 0.206 ms segments: [34859, 1668, 71, 2] log len: 826775 ancestor calcuation segment_size=24 2.570 s building segment_size=32 0.194 ms segments: [34859, 1230, 38, 1] log len: 811701 ancestor calcuation segment_size=32 3.091 s building segment_size=64 0.215 ms segments: [34859, 598, 9] log len: 790230 ancestor calcuation segment_size=64 4.215 s building segment_size=128 0.281 ms segments: [34859, 293, 2] log len: 779475 ancestor calcuation segment_size=128 7.573 s It seems segment size = 8 to 20 might be a reasonable choice. Reviewed By: sfilipco Differential Revision: D16660078 fbshipit-source-id: f8af64c703ce0209b9b4c09112c9bdc4a1371172
2019-08-10 02:12:58 +03:00
use anyhow::Result;
use dag::{idmap::IdMap, segment::Dag, Group, Id};
dag: add benchmark about various "segment size" choices Summary: Add a benchmark testing various segment sizes - time to build segments, log size, and ancestor calcuation performance. An initial output looks like: building segment_size=4 0.223 ms segments: [34859, 10972, 3156, 834, 218, 55, 13, 3] log len: 1194609 ancestor calcuation segment_size=4 1.510 s building segment_size=8 0.193 ms segments: [34859, 5472, 737, 95, 11, 1] log len: 958272 ancestor calcuation segment_size=8 1.630 s building segment_size=10 0.213 ms segments: [34859, 4339, 460, 46, 4] log len: 918468 ancestor calcuation segment_size=10 1.739 s building segment_size=12 0.187 ms segments: [34859, 3613, 316, 26, 2] log len: 893901 ancestor calcuation segment_size=12 1.934 s building segment_size=14 0.202 ms segments: [34859, 3034, 228, 16, 1] log len: 873677 ancestor calcuation segment_size=14 2.311 s building segment_size=16 0.199 ms segments: [34859, 2601, 172, 10] log len: 858211 ancestor calcuation segment_size=16 2.139 s building segment_size=18 0.193 ms segments: [34859, 2280, 133, 7] log len: 847505 ancestor calcuation segment_size=18 2.301 s building segment_size=20 0.175 ms segments: [34859, 2043, 105, 5] log len: 839458 ancestor calcuation segment_size=20 2.335 s building segment_size=22 0.187 ms segments: [34859, 1847, 85, 3] log len: 832764 ancestor calcuation segment_size=22 2.500 s building segment_size=24 0.206 ms segments: [34859, 1668, 71, 2] log len: 826775 ancestor calcuation segment_size=24 2.570 s building segment_size=32 0.194 ms segments: [34859, 1230, 38, 1] log len: 811701 ancestor calcuation segment_size=32 3.091 s building segment_size=64 0.215 ms segments: [34859, 598, 9] log len: 790230 ancestor calcuation segment_size=64 4.215 s building segment_size=128 0.281 ms segments: [34859, 293, 2] log len: 779475 ancestor calcuation segment_size=128 7.573 s It seems segment size = 8 to 20 might be a reasonable choice. Reviewed By: sfilipco Differential Revision: D16660078 fbshipit-source-id: f8af64c703ce0209b9b4c09112c9bdc4a1371172
2019-08-10 02:12:58 +03:00
use minibench::{
bench, elapsed,
measure::{self, Measure},
};
use tempfile::tempdir;
mod bindag;
dag: add benchmark about various "segment size" choices Summary: Add a benchmark testing various segment sizes - time to build segments, log size, and ancestor calcuation performance. An initial output looks like: building segment_size=4 0.223 ms segments: [34859, 10972, 3156, 834, 218, 55, 13, 3] log len: 1194609 ancestor calcuation segment_size=4 1.510 s building segment_size=8 0.193 ms segments: [34859, 5472, 737, 95, 11, 1] log len: 958272 ancestor calcuation segment_size=8 1.630 s building segment_size=10 0.213 ms segments: [34859, 4339, 460, 46, 4] log len: 918468 ancestor calcuation segment_size=10 1.739 s building segment_size=12 0.187 ms segments: [34859, 3613, 316, 26, 2] log len: 893901 ancestor calcuation segment_size=12 1.934 s building segment_size=14 0.202 ms segments: [34859, 3034, 228, 16, 1] log len: 873677 ancestor calcuation segment_size=14 2.311 s building segment_size=16 0.199 ms segments: [34859, 2601, 172, 10] log len: 858211 ancestor calcuation segment_size=16 2.139 s building segment_size=18 0.193 ms segments: [34859, 2280, 133, 7] log len: 847505 ancestor calcuation segment_size=18 2.301 s building segment_size=20 0.175 ms segments: [34859, 2043, 105, 5] log len: 839458 ancestor calcuation segment_size=20 2.335 s building segment_size=22 0.187 ms segments: [34859, 1847, 85, 3] log len: 832764 ancestor calcuation segment_size=22 2.500 s building segment_size=24 0.206 ms segments: [34859, 1668, 71, 2] log len: 826775 ancestor calcuation segment_size=24 2.570 s building segment_size=32 0.194 ms segments: [34859, 1230, 38, 1] log len: 811701 ancestor calcuation segment_size=32 3.091 s building segment_size=64 0.215 ms segments: [34859, 598, 9] log len: 790230 ancestor calcuation segment_size=64 4.215 s building segment_size=128 0.281 ms segments: [34859, 293, 2] log len: 779475 ancestor calcuation segment_size=128 7.573 s It seems segment size = 8 to 20 might be a reasonable choice. Reviewed By: sfilipco Differential Revision: D16660078 fbshipit-source-id: f8af64c703ce0209b9b4c09112c9bdc4a1371172
2019-08-10 02:12:58 +03:00
fn main() {
let parents = bindag::parse_bindag(bindag::MOZILLA);
dag: add benchmark about various "segment size" choices Summary: Add a benchmark testing various segment sizes - time to build segments, log size, and ancestor calcuation performance. An initial output looks like: building segment_size=4 0.223 ms segments: [34859, 10972, 3156, 834, 218, 55, 13, 3] log len: 1194609 ancestor calcuation segment_size=4 1.510 s building segment_size=8 0.193 ms segments: [34859, 5472, 737, 95, 11, 1] log len: 958272 ancestor calcuation segment_size=8 1.630 s building segment_size=10 0.213 ms segments: [34859, 4339, 460, 46, 4] log len: 918468 ancestor calcuation segment_size=10 1.739 s building segment_size=12 0.187 ms segments: [34859, 3613, 316, 26, 2] log len: 893901 ancestor calcuation segment_size=12 1.934 s building segment_size=14 0.202 ms segments: [34859, 3034, 228, 16, 1] log len: 873677 ancestor calcuation segment_size=14 2.311 s building segment_size=16 0.199 ms segments: [34859, 2601, 172, 10] log len: 858211 ancestor calcuation segment_size=16 2.139 s building segment_size=18 0.193 ms segments: [34859, 2280, 133, 7] log len: 847505 ancestor calcuation segment_size=18 2.301 s building segment_size=20 0.175 ms segments: [34859, 2043, 105, 5] log len: 839458 ancestor calcuation segment_size=20 2.335 s building segment_size=22 0.187 ms segments: [34859, 1847, 85, 3] log len: 832764 ancestor calcuation segment_size=22 2.500 s building segment_size=24 0.206 ms segments: [34859, 1668, 71, 2] log len: 826775 ancestor calcuation segment_size=24 2.570 s building segment_size=32 0.194 ms segments: [34859, 1230, 38, 1] log len: 811701 ancestor calcuation segment_size=32 3.091 s building segment_size=64 0.215 ms segments: [34859, 598, 9] log len: 790230 ancestor calcuation segment_size=64 4.215 s building segment_size=128 0.281 ms segments: [34859, 293, 2] log len: 779475 ancestor calcuation segment_size=128 7.573 s It seems segment size = 8 to 20 might be a reasonable choice. Reviewed By: sfilipco Differential Revision: D16660078 fbshipit-source-id: f8af64c703ce0209b9b4c09112c9bdc4a1371172
2019-08-10 02:12:58 +03:00
let head_name = format!("{}", parents.len() - 1).as_bytes().to_vec();
let parents_by_name = |name: &[u8]| -> Result<Vec<Box<[u8]>>> {
dag: add benchmark about various "segment size" choices Summary: Add a benchmark testing various segment sizes - time to build segments, log size, and ancestor calcuation performance. An initial output looks like: building segment_size=4 0.223 ms segments: [34859, 10972, 3156, 834, 218, 55, 13, 3] log len: 1194609 ancestor calcuation segment_size=4 1.510 s building segment_size=8 0.193 ms segments: [34859, 5472, 737, 95, 11, 1] log len: 958272 ancestor calcuation segment_size=8 1.630 s building segment_size=10 0.213 ms segments: [34859, 4339, 460, 46, 4] log len: 918468 ancestor calcuation segment_size=10 1.739 s building segment_size=12 0.187 ms segments: [34859, 3613, 316, 26, 2] log len: 893901 ancestor calcuation segment_size=12 1.934 s building segment_size=14 0.202 ms segments: [34859, 3034, 228, 16, 1] log len: 873677 ancestor calcuation segment_size=14 2.311 s building segment_size=16 0.199 ms segments: [34859, 2601, 172, 10] log len: 858211 ancestor calcuation segment_size=16 2.139 s building segment_size=18 0.193 ms segments: [34859, 2280, 133, 7] log len: 847505 ancestor calcuation segment_size=18 2.301 s building segment_size=20 0.175 ms segments: [34859, 2043, 105, 5] log len: 839458 ancestor calcuation segment_size=20 2.335 s building segment_size=22 0.187 ms segments: [34859, 1847, 85, 3] log len: 832764 ancestor calcuation segment_size=22 2.500 s building segment_size=24 0.206 ms segments: [34859, 1668, 71, 2] log len: 826775 ancestor calcuation segment_size=24 2.570 s building segment_size=32 0.194 ms segments: [34859, 1230, 38, 1] log len: 811701 ancestor calcuation segment_size=32 3.091 s building segment_size=64 0.215 ms segments: [34859, 598, 9] log len: 790230 ancestor calcuation segment_size=64 4.215 s building segment_size=128 0.281 ms segments: [34859, 293, 2] log len: 779475 ancestor calcuation segment_size=128 7.573 s It seems segment size = 8 to 20 might be a reasonable choice. Reviewed By: sfilipco Differential Revision: D16660078 fbshipit-source-id: f8af64c703ce0209b9b4c09112c9bdc4a1371172
2019-08-10 02:12:58 +03:00
let i = String::from_utf8(name.to_vec())
.unwrap()
.parse::<usize>()
.unwrap();
Ok(parents[i]
.iter()
.map(|p| format!("{}", p).as_bytes().to_vec().into())
.collect())
};
let id_map_dir = tempdir().unwrap();
let mut id_map = IdMap::open(id_map_dir.path()).unwrap();
id_map
.assign_head(&head_name, &parents_by_name, Group::MASTER)
.unwrap();
dag: add benchmark about various "segment size" choices Summary: Add a benchmark testing various segment sizes - time to build segments, log size, and ancestor calcuation performance. An initial output looks like: building segment_size=4 0.223 ms segments: [34859, 10972, 3156, 834, 218, 55, 13, 3] log len: 1194609 ancestor calcuation segment_size=4 1.510 s building segment_size=8 0.193 ms segments: [34859, 5472, 737, 95, 11, 1] log len: 958272 ancestor calcuation segment_size=8 1.630 s building segment_size=10 0.213 ms segments: [34859, 4339, 460, 46, 4] log len: 918468 ancestor calcuation segment_size=10 1.739 s building segment_size=12 0.187 ms segments: [34859, 3613, 316, 26, 2] log len: 893901 ancestor calcuation segment_size=12 1.934 s building segment_size=14 0.202 ms segments: [34859, 3034, 228, 16, 1] log len: 873677 ancestor calcuation segment_size=14 2.311 s building segment_size=16 0.199 ms segments: [34859, 2601, 172, 10] log len: 858211 ancestor calcuation segment_size=16 2.139 s building segment_size=18 0.193 ms segments: [34859, 2280, 133, 7] log len: 847505 ancestor calcuation segment_size=18 2.301 s building segment_size=20 0.175 ms segments: [34859, 2043, 105, 5] log len: 839458 ancestor calcuation segment_size=20 2.335 s building segment_size=22 0.187 ms segments: [34859, 1847, 85, 3] log len: 832764 ancestor calcuation segment_size=22 2.500 s building segment_size=24 0.206 ms segments: [34859, 1668, 71, 2] log len: 826775 ancestor calcuation segment_size=24 2.570 s building segment_size=32 0.194 ms segments: [34859, 1230, 38, 1] log len: 811701 ancestor calcuation segment_size=32 3.091 s building segment_size=64 0.215 ms segments: [34859, 598, 9] log len: 790230 ancestor calcuation segment_size=64 4.215 s building segment_size=128 0.281 ms segments: [34859, 293, 2] log len: 779475 ancestor calcuation segment_size=128 7.573 s It seems segment size = 8 to 20 might be a reasonable choice. Reviewed By: sfilipco Differential Revision: D16660078 fbshipit-source-id: f8af64c703ce0209b9b4c09112c9bdc4a1371172
2019-08-10 02:12:58 +03:00
let head_id = id_map.find_id_by_slice(&head_name).unwrap().unwrap();
let parents_by_id = id_map.build_get_parents_by_id(&parents_by_name);
// Test the size, and generation speed, and ancestor calcuation speed
// with some different segment sizes.
for &segment_size in [4, 8, 10, 12, 14, 16, 18, 20, 22, 24, 32, 64, 128].iter() {
let dag_dir = tempdir().unwrap();
let mut built = false;
bench(format!("building segment_size={}", segment_size), || {
built = true;
measure::Both::<measure::WallClock, String>::measure(|| {
let mut dag = Dag::open(&dag_dir.path()).unwrap();
dag.set_new_segment_size(segment_size);
let mut syncable = dag.prepare_filesystem_sync().unwrap();
let segment_len = syncable
.build_segments_persistent(head_id, &parents_by_id)
.unwrap();
syncable.sync(std::iter::once(&mut dag)).unwrap();
dag: add benchmark about various "segment size" choices Summary: Add a benchmark testing various segment sizes - time to build segments, log size, and ancestor calcuation performance. An initial output looks like: building segment_size=4 0.223 ms segments: [34859, 10972, 3156, 834, 218, 55, 13, 3] log len: 1194609 ancestor calcuation segment_size=4 1.510 s building segment_size=8 0.193 ms segments: [34859, 5472, 737, 95, 11, 1] log len: 958272 ancestor calcuation segment_size=8 1.630 s building segment_size=10 0.213 ms segments: [34859, 4339, 460, 46, 4] log len: 918468 ancestor calcuation segment_size=10 1.739 s building segment_size=12 0.187 ms segments: [34859, 3613, 316, 26, 2] log len: 893901 ancestor calcuation segment_size=12 1.934 s building segment_size=14 0.202 ms segments: [34859, 3034, 228, 16, 1] log len: 873677 ancestor calcuation segment_size=14 2.311 s building segment_size=16 0.199 ms segments: [34859, 2601, 172, 10] log len: 858211 ancestor calcuation segment_size=16 2.139 s building segment_size=18 0.193 ms segments: [34859, 2280, 133, 7] log len: 847505 ancestor calcuation segment_size=18 2.301 s building segment_size=20 0.175 ms segments: [34859, 2043, 105, 5] log len: 839458 ancestor calcuation segment_size=20 2.335 s building segment_size=22 0.187 ms segments: [34859, 1847, 85, 3] log len: 832764 ancestor calcuation segment_size=22 2.500 s building segment_size=24 0.206 ms segments: [34859, 1668, 71, 2] log len: 826775 ancestor calcuation segment_size=24 2.570 s building segment_size=32 0.194 ms segments: [34859, 1230, 38, 1] log len: 811701 ancestor calcuation segment_size=32 3.091 s building segment_size=64 0.215 ms segments: [34859, 598, 9] log len: 790230 ancestor calcuation segment_size=64 4.215 s building segment_size=128 0.281 ms segments: [34859, 293, 2] log len: 779475 ancestor calcuation segment_size=128 7.573 s It seems segment size = 8 to 20 might be a reasonable choice. Reviewed By: sfilipco Differential Revision: D16660078 fbshipit-source-id: f8af64c703ce0209b9b4c09112c9bdc4a1371172
2019-08-10 02:12:58 +03:00
let log_len = dag_dir.path().join("log").metadata().unwrap().len();
format!("segments: {} log len: {}", segment_len, log_len)
dag: add benchmark about various "segment size" choices Summary: Add a benchmark testing various segment sizes - time to build segments, log size, and ancestor calcuation performance. An initial output looks like: building segment_size=4 0.223 ms segments: [34859, 10972, 3156, 834, 218, 55, 13, 3] log len: 1194609 ancestor calcuation segment_size=4 1.510 s building segment_size=8 0.193 ms segments: [34859, 5472, 737, 95, 11, 1] log len: 958272 ancestor calcuation segment_size=8 1.630 s building segment_size=10 0.213 ms segments: [34859, 4339, 460, 46, 4] log len: 918468 ancestor calcuation segment_size=10 1.739 s building segment_size=12 0.187 ms segments: [34859, 3613, 316, 26, 2] log len: 893901 ancestor calcuation segment_size=12 1.934 s building segment_size=14 0.202 ms segments: [34859, 3034, 228, 16, 1] log len: 873677 ancestor calcuation segment_size=14 2.311 s building segment_size=16 0.199 ms segments: [34859, 2601, 172, 10] log len: 858211 ancestor calcuation segment_size=16 2.139 s building segment_size=18 0.193 ms segments: [34859, 2280, 133, 7] log len: 847505 ancestor calcuation segment_size=18 2.301 s building segment_size=20 0.175 ms segments: [34859, 2043, 105, 5] log len: 839458 ancestor calcuation segment_size=20 2.335 s building segment_size=22 0.187 ms segments: [34859, 1847, 85, 3] log len: 832764 ancestor calcuation segment_size=22 2.500 s building segment_size=24 0.206 ms segments: [34859, 1668, 71, 2] log len: 826775 ancestor calcuation segment_size=24 2.570 s building segment_size=32 0.194 ms segments: [34859, 1230, 38, 1] log len: 811701 ancestor calcuation segment_size=32 3.091 s building segment_size=64 0.215 ms segments: [34859, 598, 9] log len: 790230 ancestor calcuation segment_size=64 4.215 s building segment_size=128 0.281 ms segments: [34859, 293, 2] log len: 779475 ancestor calcuation segment_size=128 7.573 s It seems segment size = 8 to 20 might be a reasonable choice. Reviewed By: sfilipco Differential Revision: D16660078 fbshipit-source-id: f8af64c703ce0209b9b4c09112c9bdc4a1371172
2019-08-10 02:12:58 +03:00
})
});
bench(
format!("ancestor calcuation segment_size={}", segment_size),
|| {
assert!(built, "segments must be built to run this benchmak");
let dag = Dag::open(&dag_dir.path()).unwrap();
elapsed(|| {
for i in (0..parents.len() as u64).step_by(10079) {
for j in (1..parents.len() as u64).step_by(2351) {
dag.gca_one((Id(i), Id(j))).unwrap();
dag: add benchmark about various "segment size" choices Summary: Add a benchmark testing various segment sizes - time to build segments, log size, and ancestor calcuation performance. An initial output looks like: building segment_size=4 0.223 ms segments: [34859, 10972, 3156, 834, 218, 55, 13, 3] log len: 1194609 ancestor calcuation segment_size=4 1.510 s building segment_size=8 0.193 ms segments: [34859, 5472, 737, 95, 11, 1] log len: 958272 ancestor calcuation segment_size=8 1.630 s building segment_size=10 0.213 ms segments: [34859, 4339, 460, 46, 4] log len: 918468 ancestor calcuation segment_size=10 1.739 s building segment_size=12 0.187 ms segments: [34859, 3613, 316, 26, 2] log len: 893901 ancestor calcuation segment_size=12 1.934 s building segment_size=14 0.202 ms segments: [34859, 3034, 228, 16, 1] log len: 873677 ancestor calcuation segment_size=14 2.311 s building segment_size=16 0.199 ms segments: [34859, 2601, 172, 10] log len: 858211 ancestor calcuation segment_size=16 2.139 s building segment_size=18 0.193 ms segments: [34859, 2280, 133, 7] log len: 847505 ancestor calcuation segment_size=18 2.301 s building segment_size=20 0.175 ms segments: [34859, 2043, 105, 5] log len: 839458 ancestor calcuation segment_size=20 2.335 s building segment_size=22 0.187 ms segments: [34859, 1847, 85, 3] log len: 832764 ancestor calcuation segment_size=22 2.500 s building segment_size=24 0.206 ms segments: [34859, 1668, 71, 2] log len: 826775 ancestor calcuation segment_size=24 2.570 s building segment_size=32 0.194 ms segments: [34859, 1230, 38, 1] log len: 811701 ancestor calcuation segment_size=32 3.091 s building segment_size=64 0.215 ms segments: [34859, 598, 9] log len: 790230 ancestor calcuation segment_size=64 4.215 s building segment_size=128 0.281 ms segments: [34859, 293, 2] log len: 779475 ancestor calcuation segment_size=128 7.573 s It seems segment size = 8 to 20 might be a reasonable choice. Reviewed By: sfilipco Differential Revision: D16660078 fbshipit-source-id: f8af64c703ce0209b9b4c09112c9bdc4a1371172
2019-08-10 02:12:58 +03:00
}
}
})
},
);
}
}