change --bytes to use block streaming instead of a single alloc->populate->write

master
Avril 3 years ago
parent 9cab3e1b98
commit 683864c727
Signed by: flanchan
GPG Key ID: 284488987C31F630

@ -1,6 +1,6 @@
[package]
name = "rng"
version = "0.2.0"
version = "0.2.1"
authors = ["Avril <flanchan@cumallover.me>"]
edition = "2018"
@ -14,3 +14,9 @@ panic = "unwind"
[dependencies]
getrandom = "0.1"
[features]
# Dynamically allocate and populate all memory needed for `--bytes` at runtime instead of streaming in fixed size blocks.
#
# This can slightly improve total performance for large outputs, at the cost of a proportionally, arbitrary sized memory allocation along with a proportionally increasing wait while the entire area is populated.
bytes-dynamic = []

@ -7,6 +7,8 @@ use getrandom::*;
mod parse;
mod r#impl;
const BYTES_BUFFER_SIZE: usize = 4096;
fn get<T: Default>() -> Result<T, Error>
{
let mut value: T = Default::default();
@ -154,6 +156,8 @@ fn bytes(args: &[String]) -> Result<(), Error>
usage();
} else {
let num = parse::bytes(&args[0]).expect("Failed to parse number of bytes") as usize;
if cfg!(feature="bytes-dynamic") {
let mut mem = Vec::with_capacity(num);
debug_assert_eq!(mem.capacity(), num);
@ -165,8 +169,24 @@ fn bytes(args: &[String]) -> Result<(), Error>
debug_assert_eq!(num, mem.len());
let stdout = std::io::stdout();
use std::io::Write;
stdout.lock().write_all(&mem[..]).expect("write error");
} else {
let mut buffer = [0u8; BYTES_BUFFER_SIZE];
let mut num = num;
let stdout = std::io::stdout();
let mut stdout = stdout.lock();
while num > 0 {
let w = std::cmp::min(num, BYTES_BUFFER_SIZE);
getrandom(&mut buffer[..w])?;
use std::io::Write;
stdout.write_all(&buffer[..w]).expect("write error");
num -= w;
}
}
}
Ok(())
}

Loading…
Cancel
Save