Skip to content

Commit cfe6dae

Browse files
author
Grahame Bowland
committed
a bunch of speedups
1 parent 4fee5be commit cfe6dae

File tree

1 file changed

+27
-17
lines changed

1 file changed

+27
-17
lines changed

csv.rs

Lines changed: 27 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@ type rowreader = {
2222
f : io::reader,
2323
mut offset : uint,
2424
mut buffers : [[char]],
25+
mut bufferlens: [uint],
2526
mut state : state,
2627
mut trailing_nl : bool,
2728
mut terminating : bool
@@ -58,6 +59,7 @@ fn new_reader_readlen(+f: io::reader, +delim: char, +quote: char, rl: uint) -> r
5859
f: f,
5960
mut offset : 0u,
6061
mut buffers : [],
62+
mut bufferlens: [],
6163
mut state : fieldstart(false),
6264
mut trailing_nl : false,
6365
mut terminating: false
@@ -98,23 +100,27 @@ fn unescape(escaped: [char]) -> [char] {
98100
}
99101

100102
impl of rowiter for rowreader {
103+
#[inline]
101104
fn readrow(&row: [str]) -> bool {
102105
fn row_from_buf(self: rowreader, &fields: [str]) -> bool {
103106
fn decode(buffers: [[char]], field: fieldtype) -> str {
104107
alt field {
105108
emptyfield() { "" }
106109
bufferfield(desc) {
107110
let mut buf = [];
108-
{
109-
let mut i = desc.sb;
110-
while i <= desc.eb {
111-
let from = if (i == desc.sb)
112-
{ desc.start } else { 0u };
113-
let to = if (i == desc.eb)
114-
{ desc.end } else { vec::len(buffers[i]) };
115-
buf += vec::slice(buffers[i], from, to);
116-
i = i + 1u;
111+
vec::reserve(buf, 256u);
112+
let mut i = desc.sb;
113+
while i <= desc.eb {
114+
let from = if (i == desc.sb)
115+
{ desc.start } else { 0u };
116+
let to = if (i == desc.eb)
117+
{ desc.end } else { vec::len(buffers[i]) };
118+
let mut j = from;
119+
while j < to {
120+
buf += [buffers[i][j]];
121+
j += 1u;
117122
}
123+
i = i + 1u;
118124
}
119125
if desc.escaped {
120126
buf = unescape(buf);
@@ -123,20 +129,21 @@ impl of rowiter for rowreader {
123129
}
124130
}
125131
}
132+
#[inline]
126133
fn new_bufferfield(self: rowreader, escaped: bool, sb: uint, so: uint, eo: uint) -> fieldtype {
127134
let mut eb = vec::len(self.buffers) - 1u;
128135
let mut sb = sb, so = so, eo = eo;
129136
if escaped {
130137
so += 1u;
131-
if so > vec::len(self.buffers[sb]) {
138+
if so > self.bufferlens[sb] {
132139
sb += 1u;
133-
so = vec::len(self.buffers[sb]) - 1u;
140+
so = self.bufferlens[sb] - 1u;
134141
}
135142
if eo > 0u {
136143
eo -= 1u;
137144
} else {
138145
eb -= 1u;
139-
eo = vec::len(self.buffers[eb]) - 1u;
146+
eo = self.bufferlens[eb] - 1u;
140147
}
141148
}
142149
bufferfield({ escaped: escaped, sb: sb, eb: eb, start: so, end: eo })
@@ -201,11 +208,10 @@ impl of rowiter for rowreader {
201208
}
202209
self.state = fieldstart(false);
203210
let mut do_read = vec::len(self.buffers) == 0u;
204-
211+
row = [];
205212
while !self.terminating {
206213
if do_read {
207214
let mut data = self.f.read_chars(self.readlen);
208-
//log(error, ("aa", str::from_chars(data)));
209215
if vec::len(data) == 0u {
210216
if !self.trailing_nl {
211217
self.terminating = true;
@@ -223,12 +229,15 @@ impl of rowiter for rowreader {
223229
}
224230
self.trailing_nl = data[data_len - 1u] == '\n';
225231
self.buffers += [data];
232+
self.bufferlens += [data_len];
226233
self.offset = 0u;
227234
}
228235

229236
if row_from_buf(self, row) {
230-
if vec::len(self.buffers) > 1u {
231-
self.buffers = vec::slice(self.buffers, vec::len(self.buffers) - 1u, vec::len(self.buffers));
237+
let buflen = vec::len(self.buffers);
238+
if buflen > 1u {
239+
self.buffers = [self.buffers[buflen-1u]];
240+
self.bufferlens = [self.bufferlens[buflen-1u]];
232241
}
233242
ret true;
234243
}
@@ -244,6 +253,7 @@ fn hashmap_iter_cols(r: rowreader, cols: [str], f: fn(map::hashmap<str, str>)) {
244253
let m : map::hashmap<str, str> = map::str_hash();
245254
let ncols = vec::len(cols);
246255
while r.readrow(fields) {
256+
log(error, fields);
247257
if vec::len(fields) != ncols {
248258
cont; // FIXME: how to flag that we dropped a crazy row?
249259
}
@@ -286,8 +296,8 @@ mod test {
286296
let f = io::str_reader(s);
287297
let r = mk(f);
288298
let mut i = 0u;
299+
let mut row: [str] = [];
289300
loop {
290-
let mut row: [str] = [];
291301
if !r.readrow(row) {
292302
break;
293303
}

0 commit comments

Comments
 (0)