file_storage: Wrap `File` in `BufWriter` (#3353)
When exiting my application, it would freeze for around a minute waiting to finish writing ca. 40MB to file storage. Some quick profiling revealed that it was spending all that time in `File::write`, presumably making a large number of system calls writing tiny amounts of data at a time. We can avoid this by buffering writes using a `BufWriter`, just like we already do with `BufReader`. With this change, my application takes around 1-2 seconds to exit, with the majority of that time spent serializing `ron`. I'm sure there are further potential performance improvements there, but this is already an order of magnitude or two better. I also fixed the call to `log::warn!`, which was using incorrect formatting syntax and not including the error message.
This commit is contained in:
parent
8073ca6fe0
commit
433d1fc239
|
|
@ -1,5 +1,6 @@
|
||||||
use std::{
|
use std::{
|
||||||
collections::HashMap,
|
collections::HashMap,
|
||||||
|
io::Write,
|
||||||
path::{Path, PathBuf},
|
path::{Path, PathBuf},
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
@ -126,10 +127,13 @@ fn save_to_disk(file_path: &PathBuf, kv: &HashMap<String, String>) {
|
||||||
|
|
||||||
match std::fs::File::create(file_path) {
|
match std::fs::File::create(file_path) {
|
||||||
Ok(file) => {
|
Ok(file) => {
|
||||||
|
let mut writer = std::io::BufWriter::new(file);
|
||||||
let config = Default::default();
|
let config = Default::default();
|
||||||
|
|
||||||
if let Err(err) = ron::ser::to_writer_pretty(file, &kv, config) {
|
if let Err(err) = ron::ser::to_writer_pretty(&mut writer, &kv, config)
|
||||||
log::warn!("Failed to serialize app state: {err}");
|
.and_then(|_| writer.flush().map_err(|err| err.into()))
|
||||||
|
{
|
||||||
|
log::warn!("Failed to serialize app state: {}", err);
|
||||||
} else {
|
} else {
|
||||||
log::trace!("Persisted to {:?}", file_path);
|
log::trace!("Persisted to {:?}", file_path);
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue