Skip to content

Commit 5cd2e2c

Browse files
authored
Merge pull request #482 from jqnatividad/378-accelerated_datatype_conversion
perf: accelerated datatype conversion
2 parents cf86fa7 + c0c6c69 commit 5cd2e2c

File tree

3 files changed

+12
-18
lines changed

3 files changed

+12
-18
lines changed

Cargo.toml

+2
Original file line numberDiff line numberDiff line change
@@ -14,9 +14,11 @@ edition = "2021"
1414
rust-version = "1.73"
1515

1616
[dependencies]
17+
atoi_simd = "0.16"
1718
byteorder = "1.5"
1819
codepage = "0.1.1"
1920
encoding_rs = "0.8"
21+
fast-float2 = "0.2"
2022
log = "0.4"
2123
serde = "1.0"
2224
quick-xml = { version = "0.36", features = ["encoding"] }

src/datatype.rs

+6-6
Original file line numberDiff line numberDiff line change
@@ -154,7 +154,7 @@ impl DataType for Data {
154154
Data::Int(v) => Some(*v),
155155
Data::Float(v) => Some(*v as i64),
156156
Data::Bool(v) => Some(*v as i64),
157-
Data::String(v) => v.parse::<i64>().ok(),
157+
Data::String(v) => atoi_simd::parse::<i64>(v.as_bytes()).ok(),
158158
_ => None,
159159
}
160160
}
@@ -164,7 +164,7 @@ impl DataType for Data {
164164
Data::Int(v) => Some(*v as f64),
165165
Data::Float(v) => Some(*v),
166166
Data::Bool(v) => Some((*v as i32).into()),
167-
Data::String(v) => v.parse::<f64>().ok(),
167+
Data::String(v) => fast_float2::parse(v).ok(),
168168
_ => None,
169169
}
170170
}
@@ -472,8 +472,8 @@ impl DataType for DataRef<'_> {
472472
DataRef::Int(v) => Some(*v),
473473
DataRef::Float(v) => Some(*v as i64),
474474
DataRef::Bool(v) => Some(*v as i64),
475-
DataRef::String(v) => v.parse::<i64>().ok(),
476-
DataRef::SharedString(v) => v.parse::<i64>().ok(),
475+
DataRef::String(v) => atoi_simd::parse::<i64>(v.as_bytes()).ok(),
476+
DataRef::SharedString(v) => atoi_simd::parse::<i64>(v.as_bytes()).ok(),
477477
_ => None,
478478
}
479479
}
@@ -483,8 +483,8 @@ impl DataType for DataRef<'_> {
483483
DataRef::Int(v) => Some(*v as f64),
484484
DataRef::Float(v) => Some(*v),
485485
DataRef::Bool(v) => Some((*v as i32).into()),
486-
DataRef::String(v) => v.parse::<f64>().ok(),
487-
DataRef::SharedString(v) => v.parse::<f64>().ok(),
486+
DataRef::String(v) => fast_float2::parse(v).ok(),
487+
DataRef::SharedString(v) => fast_float2::parse(v).ok(),
488488
_ => None,
489489
}
490490
}

src/xlsx/cells_reader.rs

+4-12
Original file line numberDiff line numberDiff line change
@@ -195,13 +195,8 @@ impl<'a> XlsxCellReader<'a> {
195195
// shared index
196196
let shared_index =
197197
match get_attribute(e.attributes(), QName(b"si"))? {
198-
Some(res) => match std::str::from_utf8(res) {
199-
Ok(res) => match res.parse::<usize>() {
200-
Ok(res) => res,
201-
Err(e) => {
202-
return Err(XlsxError::ParseInt(e));
203-
}
204-
},
198+
Some(res) => match atoi_simd::parse::<usize>(res) {
199+
Ok(res) => res,
205200
Err(_) => {
206201
return Err(XlsxError::Unexpected(
207202
"si attribute must be a number",
@@ -332,18 +327,15 @@ fn read_v<'s>(
332327
) -> Result<DataRef<'s>, XlsxError> {
333328
let cell_format = match get_attribute(c_element.attributes(), QName(b"s")) {
334329
Ok(Some(style)) => {
335-
let id: usize = std::str::from_utf8(style)
336-
.unwrap_or("0")
337-
.parse()
338-
.unwrap_or(0);
330+
let id = atoi_simd::parse::<usize>(style).unwrap_or(0);
339331
formats.get(id)
340332
}
341333
_ => Some(&CellFormat::Other),
342334
};
343335
match get_attribute(c_element.attributes(), QName(b"t"))? {
344336
Some(b"s") => {
345337
// shared string
346-
let idx: usize = v.parse()?;
338+
let idx = atoi_simd::parse::<usize>(v.as_bytes()).unwrap_or(0);
347339
Ok(DataRef::SharedString(&strings[idx]))
348340
}
349341
Some(b"b") => {

0 commit comments

Comments
 (0)