Skip to content

Commit 717de50

Browse files
committed
serialize: escaping json strings should write in batches.
This significantly speeds up encoding json strings.
1 parent 83f9f07 commit 717de50

File tree

1 file changed

+31
-15
lines changed

1 file changed

+31
-15
lines changed

src/libserialize/json.rs

Lines changed: 31 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -256,21 +256,37 @@ fn io_error_to_error(io: io::IoError) -> ParserError {
256256
pub type EncodeResult = io::IoResult<()>;
257257
pub type DecodeResult<T> = Result<T, DecoderError>;
258258

259-
fn escape_bytes(writer: &mut io::Writer, s: &[u8]) -> Result<(), io::IoError> {
260-
try!(writer.write_str("\""));
261-
for byte in s.iter() {
262-
match *byte {
263-
b'"' => try!(writer.write_str("\\\"")),
264-
b'\\' => try!(writer.write_str("\\\\")),
265-
b'\x08' => try!(writer.write_str("\\b")),
266-
b'\x0c' => try!(writer.write_str("\\f")),
267-
b'\n' => try!(writer.write_str("\\n")),
268-
b'\r' => try!(writer.write_str("\\r")),
269-
b'\t' => try!(writer.write_str("\\t")),
270-
_ => try!(writer.write_u8(*byte)),
271-
}
272-
}
273-
writer.write_str("\"")
259+
pub fn escape_bytes(wr: &mut io::Writer, bytes: &[u8]) -> Result<(), io::IoError> {
260+
try!(wr.write_str("\""));
261+
262+
let mut start = 0;
263+
264+
for (i, byte) in bytes.iter().enumerate() {
265+
let escaped = match *byte {
266+
b'"' => "\\\"",
267+
b'\\' => "\\\\",
268+
b'\x08' => "\\b",
269+
b'\x0c' => "\\f",
270+
b'\n' => "\\n",
271+
b'\r' => "\\r",
272+
b'\t' => "\\t",
273+
_ => { continue; }
274+
};
275+
276+
if start < i {
277+
try!(wr.write(bytes.slice(start, i)));
278+
}
279+
280+
try!(wr.write_str(escaped));
281+
282+
start = i + 1;
283+
}
284+
285+
if start != bytes.len() {
286+
try!(wr.write(bytes.slice_from(start)));
287+
}
288+
289+
wr.write_str("\"")
274290
}
275291

276292
fn escape_str(writer: &mut io::Writer, v: &str) -> Result<(), io::IoError> {

0 commit comments

Comments
 (0)