Switch json parsing to read_chars for performance
Avoids the overhead of read_char for every character. Benchmark reading example.json 10 times from https://code.google.com/p/rapidjson/wiki/Performance Before: 2.55s After: 0.16s Regression testing is already done by isrustfastyet.
This commit is contained in:
parent
58eb70a5e2
commit
37494d39d3
1 changed files with 28 additions and 7 deletions
|
@ -481,9 +481,13 @@ pub fn to_pretty_str(json: &Json) -> ~str {
|
||||||
io::with_str_writer(|wr| to_pretty_writer(wr, json))
|
io::with_str_writer(|wr| to_pretty_writer(wr, json))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static BUF_SIZE : uint = 64000;
|
||||||
|
|
||||||
#[allow(missing_doc)]
|
#[allow(missing_doc)]
|
||||||
pub struct Parser {
|
pub struct Parser {
|
||||||
priv rdr: @io::Reader,
|
priv rdr: @io::Reader,
|
||||||
|
priv buf: ~[char],
|
||||||
|
priv buf_idx: uint,
|
||||||
priv ch: char,
|
priv ch: char,
|
||||||
priv line: uint,
|
priv line: uint,
|
||||||
priv col: uint,
|
priv col: uint,
|
||||||
|
@ -491,12 +495,16 @@ pub struct Parser {
|
||||||
|
|
||||||
/// Decode a json value from an io::reader
|
/// Decode a json value from an io::reader
|
||||||
pub fn Parser(rdr: @io::Reader) -> Parser {
|
pub fn Parser(rdr: @io::Reader) -> Parser {
|
||||||
Parser {
|
let mut p = Parser {
|
||||||
rdr: rdr,
|
rdr: rdr,
|
||||||
ch: rdr.read_char(),
|
buf: rdr.read_chars(BUF_SIZE),
|
||||||
|
buf_idx: 0,
|
||||||
|
ch: 0 as char,
|
||||||
line: 1,
|
line: 1,
|
||||||
col: 1,
|
col: 0,
|
||||||
}
|
};
|
||||||
|
p.bump();
|
||||||
|
p
|
||||||
}
|
}
|
||||||
|
|
||||||
impl Parser {
|
impl Parser {
|
||||||
|
@ -521,13 +529,26 @@ impl Parser {
|
||||||
fn eof(&self) -> bool { self.ch == -1 as char }
|
fn eof(&self) -> bool { self.ch == -1 as char }
|
||||||
|
|
||||||
fn bump(&mut self) {
|
fn bump(&mut self) {
|
||||||
self.ch = self.rdr.read_char();
|
if self.eof() {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
self.col += 1u;
|
||||||
|
|
||||||
|
if self.buf_idx >= self.buf.len() {
|
||||||
|
self.buf = self.rdr.read_chars(BUF_SIZE);
|
||||||
|
if self.buf.len() == 0 {
|
||||||
|
self.ch = -1 as char;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
self.buf_idx = 0;
|
||||||
|
}
|
||||||
|
self.ch = self.buf[self.buf_idx];
|
||||||
|
self.buf_idx += 1;
|
||||||
|
|
||||||
if self.ch == '\n' {
|
if self.ch == '\n' {
|
||||||
self.line += 1u;
|
self.line += 1u;
|
||||||
self.col = 1u;
|
self.col = 1u;
|
||||||
} else {
|
|
||||||
self.col += 1u;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue