Skip to content

Commit 09e8df8

Browse files
committed
0.8.5 micro optimizations
1 parent 7a35679 commit 09e8df8

File tree

3 files changed

+32
-41
lines changed

3 files changed

+32
-41
lines changed

Cargo.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
[package]
22
name = "json"
3-
version = "0.8.4"
3+
version = "0.8.5"
44
authors = ["Maciej Hirsz <maciej.hirsz@gmail.com>"]
55
description = "JSON implementation in Rust"
66
repository = "https://github.com/maciejhirsz/json-rust"

src/codegen.rs

Lines changed: 28 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,7 @@ pub trait Generator {
4141
self.get_buffer().push(ch)
4242
}
4343

44-
fn write_min(&mut self, slice: &[u8], minslice: &[u8]);
44+
fn write_min(&mut self, slice: &[u8], min: u8);
4545

4646
fn new_line(&mut self) {}
4747

@@ -76,42 +76,33 @@ pub trait Generator {
7676
self.write_char(b'"');
7777
}
7878

79-
fn write_number(&mut self, mut num: f64) {
79+
fn write_number(&mut self, num: f64) {
8080
match num.classify() {
81-
FpCategory::Nan |
82-
FpCategory::Infinite => {
83-
self.write(b"null");
84-
return;
81+
FpCategory::Normal |
82+
FpCategory::Subnormal => {
83+
if num.fract() == 0.0 && num < 1e19 {
84+
itoa::write(self.get_buffer(), num as i64).unwrap();
85+
} else {
86+
let abs = num.abs();
87+
if abs < 1e-15 || abs > 1e19 {
88+
write!(self.get_buffer(), "{:e}", num).unwrap();
89+
} else {
90+
write!(self.get_buffer(), "{}", num).unwrap();
91+
}
92+
}
8593
},
8694
FpCategory::Zero => {
87-
self.write(if num.is_sign_negative() { b"-0" } else { b"0" });
88-
return;
95+
if num.is_sign_negative() {
96+
self.write(b"-0");
97+
} else {
98+
self.write_char(b'0');
99+
}
89100
},
90-
_ => {},
91-
}
92-
93-
if num.is_sign_negative() {
94-
num = num.abs();
95-
self.write_char(b'-');
96-
}
97-
98-
let fract = num.fract();
99-
100-
if fract > 0.0 {
101-
if num < 1e-15 {
102-
write!(self.get_buffer(), "{:e}", num).unwrap();
103-
} else {
104-
write!(self.get_buffer(), "{}", num).unwrap();
101+
FpCategory::Nan |
102+
FpCategory::Infinite => {
103+
self.write(b"null");
105104
}
106-
return;
107-
}
108-
109-
if num > 1e19 {
110-
write!(self.get_buffer(), "{:e}", num).unwrap();
111-
return;
112105
}
113-
114-
itoa::write(self.get_buffer(), num as u64).unwrap();
115106
}
116107

117108
fn write_json(&mut self, json: &JsonValue) {
@@ -130,7 +121,7 @@ pub trait Generator {
130121
first = false;
131122
self.new_line();
132123
} else {
133-
self.write(b",");
124+
self.write_char(b',');
134125
self.new_line();
135126
}
136127
self.write_json(item);
@@ -148,11 +139,11 @@ pub trait Generator {
148139
first = false;
149140
self.new_line();
150141
} else {
151-
self.write(b",");
142+
self.write_char(b',');
152143
self.new_line();
153144
}
154145
self.write_string(key);
155-
self.write_min(b": ", b":");
146+
self.write_min(b": ", b':');
156147
self.write_json(value);
157148
}
158149
self.dedent();
@@ -184,8 +175,8 @@ impl Generator for DumpGenerator {
184175
}
185176

186177
#[inline(always)]
187-
fn write_min(&mut self, _: &[u8], minslice: &[u8]) {
188-
self.code.extend_from_slice(minslice);
178+
fn write_min(&mut self, _: &[u8], min: u8) {
179+
self.code.push(min);
189180
}
190181

191182
fn consume(self) -> String {
@@ -216,7 +207,7 @@ impl Generator for PrettyGenerator {
216207
}
217208

218209
#[inline(always)]
219-
fn write_min(&mut self, slice: &[u8], _: &[u8]) {
210+
fn write_min(&mut self, slice: &[u8], _: u8) {
220211
self.code.extend_from_slice(slice);
221212
}
222213

src/parser.rs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -393,11 +393,11 @@ impl<'a> Parser<'a> {
393393

394394
fn read_number_with_fraction(&mut self, mut num: f64) -> JsonResult<f64> {
395395
if next_byte!(self || return Ok(num)) == b'.' {
396-
let mut precision = -1;
396+
let mut precision = 0.1;
397397

398398
read_num!(self, digit, {
399-
num += (digit as f64) * 10_f64.powi(precision);
400-
precision -= 1;
399+
num += (digit as f64) * precision;
400+
precision /= 10.0;
401401
});
402402
} else {
403403
self.index -= 1;

0 commit comments

Comments
 (0)