src/bin/test_chunk_speed2.rs: test chunker speed with real data
This commit is contained in:
		
							
								
								
									
										53
									
								
								src/bin/test_chunk_speed2.rs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										53
									
								
								src/bin/test_chunk_speed2.rs
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,53 @@ | ||||
| use failure::*; | ||||
| use futures::*; | ||||
| use std::sync::atomic::{AtomicUsize, Ordering}; | ||||
|  | ||||
| extern crate proxmox_backup; | ||||
|  | ||||
| use proxmox_backup::backup::*; | ||||
|  | ||||
| // Test Chunker with real data read from a file. | ||||
| // | ||||
| // To generate some test input use: | ||||
| // # dd if=/dev/urandom of=random-test.dat bs=1M count=1024 iflag=fullblock | ||||
| // | ||||
| // Note: I can currently get about 830MB/s | ||||
|  | ||||
| fn main() { | ||||
|  | ||||
|     let repeat = std::sync::Arc::new(AtomicUsize::new(0)); | ||||
|     let repeat2 = repeat.clone(); | ||||
|  | ||||
|     let stream_len = std::sync::Arc::new(AtomicUsize::new(0)); | ||||
|     let stream_len2 = stream_len.clone(); | ||||
|  | ||||
|     let task = tokio::fs::File::open("random-test.dat") | ||||
|         .map_err(Error::from) | ||||
|         .and_then(move |file| { | ||||
|             let stream = tokio::codec::FramedRead::new(file, tokio::codec::BytesCodec::new()) | ||||
|                 .map(|bytes| bytes.to_vec()).map_err(Error::from); | ||||
|             //let chunk_stream = FixedChunkStream::new(stream, 4*1024*1024); | ||||
|             let chunk_stream = ChunkStream::new(stream); | ||||
|  | ||||
|             let start_time = std::time::Instant::now(); | ||||
|  | ||||
|             chunk_stream | ||||
|                 .for_each(move |chunk| { | ||||
|                     repeat.fetch_add(1, Ordering::SeqCst); | ||||
|                     stream_len.fetch_add(chunk.len(), Ordering::SeqCst); | ||||
|                     println!("Got chunk {}", chunk.len()); | ||||
|                     Ok(()) | ||||
|                 }) | ||||
|                 .and_then(move |_result| { | ||||
|                     let repeat = repeat2.load(Ordering::SeqCst); | ||||
|                     let stream_len = stream_len2.load(Ordering::SeqCst); | ||||
|                     let speed = ((stream_len*1000000)/(1024*1024))/(start_time.elapsed().as_micros() as usize); | ||||
|                     println!("Uploaded {} chunks in {} seconds ({} MB/s).", repeat, start_time.elapsed().as_secs(), speed); | ||||
|                     println!("Average chunk size was {} bytes.", stream_len/repeat); | ||||
|                     println!("time per request: {} microseconds.", (start_time.elapsed().as_micros())/(repeat as u128)); | ||||
|                     Ok(()) | ||||
|                 }) | ||||
|         }); | ||||
|  | ||||
|     tokio::run(task.map_err(|err| { panic!("ERROR: {}", err); })); | ||||
| } | ||||
		Reference in New Issue
	
	Block a user