Skip to content

Commit 732ae20

Browse files
committed
Serialize JSON to Vec before passing it gz encoder
For some reason this seems to be much quicker.
1 parent 56779f4 commit 732ae20

File tree

1 file changed

+11
-3
lines changed

1 file changed

+11
-3
lines changed

src/uploader.rs

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,11 @@
11
use crate::{models::Envelope, Error, HttpClient};
22
use bytes::Bytes;
3-
use flate2::write::GzEncoder;
4-
use flate2::Compression;
3+
use flate2::{write::GzEncoder, Compression};
54
use http::{Request, Response, Uri};
65
use serde::Deserialize;
76
#[cfg(feature = "metrics")]
87
use std::io::Read;
8+
use std::io::Write;
99

1010
const STATUS_OK: u16 = 200;
1111
const STATUS_PARTIAL_CONTENT: u16 = 206;
@@ -84,8 +84,16 @@ pub(crate) fn send_sync(endpoint: &Uri, items: Vec<Envelope>) -> Result<(), Erro
8484
}
8585

8686
fn serialize_request_body(items: Vec<Envelope>) -> Result<Vec<u8>, Error> {
87+
// Weirdly gzip_encoder.write_all(serde_json::to_vec()) seems to be faster than
88+
// serde_json::to_writer(gzip_encoder). In a local test operating on items that result in
89+
// ~13MiB of JSON, this is what I've seen:
90+
// gzip_encoder.write_all(serde_json::to_vec()): 159ms
91+
// serde_json::to_writer(gzip_encoder): 247ms
92+
let serialized = serde_json::to_vec(&items).map_err(Error::UploadSerializeRequest)?;
8793
let mut gzip_encoder = GzEncoder::new(Vec::new(), Compression::default());
88-
serde_json::to_writer(&mut gzip_encoder, &items).map_err(Error::UploadSerializeRequest)?;
94+
gzip_encoder
95+
.write_all(&serialized)
96+
.map_err(Error::UploadCompressRequest)?;
8997
gzip_encoder.finish().map_err(Error::UploadCompressRequest)
9098
}
9199

0 commit comments

Comments
 (0)