Skip to content

Commit d0513c0

Browse files
author
H.Merijn Brand - Tux
committed
Add rust timing
That is trailblaizin' bloody fast!
1 parent e06f400 commit d0513c0

14 files changed

+248
-1
lines changed

.gitignore

+1
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@ lib/.precomp
2323
csv-c
2424
csv-cc
2525
csv-go
26+
rust*/target
2627

2728
# Re-enable parts later
2829
sandbox/

csv-rust-csvrdr

+1
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
rust-csvreader/target/release/csvreader

csv-rust-libcsv

+1
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
rust-libcsv/target/release/csvreader

csv-rust-qckrdr

+1
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
rust-quick-reader/target/release/quick-reader

rust-csvreader/Cargo.lock

+30
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

rust-csvreader/Cargo.toml

+15
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
[package]
2+
3+
name = "csvreader"
4+
version = "0.0.1"
5+
authors = [ "Your name <[email protected]>" ]
6+
7+
[[bin]]
8+
name = "csvreader"
9+
10+
[dependencies]
11+
csv = "*"
12+
13+
[profile.release]
14+
opt-level = 3
15+
lto = true

rust-csvreader/src/csvreader.rs

+16
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
extern crate csv;
2+
3+
fn main () {
4+
let fpath = ::std::env::args ().nth (1).unwrap ();
5+
let mut rdr = csv::Reader::from_file (fpath).unwrap ().has_headers (false);
6+
let mut sum = 0;
7+
loop {
8+
match rdr.next_bytes () {
9+
csv::NextField::Data (_) => sum += 1,
10+
csv::NextField::EndOfRecord => {}
11+
csv::NextField::EndOfCsv => break,
12+
csv::NextField::Error (err) => panic! ("{}", err),
13+
}
14+
}
15+
println!("{}", sum);
16+
}

rust-libcsv/Cargo.lock

+21
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

rust-libcsv/Cargo.toml

+15
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
[package]
2+
name = "csvreader"
3+
version = "0.0.1"
4+
authors = [ "Ewan Higgs <[email protected]>" ]
5+
6+
[[bin]]
7+
name = "csvreader"
8+
9+
[dependencies]
10+
libc = "0.2"
11+
num-traits = "0.1"
12+
13+
[profile.release]
14+
opt-level = 3
15+
lto = true

rust-libcsv/src/main.rs

+93
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,93 @@
1+
extern crate libc;
2+
extern crate num_traits;
3+
4+
use std::io::Read;
5+
use num_traits::NumCast;
6+
use std::ptr;
7+
use libc::{size_t, c_void};
8+
9+
extern "C" fn field_count(_ : *mut c_void, _ : size_t, data : *mut i64) {
10+
unsafe {
11+
*data = *data + 1;
12+
}
13+
}
14+
15+
#[repr(C)]
16+
struct CSVParser {
17+
pstate: i64,
18+
quoted: i64,
19+
spaces: size_t,
20+
entry_buf: *mut u8,
21+
entry_po: size_t,
22+
entry_size: size_t,
23+
status: i64,
24+
opts: u8, // was "options"
25+
quote_char: u8,
26+
delim_char: u8,
27+
is_space: fn(u8)-> i64,
28+
is_term: fn(u8) -> i64,
29+
blk_size: size_t,
30+
malloc_func: fn(size_t) -> *mut c_void,
31+
relloc_func: fn(*mut c_void, size_t) -> *mut c_void,
32+
free_func: fn(*mut c_void),
33+
}
34+
35+
impl CSVParser {
36+
fn new() -> CSVParser{
37+
unsafe {
38+
return ::std::mem::zeroed();
39+
}
40+
}
41+
}
42+
43+
#[link(name = "csv")]
44+
extern {
45+
fn csv_init(parser : *mut CSVParser, opt: u8) -> i64;
46+
fn csv_parse(parser: *mut CSVParser, buf: *mut u8, buflen : size_t,
47+
cb: extern fn(*mut c_void, size_t, *mut i64),
48+
cb2: *const c_void, //cb2: fn(i64, *mut c_void),
49+
data: *mut i64) -> size_t;
50+
fn csv_free(parser: *mut CSVParser);
51+
}
52+
53+
fn main() {
54+
const CSV_APPEND_NULL : u8 = 8;
55+
const READ_SZ : usize = 1024 * 1024;
56+
57+
let args : Vec<String> = ::std::env::args().collect();
58+
if args.len() < 2 {
59+
println!("Usage: csvreader <csv-file>");
60+
return;
61+
}
62+
let filename = &args[1];
63+
let path = ::std::path::Path::new(filename);
64+
let mut rdr = ::std::fs::File::open(&path).unwrap();
65+
66+
let mut parser = CSVParser::new();
67+
unsafe { csv_init(&mut parser, CSV_APPEND_NULL); };
68+
69+
let mut buf = [0; READ_SZ];
70+
let mut sum = 0;
71+
loop {
72+
match rdr.read(&mut buf) {
73+
Ok(0) => break,
74+
Ok(nread) => {
75+
let pbuf = buf.as_mut_ptr();
76+
unsafe {
77+
csv_parse(&mut parser,
78+
pbuf,
79+
NumCast::from(nread).unwrap(),
80+
field_count,
81+
ptr::null::<c_void>(),
82+
&mut sum);
83+
};
84+
},
85+
Err(e) => {
86+
println!("Error reaidng file: {}", e);
87+
return;
88+
}
89+
}
90+
}
91+
unsafe { csv_free(&mut parser); };
92+
println!("{}", sum);
93+
}

rust-quick-reader/Cargo.lock

+23
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

rust-quick-reader/Cargo.toml

+15
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
[package]
2+
3+
name = "quick-reader"
4+
version = "0.0.1"
5+
authors = [ "Johann Tuffe <[email protected]>" ]
6+
7+
[[bin]]
8+
name = "quick-reader"
9+
10+
[dependencies]
11+
quick-csv = "0.1"
12+
13+
[profile.release]
14+
opt-level = 3
15+
lto = true

rust-quick-reader/src/quick-reader.rs

+10
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
extern crate quick_csv as csv;
2+
3+
fn main() {
4+
let fpath = ::std::env::args().nth(1).unwrap();
5+
let rdr = csv::Csv::from_file(fpath).unwrap();
6+
let sum = rdr.into_iter()
7+
.map(|r| r.unwrap().len())
8+
.fold(0usize, |c, n| c + n);
9+
println!("{}", sum);
10+
}

time.pl

+6-1
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,7 @@ sub usage {
4848
13 => [ ".R", "R", "--slave -f" ],
4949
15 => [ "", "C++" ],
5050
16 => [ "", "java8", "-cp csv-pi-easy-pp.jar Main /tmp/hello.csv" ],
51+
17 => [ "", "Rust", "/tmp/hello.csv" ],
5152
);
5253
my @test = (
5354
# lang irc script
@@ -80,13 +81,17 @@ sub usage {
8081
[ 13, 0, "csv-R" ],
8182
[ 12, 0, "csv-java9" ],
8283
[ 16, 0, "csv-easy-pp-pi", "Text::CSV::Easy_PP, Perlito" ],
84+
[ 17, 0, "csv-rust-csvrdr" ],
85+
[ 17, 0, "csv-rust-libcsv" ],
86+
[ 17, 0, "csv-rust-qckrdr" ],
8387
);
8488

8589
sub runfrom {
8690
my ($v, $script, $file) = @_;
8791
my ($ext, $exe, @arg) = @{$lang{$v}};
8892

89-
$exe eq "C" || $exe eq "C++" and $exe = "";
93+
$exe eq "Rust" and $exe = $script;
94+
$exe eq "C" || $exe eq "C++" || $exe eq "Rust" and $exe = "";
9095
my $run = join " " => $exe, @arg;
9196

9297
$opt_v > 4 and say "$v / $ext / $exe\t/ $run";

0 commit comments

Comments
 (0)