-
Notifications
You must be signed in to change notification settings - Fork 3
/
Copy pathbenchmark.mojo
121 lines (105 loc) · 4.14 KB
/
benchmark.mojo
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
from csv import CsvTable, CsvBuilder
from random import random_ui64, random_float64
from time import now
fn measure_simd_csv(csv_string: String):
print("CSV Table with SIMD")
var min_runtime = 1 << 62
var column_count = 0
var row_count = 0
for _ in range(1):
var tik = now()
var t1 = CsvTable(csv_string, True)
var tok = now()
column_count = t1.column_count
row_count = t1.row_count()
min_runtime = min(min_runtime, tok - tik)
print(len(csv_string), "bytes", column_count, "columns", row_count, "rows", "in", min_runtime / 1_000_000, "ms")
fn measure_csv(csv_string: String):
print("CSV Table no SIMD")
var min_runtime = 1 << 62
var column_count = 0
var row_count = 0
for _ in range(1):
var tik = now()
var t1 = CsvTable(csv_string, False)
var tok = now()
column_count = t1.column_count
row_count = t1.row_count()
min_runtime = min(min_runtime, tok - tik)
print(len(csv_string), "bytes", column_count, "columns", row_count, "rows", "in", min_runtime / 1_000_000, "ms")
fn measure_build_csv(csv_string: String):
print("Build CSV no escaping")
var t1 = CsvTable(csv_string, False)
var builder = CsvBuilder(t1.column_count)
var get_time = 0
var push_time = 0
for row in range(t1.row_count()):
for column in range(t1.column_count):
var tik = now()
var value = t1.get(row, column)
var tok = now()
get_time += tok - tik
tik = now()
builder.push(value, False)
tok = now()
push_time += tok - tik
var result = builder^.finish()
print(len(result), "bytes", t1.column_count, "columns", t1.row_count(), "rows", "get in", get_time / 1_000_000, "ms,", "push in", push_time / 1_000_000, "ms")
fn measure_build_csv_consider_escaping(csv_string: String):
print("Build CSV consider escaping")
var t1 = CsvTable(csv_string, True)
var builder = CsvBuilder(t1.column_count)
var get_time = 0
var push_time = 0
for row in range(t1.row_count()):
for column in range(t1.column_count):
var tik = now()
var value = t1.get(row, column)
var tok = now()
get_time += tok - tik
tik = now()
builder.push(value, True)
tok = now()
push_time += tok - tik
var result = builder^.finish()
print(len(result), "bytes", t1.column_count, "columns", t1.row_count(), "rows", "get in", get_time / 1_000_000, "ms,", "push in", push_time / 1_000_000, "ms")
fn measure_one_mio_int_table_creation():
var nums = List[UInt64](capacity=1_000_000)
for _ in range(1_000_000):
nums.append(random_ui64(0, 1 << 63))
var builder = CsvBuilder(10)
var tik = now()
for i in range(len(nums)):
builder.push(nums[i])
var s = builder^.finish()
var tok = now()
print("CSV with 10 columns of 1 Mio random ints:", len(s), "bytes", "in", (tok - tik) / 1_000_000, "ms")
fn measure_one_mio_float_table_creation():
var nums = List[Float64](capacity=1_000_000)
for _ in range(1_000_000):
nums.append(random_float64())
var builder = CsvBuilder(10)
var tik = now()
for i in range(len(nums)):
builder.push(nums[i])
var s = builder^.finish()
var tok = now()
print("CSV with 10 columns of 1 Mio radom floats:", len(s), "bytes", "in", (tok - tik) / 1_000_000, "ms")
fn main():
measure_one_mio_int_table_creation()
measure_one_mio_float_table_creation()
try:
with open("example_needs_escaping.csv", "r") as f:
var csv_string = f.read()
measure_csv(csv_string)
measure_simd_csv(csv_string)
measure_build_csv(csv_string)
measure_build_csv_consider_escaping(csv_string)
with open("example_no_escaping.csv", "r") as f:
var csv_string = f.read()
measure_csv(csv_string)
measure_simd_csv(csv_string)
measure_build_csv(csv_string)
measure_build_csv_consider_escaping(csv_string)
except e:
print("failed to laod file:", e)