現状。 StdoutLock
は LineWriter
を噛んでるので、 BufWriter
の意味があるのか謎。ベンチマーク取らねば。
use std::io::{self, BufRead, BufWriter, Write}; fn main() { let stdio = io::stdin(); let mut input = stdio.lock(); let stdout = io::stdout(); let mut output = BufWriter::new(stdout.lock()); let mut line = String::new(); while input.read_line(&mut line).unwrap() > 0 { let _ = writeln!(output, "{}", line); line.clear(); } }
↑のコードは以下を参考に勘で書いている。
【追記】WSL上での雑なベンチ
BufWriter
の意味はありそう。以下がない場合。
$ time yes | head -n 1000000 | ./target/release/bench > /dev/null real 0m4.102s user 0m1.250s sys 0m2.906s
BufWriter
噛ませた場合。 42 倍くらい違う。
$ time yes | head -n 1000000 | ./target/release/bench > /dev/null real 0m0.098s user 0m0.063s sys 0m0.047s
さらに、 writeln!
マクロを使わずに、
let _ = output.write(line.as_bytes()); let _ = output.write(b"\n");
とかやると、もうちょい早い。
$ time yes | head -n 1000000 | ./target/release/bench > /dev/null real 0m0.073s user 0m0.031s sys 0m0.063s