Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion build.zig.zon
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
.name = .zig_msgpack,
.version = "0.0.14",
.fingerprint = 0x14a3e10e78eefb7a,
.minimum_zig_version = "0.14.0",
.minimum_zig_version = "0.17.0-dev.1552+79dc16a0e",
.dependencies = .{},
.paths = .{
"build.zig",
Expand Down
88 changes: 50 additions & 38 deletions src/bench.zig
Original file line number Diff line number Diff line change
Expand Up @@ -83,7 +83,7 @@ fn benchNilRead(allocator: std.mem.Allocator) !void {
const BufferLen = 100;
const State = struct {
var initialized = false;
var buffer: [BufferLen]u8 = [_]u8{0} ** BufferLen;
var buffer: [BufferLen]u8 = @splat(0);
};

if (!State.initialized) {
Expand Down Expand Up @@ -115,7 +115,7 @@ fn benchBoolRead(allocator: std.mem.Allocator) !void {
const BufferLen = 100;
const State = struct {
var initialized = false;
var buffer: [BufferLen]u8 = [_]u8{0} ** BufferLen;
var buffer: [BufferLen]u8 = @splat(0);
};

if (!State.initialized) {
Expand Down Expand Up @@ -147,7 +147,7 @@ fn benchSmallIntRead(allocator: std.mem.Allocator) !void {
const BufferLen = 100;
const State = struct {
var initialized = false;
var buffer: [BufferLen]u8 = [_]u8{0} ** BufferLen;
var buffer: [BufferLen]u8 = @splat(0);
};

if (!State.initialized) {
Expand Down Expand Up @@ -179,7 +179,7 @@ fn benchLargeIntRead(allocator: std.mem.Allocator) !void {
const BufferLen = 100;
const State = struct {
var initialized = false;
var buffer: [BufferLen]u8 = [_]u8{0} ** BufferLen;
var buffer: [BufferLen]u8 = @splat(0);
};

if (!State.initialized) {
Expand Down Expand Up @@ -211,7 +211,7 @@ fn benchFloatRead(allocator: std.mem.Allocator) !void {
const BufferLen = 100;
const State = struct {
var initialized = false;
var buffer: [BufferLen]u8 = [_]u8{0} ** BufferLen;
var buffer: [BufferLen]u8 = @splat(0);
};

if (!State.initialized) {
Expand Down Expand Up @@ -248,7 +248,7 @@ fn benchShortStrRead(allocator: std.mem.Allocator) !void {
const BufferLen = 1000;
const State = struct {
var initialized = false;
var buffer: [BufferLen]u8 = [_]u8{0} ** BufferLen;
var buffer: [BufferLen]u8 = @splat(0);
};

if (!State.initialized) {
Expand Down Expand Up @@ -276,27 +276,37 @@ fn benchMediumStrWrite(allocator: std.mem.Allocator) !void {
var read_buffer = fixedBufferStream(&arr);
var p = pack.init(&write_buffer, &read_buffer);

const test_str = "This is a medium length string for benchmarking MessagePack performance. " ** 4;
const base =
"This is a medium length string for benchmarking MessagePack performance. ";

const test_str = base ++ base ++ base ++ base;

const str = try Payload.strToPayload(test_str, allocator);
defer str.free(allocator);

try p.write(str);
}

fn benchMediumStrRead(allocator: std.mem.Allocator) !void {
const BufferLen = 2000;
const State = struct {
var initialized = false;
var buffer: [BufferLen]u8 = [_]u8{0} ** BufferLen;
var buffer: [BufferLen]u8 = @splat(0);
};

if (!State.initialized) {
var write_buffer = fixedBufferStream(State.buffer[0..]);
var read_buffer = fixedBufferStream(State.buffer[0..]);
var p = pack.init(&write_buffer, &read_buffer);

const test_str = "This is a medium length string for benchmarking MessagePack performance. " ** 4;
const base =
"This is a medium length string for benchmarking MessagePack performance. ";

const test_str = base ++ base ++ base ++ base;

const str = try Payload.strToPayload(test_str, allocator);
defer str.free(allocator);

try p.write(str);

State.initialized = true;
Expand All @@ -319,7 +329,7 @@ fn benchSmallBinWrite(allocator: std.mem.Allocator) !void {
var read_buffer = fixedBufferStream(&arr);
var p = pack.init(&write_buffer, &read_buffer);

var data = [_]u8{1} ** 32;
var data: [32]u8 = @splat(1);
const bin = try Payload.binToPayload(&data, allocator);
defer bin.free(allocator);
try p.write(bin);
Expand All @@ -329,15 +339,15 @@ fn benchSmallBinRead(allocator: std.mem.Allocator) !void {
const BufferLen = 1000;
const State = struct {
var initialized = false;
var buffer: [BufferLen]u8 = [_]u8{0} ** BufferLen;
var buffer: [BufferLen]u8 = @splat(0);
};

if (!State.initialized) {
var write_buffer = fixedBufferStream(State.buffer[0..]);
var read_buffer = fixedBufferStream(State.buffer[0..]);
var p = pack.init(&write_buffer, &read_buffer);

var data = [_]u8{1} ** 32;
var data: [32]u8 = @splat(1);
const bin = try Payload.binToPayload(&data, allocator);
defer bin.free(allocator);
try p.write(bin);
Expand Down Expand Up @@ -371,7 +381,7 @@ fn benchLargeBinRead(allocator: std.mem.Allocator) !void {
const BufferLen = 2000;
const State = struct {
var initialized = false;
var buffer: [BufferLen]u8 = [_]u8{0} ** BufferLen;
var buffer: [BufferLen]u8 = @splat(0);
};

if (!State.initialized) {
Expand Down Expand Up @@ -419,7 +429,7 @@ fn benchSmallArrayRead(allocator: std.mem.Allocator) !void {
const BufferLen = 1000;
const State = struct {
var initialized = false;
var buffer: [BufferLen]u8 = [_]u8{0} ** BufferLen;
var buffer: [BufferLen]u8 = @splat(0);
};

if (!State.initialized) {
Expand Down Expand Up @@ -462,7 +472,7 @@ fn benchMediumArrayRead(allocator: std.mem.Allocator) !void {
const BufferLen = 5000;
const State = struct {
var initialized = false;
var buffer: [BufferLen]u8 = [_]u8{0} ** BufferLen;
var buffer: [BufferLen]u8 = @splat(0);
};

if (!State.initialized) {
Expand Down Expand Up @@ -513,7 +523,7 @@ fn benchSmallMapRead(allocator: std.mem.Allocator) !void {
const BufferLen = 2000;
const State = struct {
var initialized = false;
var buffer: [BufferLen]u8 = [_]u8{0} ** BufferLen;
var buffer: [BufferLen]u8 = @splat(0);
};

if (!State.initialized) {
Expand Down Expand Up @@ -564,7 +574,7 @@ fn benchMediumMapRead(allocator: std.mem.Allocator) !void {
const BufferLen = 10000;
const State = struct {
var initialized = false;
var buffer: [BufferLen]u8 = [_]u8{0} ** BufferLen;
var buffer: [BufferLen]u8 = @splat(0);
};

if (!State.initialized) {
Expand Down Expand Up @@ -603,7 +613,7 @@ fn benchExtWrite(allocator: std.mem.Allocator) !void {
var read_buffer = fixedBufferStream(&arr);
var p = pack.init(&write_buffer, &read_buffer);

var data = [_]u8{1} ** 16;
var data: [16]u8 = @splat(1);
const ext = try Payload.extToPayload(42, &data, allocator);
defer ext.free(allocator);
try p.write(ext);
Expand All @@ -613,15 +623,15 @@ fn benchExtRead(allocator: std.mem.Allocator) !void {
const BufferLen = 1000;
const State = struct {
var initialized = false;
var buffer: [BufferLen]u8 = [_]u8{0} ** BufferLen;
var buffer: [BufferLen]u8 = @splat(0);
};

if (!State.initialized) {
var write_buffer = fixedBufferStream(State.buffer[0..]);
var read_buffer = fixedBufferStream(State.buffer[0..]);
var p = pack.init(&write_buffer, &read_buffer);

var data = [_]u8{1} ** 16;
var data: [16]u8 = @splat(1);
const ext = try Payload.extToPayload(42, &data, allocator);
defer ext.free(allocator);
try p.write(ext);
Expand Down Expand Up @@ -655,7 +665,7 @@ fn benchTimestamp32Read(allocator: std.mem.Allocator) !void {
const BufferLen = 1000;
const State = struct {
var initialized = false;
var buffer: [BufferLen]u8 = [_]u8{0} ** BufferLen;
var buffer: [BufferLen]u8 = @splat(0);
};

if (!State.initialized) {
Expand Down Expand Up @@ -691,7 +701,7 @@ fn benchTimestamp64Read(allocator: std.mem.Allocator) !void {
const BufferLen = 1000;
const State = struct {
var initialized = false;
var buffer: [BufferLen]u8 = [_]u8{0} ** BufferLen;
var buffer: [BufferLen]u8 = @splat(0);
};

if (!State.initialized) {
Expand Down Expand Up @@ -746,7 +756,7 @@ fn benchNestedStructureRead(allocator: std.mem.Allocator) !void {
const BufferLen = 10000;
const State = struct {
var initialized = false;
var buffer: [BufferLen]u8 = [_]u8{0} ** BufferLen;
var buffer: [BufferLen]u8 = @splat(0);
};

if (!State.initialized) {
Expand Down Expand Up @@ -798,7 +808,7 @@ fn benchMixedTypesWrite(allocator: std.mem.Allocator) !void {
try mixed.setArrElement(4, Payload.floatToPayload(3.14));
try mixed.setArrElement(5, try Payload.strToPayload("hello", allocator));

var bin_data = [_]u8{1} ** 8;
var bin_data: [8]u8 = @splat(1);
try mixed.setArrElement(6, try Payload.binToPayload(&bin_data, allocator));

var inner_arr = try Payload.arrPayload(2, allocator);
Expand All @@ -819,7 +829,7 @@ fn benchMixedTypesRead(allocator: std.mem.Allocator) !void {
const BufferLen = 5000;
const State = struct {
var initialized = false;
var buffer: [BufferLen]u8 = [_]u8{0} ** BufferLen;
var buffer: [BufferLen]u8 = @splat(0);
};

if (!State.initialized) {
Expand All @@ -837,7 +847,7 @@ fn benchMixedTypesRead(allocator: std.mem.Allocator) !void {
try mixed.setArrElement(4, Payload.floatToPayload(3.14));
try mixed.setArrElement(5, try Payload.strToPayload("hello", allocator));

var bin_data = [_]u8{1} ** 8;
var bin_data: [8]u8 = @splat(1);
try mixed.setArrElement(6, try Payload.binToPayload(&bin_data, allocator));

var inner_arr = try Payload.arrPayload(2, allocator);
Expand Down Expand Up @@ -868,14 +878,16 @@ fn benchMixedTypesRead(allocator: std.mem.Allocator) !void {
// ============================================================================

fn runBenchmarks() !void {
const equal_str: [80]u8 = @splat('=');
const minus_str: [80]u8 = @splat('-');
std.debug.print("\n", .{});
std.debug.print("=" ** 80 ++ "\n", .{});
std.debug.print(equal_str ++ "\n", .{});
std.debug.print("MessagePack Benchmark Suite\n", .{});
std.debug.print("=" ** 80 ++ "\n\n", .{});
std.debug.print(equal_str ++ "\n\n", .{});

// Basic Types
std.debug.print("Basic Types:\n", .{});
std.debug.print("-" ** 80 ++ "\n", .{});
std.debug.print(minus_str ++ "\n", .{});
try benchmark("Nil Write", 1000000, benchNilWrite);
try benchmark("Nil Read", 1000000, benchNilRead);
try benchmark("Bool Write", 1000000, benchBoolWrite);
Expand All @@ -890,7 +902,7 @@ fn runBenchmarks() !void {

// Strings
std.debug.print("Strings:\n", .{});
std.debug.print("-" ** 80 ++ "\n", .{});
std.debug.print(minus_str ++ "\n", .{});
try benchmark("Short String Write (5 bytes)", 500000, benchShortStrWrite);
try benchmark("Short String Read (5 bytes)", 500000, benchShortStrRead);
try benchmark("Medium String Write (~300 bytes)", 100000, benchMediumStrWrite);
Expand All @@ -899,7 +911,7 @@ fn runBenchmarks() !void {

// Binary Data
std.debug.print("Binary Data:\n", .{});
std.debug.print("-" ** 80 ++ "\n", .{});
std.debug.print(minus_str ++ "\n", .{});
try benchmark("Small Binary Write (32 bytes)", 500000, benchSmallBinWrite);
try benchmark("Small Binary Read (32 bytes)", 500000, benchSmallBinRead);
try benchmark("Large Binary Write (1KB)", 100000, benchLargeBinWrite);
Expand All @@ -908,7 +920,7 @@ fn runBenchmarks() !void {

// Arrays
std.debug.print("Arrays:\n", .{});
std.debug.print("-" ** 80 ++ "\n", .{});
std.debug.print(minus_str ++ "\n", .{});
try benchmark("Small Array Write (10 elements)", 100000, benchSmallArrayWrite);
try benchmark("Small Array Read (10 elements)", 100000, benchSmallArrayRead);
try benchmark("Medium Array Write (100 elements)", 50000, benchMediumArrayWrite);
Expand All @@ -917,7 +929,7 @@ fn runBenchmarks() !void {

// Maps
std.debug.print("Maps:\n", .{});
std.debug.print("-" ** 80 ++ "\n", .{});
std.debug.print(minus_str ++ "\n", .{});
try benchmark("Small Map Write (10 entries)", 100000, benchSmallMapWrite);
try benchmark("Small Map Read (10 entries)", 100000, benchSmallMapRead);
try benchmark("Medium Map Write (50 entries)", 50000, benchMediumMapWrite);
Expand All @@ -926,14 +938,14 @@ fn runBenchmarks() !void {

// Extension Types
std.debug.print("Extension Types:\n", .{});
std.debug.print("-" ** 80 ++ "\n", .{});
std.debug.print(minus_str ++ "\n", .{});
try benchmark("EXT Write (16 bytes)", 500000, benchExtWrite);
try benchmark("EXT Read (16 bytes)", 500000, benchExtRead);
std.debug.print("\n", .{});

// Timestamps
std.debug.print("Timestamps:\n", .{});
std.debug.print("-" ** 80 ++ "\n", .{});
std.debug.print(minus_str ++ "\n", .{});
try benchmark("Timestamp32 Write", 1000000, benchTimestamp32Write);
try benchmark("Timestamp32 Read", 1000000, benchTimestamp32Read);
try benchmark("Timestamp64 Write", 1000000, benchTimestamp64Write);
Expand All @@ -942,16 +954,16 @@ fn runBenchmarks() !void {

// Complex Structures
std.debug.print("Complex Structures:\n", .{});
std.debug.print("-" ** 80 ++ "\n", .{});
std.debug.print(minus_str ++ "\n", .{});
try benchmark("Nested Structure Write", 50000, benchNestedStructureWrite);
try benchmark("Nested Structure Read", 50000, benchNestedStructureRead);
try benchmark("Mixed Types Write", 50000, benchMixedTypesWrite);
try benchmark("Mixed Types Read", 50000, benchMixedTypesRead);
std.debug.print("\n", .{});

std.debug.print("=" ** 80 ++ "\n", .{});
std.debug.print(equal_str ++ "\n", .{});
std.debug.print("Benchmark Complete\n", .{});
std.debug.print("=" ** 80 ++ "\n", .{});
std.debug.print(equal_str ++ "\n", .{});
}

const BenchEntry = if (is_zig_16) struct {
Expand Down
8 changes: 4 additions & 4 deletions src/msgpack.zig
Original file line number Diff line number Diff line change
Expand Up @@ -1047,7 +1047,7 @@ pub const Map = struct {
@memcpy(new_key, key);

gop.key_ptr.* = Payload{ .str = Str.init(new_key) };
gop.value_ptr.* = Payload{ .nil = void{} };
gop.value_ptr.* = Payload{ .nil = {} };

const key_str_ptr: *[]const u8 = @constCast(&gop.key_ptr.str.str);
return .{
Expand Down Expand Up @@ -1159,7 +1159,7 @@ pub const Payload = union(enum) {
/// get a NIL payload
pub inline fn nilToPayload() Payload {
return Payload{
.nil = void{},
.nil = {},
Comment thread
coderabbitai[bot] marked this conversation as resolved.
};
}

Expand Down Expand Up @@ -2807,7 +2807,7 @@ pub fn PackWithLimits(
/// Fast path for simple types that don't require heap allocation or complex state management
inline fn readSimpleTypeFast(self: Self, marker: Markers, marker_u8: u8) !?Payload {
return switch (marker) {
.NIL => Payload{ .nil = void{} },
.NIL => Payload{ .nil = {} },
.TRUE => Payload{ .bool = true },
.FALSE => Payload{ .bool = false },

Expand Down Expand Up @@ -2891,7 +2891,7 @@ pub fn PackWithLimits(
switch (marker) {
// Simple types: construct directly
.NIL => {
current_payload = Payload{ .nil = void{} };
current_payload = Payload{ .nil = {} };
},
.TRUE, .FALSE => {
const val = try self.readBoolValue(marker);
Expand Down
Loading