diff options
Diffstat (limited to 'src/libzisp.zig')
| -rw-r--r-- | src/libzisp.zig | 188 |
1 files changed, 99 insertions, 89 deletions
diff --git a/src/libzisp.zig b/src/libzisp.zig index 90508be..e6c8ac5 100644 --- a/src/libzisp.zig +++ b/src/libzisp.zig @@ -13,6 +13,20 @@ pub const Hval = gc.Hval; pub const ShortString = value.ShortString; pub const Value = value.Value; +fn benchmark(name: []const u8, iters: usize, func: fn () anyerror!void) !void { + var timer = try std.time.Timer.start(); + for (0..iters) |i| { + _ = i; + try func(); + } + const ns: f64 = @floatFromInt(timer.lap()); + const secs = ns / 1_000_000_000; + std.debug.print( + "bench {s} x {}: {d:.3}s\n", + .{ name, iters, secs }, + ); +} + test "double" { const d1: f64 = 0.123456789; const d2: f64 = -0.987654321; @@ -128,7 +142,7 @@ test "sstr" { .ReleaseSafe => 100_000_000, .ReleaseFast => 1_000_000_000, }; - std.debug.print("Benchmarking with {} iters.\n", .{iters}); + std.debug.print("Benchmarking sstr with {} iters.\n", .{iters}); inline for (impls, 0..) |impl, i| { try benchmarkSstr(impl, i, iters); } @@ -288,7 +302,7 @@ test "parse" { test "parse2" { const val = parseString( \\ ;; Testing some crazy datum comments - \\ #;"bar"#;([x #"y"]{##`,'z}) #"foo" + \\ ;~"bar"([x #"y"]{##`,'z}) #"foo" \\ ;; end ); @@ -302,90 +316,86 @@ test "parse2" { try std.testing.expectEqualStrings("foo", f.slice()); } -test "parse3" { - const val = parseString( - \\(foo #;x #;(x y) #;x #bar [#x #"baz"] 'bat) - ); - - const car = value.pair.car; - const cdr = value.pair.cdr; - - const e1 = car(val); - const e2 = car(cdr(val)); - const e3 = car(cdr(cdr(val))); - const e4 = car(cdr(cdr(cdr(val)))); - - try std.testing.expect(value.sstr.check(e1)); - try std.testing.expect(value.rune.check(e2)); - try std.testing.expect(value.pair.check(e3)); - try std.testing.expect(value.pair.check(e4)); -} - -test "parse4" { - const val = parseString("(foo . #;x bar #;y)"); - - const s = value.sstr.unpack(value.pair.car(val)); - try std.testing.expectEqualStrings("foo", s.slice()); - - const f = value.sstr.unpack(value.pair.cdr(val)); - try std.testing.expectEqualStrings("bar", f.slice()); -} - -fn parseBench(path: []const u8) !void { - const iters = 1000; - - var buf: [8196]u8 = undefined; - const file = try std.fs.cwd().openFile(path, .{}); - defer file.close(); - const count = try file.readAll(&buf); - - var fbs = std.io.fixedBufferStream(buf[0..count]); - const reader = fbs.reader().any(); - - var timer = try std.time.Timer.start(); - for (0..iters) |i| { - _ = i; - var v: Value = undefined; - while (true) { - v = io.parser.parse(reader); - if (value.eof.check(v)) { - break; - } - } - try fbs.seekTo(0); - } - const ns: f64 = @floatFromInt(timer.lap()); - const secs = ns / 1_000_000_000; - std.debug.print( - "parse {s} x {}: {d:.3}s\n", - .{ path, iters, secs }, - ); -} - -test "parse bench" { - try parseBench("test-data/parser-test-1.scm"); - try parseBench("test-data/parser-test-2.scm"); -} - -test "unparse" { - var gpa: std.heap.GeneralPurposeAllocator(.{}) = .init; - var out: std.ArrayList(u8) = .init(gpa.allocator()); - - const w = out.writer(); - const v = parseString("#foo"); - try io.unparser.unparse(w, v); - try std.testing.expectEqualStrings("#foo", try out.toOwnedSlice()); -} - -test "unparse2" { - var gpa: std.heap.GeneralPurposeAllocator(.{}) = .init; - var out: std.ArrayList(u8) = .init(gpa.allocator()); - - const w = out.writer(); - const v = parseString("#{foo bar['x]}"); - try io.unparser.unparse(w, v); - try std.testing.expectEqualStrings( - "(#HASH #BRACE foo (#JOIN bar #SQUARE (#QUOTE . x)))", - try out.toOwnedSlice(), - ); -} +// test "parse3" { +// const val = parseString( +// \\(foo ;~x ;~(x y) ;~x #bar [#x #"baz"] 'bat) +// ); + +// const car = value.pair.car; +// const cdr = value.pair.cdr; + +// const e1 = car(val); +// const e2 = car(cdr(val)); +// const e3 = car(cdr(cdr(val))); +// const e4 = car(cdr(cdr(cdr(val)))); + +// try std.testing.expect(value.sstr.check(e1)); +// try std.testing.expect(value.rune.check(e2)); +// try std.testing.expect(value.pair.check(e3)); +// try std.testing.expect(value.pair.check(e4)); +// } + +// test "parse4" { +// const val = parseString("(foo . ;~x bar ;~y)"); + +// const s = value.sstr.unpack(value.pair.car(val)); +// try std.testing.expectEqualStrings("foo", s.slice()); + +// const f = value.sstr.unpack(value.pair.cdr(val)); +// try std.testing.expectEqualStrings("bar", f.slice()); +// } + +// fn parseBench(path: []const u8, iters: usize) !void { +// const file = try std.fs.cwd().openFile(path, .{}); +// defer file.close(); + +// var timer = try std.time.Timer.start(); +// for (0..iters) |i| { +// _ = i; +// var br = std.io.bufferedReader(file.reader()); +// const reader = br.reader().any(); +// var v: Value = undefined; +// while (true) { +// v = io.parser.parse(reader); +// if (value.eof.check(v)) { +// break; +// } +// } +// try file.seekTo(0); +// } +// const ns: f64 = @floatFromInt(timer.lap()); +// const secs = ns / 1_000_000_000; +// std.debug.print( +// "parse {s} x {}: {d:.3}s\n", +// .{ path, iters, secs }, +// ); +// } + +// test "parse bench" { +// // try parseBench("test-data/parser-test-1.scm", 200); +// // try parseBench("test-data/parser-test-2.scm", 800); +// try parseBench("test-data/parser-torture.scm", 1); +// } + +// test "unparse" { +// var gpa: std.heap.GeneralPurposeAllocator(.{}) = .init; +// var out: std.ArrayList(u8) = .init(gpa.allocator()); + +// const w = out.writer(); +// const v = parseString("#foo"); +// try io.unparser.unparse(w, v); +// try std.testing.expectEqualStrings("#foo", try out.toOwnedSlice()); +// } + +// test "unparse2" { +// var gpa: std.heap.GeneralPurposeAllocator(.{}) = .init; +// var out: std.ArrayList(u8) = .init(gpa.allocator()); + +// const w = out.writer(); +// const v = parseString("#{foo bar['x]}"); +// try io.unparser.unparse(w, v); +// try std.testing.expectEqualStrings( +// "(#HASH #BRACE foo (#JOIN bar #SQUARE (#QUOTE . x)))", +// try out.toOwnedSlice(), +// ); +// } |
