Add config and schema for benchmark

This commit is contained in:
Adrien Bouvais 2025-01-14 22:32:31 +01:00
parent 173b302976
commit 672d79cbea
4 changed files with 193 additions and 92 deletions

View File

@ -29,36 +29,49 @@ pub fn myLog(
} }
pub fn main() !void { pub fn main() !void {
const to_test = [_]usize{500_000}; const to_test = [_]usize{ 500, 50_000, 5_000_000 };
{ var line_buffer: [1024 * 1024]u8 = undefined;
var line_buffer: [1024 * 1024]u8 = undefined; for (to_test) |users_count| {
var db_engine = DBEngine.init("benchmark", "schema/example"); var db_engine = DBEngine.init("benchmarkDB", "schema/benchmark");
defer db_engine.deinit(); defer db_engine.deinit();
for (to_test) |users_count| { {
{ const null_term_query_str = try std.fmt.bufPrintZ(&line_buffer, "DELETE User {{}}", .{});
const null_term_query_str = try std.fmt.bufPrintZ(&line_buffer, "DELETE User {{}}", .{}); var parser = ziqlParser.init(&db_engine.file_engine, &db_engine.schema_engine);
var parser = ziqlParser.init(&db_engine.file_engine, &db_engine.schema_engine); try parser.parse(null_term_query_str);
try parser.parse(null_term_query_str); }
} // Populate with random dummy value
// Populate with random dummy value // Need some speed up, spended times to find that it is the parsonConditionValue that take time, the last switch to be exact, that parse str to value
// Need some speed up, spended times to find that it is the parsonConditionValue that take time, the last switch to be exact, that parse str to value {
{ std.debug.print("\n=====================================\n\n", .{});
std.debug.print("\n=====================================\n\n", .{}); std.debug.print("Populating with {d} users.\n", .{users_count});
std.debug.print("Populating with {d} users.\n", .{users_count});
const allocator = std.heap.page_allocator; const allocator = std.heap.page_allocator;
var prng = std.rand.DefaultPrng.init(0); var prng = std.rand.DefaultPrng.init(0);
const rng = prng.random(); const rng = prng.random();
const populate_start_time = std.time.nanoTimestamp(); const populate_start_time = std.time.nanoTimestamp();
var array = std.ArrayList(u8).init(allocator); var array = std.ArrayList(u8).init(allocator);
defer array.deinit(); defer array.deinit();
var writer = array.writer(); var writer = array.writer();
try writer.print(
"ADD User (name = '{s}', email='{s}')",
.{
names[rng.uintAtMost(usize, names.len - 1)],
emails[rng.uintAtMost(usize, emails.len - 1)],
rng.uintAtMost(usize, 100),
scores[rng.uintAtMost(usize, scores.len - 1)],
dates[rng.uintAtMost(usize, dates.len - 1)],
times[rng.uintAtMost(usize, times.len - 1)],
datetimes[rng.uintAtMost(usize, datetimes.len - 1)],
},
);
for (users_count - 1) |_| {
try writer.print( try writer.print(
"ADD User (name = '{s}', email='{s}', age={d}, scores=[ {d} ], best_friend=none, friends=none, bday={s}, a_time={s}, last_order={s})", "('{s}', '{s}', {d}, [ {d} ], none, none, {s}, {s}, {s})",
.{ .{
names[rng.uintAtMost(usize, names.len - 1)], names[rng.uintAtMost(usize, names.len - 1)],
emails[rng.uintAtMost(usize, emails.len - 1)], emails[rng.uintAtMost(usize, emails.len - 1)],
@ -69,81 +82,66 @@ pub fn main() !void {
datetimes[rng.uintAtMost(usize, datetimes.len - 1)], datetimes[rng.uintAtMost(usize, datetimes.len - 1)],
}, },
); );
}
for (users_count - 1) |_| { const null_term_query_str = try std.fmt.allocPrintZ(allocator, "{s}", .{array.items});
try writer.print( defer allocator.free(null_term_query_str);
"('{s}', '{s}', {d}, [ {d} ], none, none, {s}, {s}, {s})",
.{
names[rng.uintAtMost(usize, names.len - 1)],
emails[rng.uintAtMost(usize, emails.len - 1)],
rng.uintAtMost(usize, 100),
scores[rng.uintAtMost(usize, scores.len - 1)],
dates[rng.uintAtMost(usize, dates.len - 1)],
times[rng.uintAtMost(usize, times.len - 1)],
datetimes[rng.uintAtMost(usize, datetimes.len - 1)],
},
);
}
const null_term_query_str = try std.fmt.allocPrintZ(allocator, "{s}", .{array.items}); var parser = ziqlParser.init(&db_engine.file_engine, &db_engine.schema_engine);
defer allocator.free(null_term_query_str); try parser.parse(null_term_query_str);
const populate_end_time = std.time.nanoTimestamp();
const populate_duration = @as(f64, @floatFromInt(populate_end_time - populate_start_time)) / 1e9;
std.debug.print("Populate duration: {d:.6} seconds\n\n", .{populate_duration});
var buffer = std.ArrayList(u8).init(std.heap.page_allocator);
defer buffer.deinit();
try db_engine.file_engine.writeDbMetrics(&buffer);
std.debug.print("{s}\n", .{buffer.items});
std.debug.print("--------------------------------------\n\n", .{});
}
//{
// for (db_engine.schema_engine.struct_array) |sstruct| {
// const mb: f64 = @as(f64, @floatFromInt(sstruct.uuid_file_index.arena.queryCapacity())) / 1024.0 / 1024.0;
// std.debug.print("Sstruct: {s}\n", .{sstruct.name});
// std.debug.print("Memory: {d:.2}Mb\n", .{mb});
// std.debug.print("Count: {d}\n\n", .{sstruct.uuid_file_index.map.count()});
// std.debug.print("--------------------------------------\n\n", .{});
// }
//}
// Define your benchmark queries
{
const queries = [_][]const u8{
"GRAB User {}",
"GRAB User [1] {}",
"GRAB User [name] {}",
"GRAB User {name = 'Charlie'}",
"GRAB User {age > 30}",
"GRAB User {bday > 2000/01/01}",
"GRAB User {age > 30 AND name = 'Charlie' AND bday > 2000/01/01}",
"GRAB User {best_friend IN {name = 'Charlie'}}",
"DELETE User {}",
};
// Run benchmarks
for (queries) |query| {
const start_time = std.time.nanoTimestamp();
// Execute the query here
const null_term_query_str = try std.fmt.bufPrintZ(&line_buffer, "{s}", .{query});
var parser = ziqlParser.init(&db_engine.file_engine, &db_engine.schema_engine); var parser = ziqlParser.init(&db_engine.file_engine, &db_engine.schema_engine);
try parser.parse(null_term_query_str); try parser.parse(null_term_query_str);
const populate_end_time = std.time.nanoTimestamp(); const end_time = std.time.nanoTimestamp();
const populate_duration = @as(f64, @floatFromInt(populate_end_time - populate_start_time)) / 1e9; const duration = @as(f64, @floatFromInt(end_time - start_time)) / 1e6;
std.debug.print("Populate duration: {d:.6} seconds\n\n", .{populate_duration}); std.debug.print("Query: \t\t{s}\nDuration: \t{d:.6} ms\n\n", .{ query, duration });
var buffer = std.ArrayList(u8).init(std.heap.page_allocator);
defer buffer.deinit();
try db_engine.file_engine.writeDbMetrics(&buffer);
std.debug.print("{s}\n", .{buffer.items});
std.debug.print("--------------------------------------\n\n", .{});
} }
//{ std.debug.print("=====================================\n\n", .{});
// for (db_engine.schema_engine.struct_array) |sstruct| {
// const mb: f64 = @as(f64, @floatFromInt(sstruct.uuid_file_index.arena.queryCapacity())) / 1024.0 / 1024.0;
// std.debug.print("Sstruct: {s}\n", .{sstruct.name});
// std.debug.print("Memory: {d:.2}Mb\n", .{mb});
// std.debug.print("Count: {d}\n\n", .{sstruct.uuid_file_index.map.count()});
// std.debug.print("--------------------------------------\n\n", .{});
// }
//}
// Define your benchmark queries
{
const queries = [_][]const u8{
"GRAB User {}",
"GRAB User [1] {}",
"GRAB User [name] {}",
"GRAB User {name = 'Charlie'}",
"GRAB User {age > 30}",
"GRAB User {bday > 2000/01/01}",
"GRAB User {age > 30 AND name = 'Charlie' AND bday > 2000/01/01}",
"GRAB User {best_friend IN {name = 'Charlie'}}",
"DELETE User {}",
};
// Run benchmarks
for (queries) |query| {
const start_time = std.time.nanoTimestamp();
// Execute the query here
const null_term_query_str = try std.fmt.bufPrintZ(&line_buffer, "{s}", .{query});
var parser = ziqlParser.init(&db_engine.file_engine, &db_engine.schema_engine);
try parser.parse(null_term_query_str);
const end_time = std.time.nanoTimestamp();
const duration = @as(f64, @floatFromInt(end_time - start_time)) / 1e6;
std.debug.print("Query: \t\t{s}\nDuration: \t{d:.6} ms\n\n", .{ query, duration });
}
std.debug.print("=====================================\n\n", .{});
}
} }
} }
} }

View File

@ -17,6 +17,7 @@ pub const HELP_MESSAGE = struct {
\\run To run a query. \\run To run a query.
\\db Create or chose a database. \\db Create or chose a database.
\\schema Initialize the database schema. \\schema Initialize the database schema.
\\dump To export data in other format and backup.
\\quit Stop the CLI with memory safety. \\quit Stop the CLI with memory safety.
\\ \\
\\For more informations: https://mrbounty.github.io/ZipponDB/cli \\For more informations: https://mrbounty.github.io/ZipponDB/cli
@ -24,9 +25,9 @@ pub const HELP_MESSAGE = struct {
; ;
pub const db: []const u8 = pub const db: []const u8 =
\\Available commands: \\Available commands:
\\new Create a new database using a path to a sub folder. \\use Select or create a folder to use as database.
\\use Select an existing folder to use as database.
\\metrics Print some metrics of the current database. \\metrics Print some metrics of the current database.
\\state Print the current db state (Ok, MissingSchemaEngine, MissingFileEngine).
\\ \\
\\For more informations: https://mrbounty.github.io/ZipponDB/cli \\For more informations: https://mrbounty.github.io/ZipponDB/cli
\\ \\
@ -34,7 +35,16 @@ pub const HELP_MESSAGE = struct {
pub const schema: []const u8 = pub const schema: []const u8 =
\\Available commands: \\Available commands:
\\describe Print the schema use by the currently database. \\describe Print the schema use by the currently database.
\\init Take the path to a schema file and initialize the database. \\use Take the path to a schema file and initialize the database.
\\
\\For more informations: https://mrbounty.github.io/ZipponDB/cli
\\
;
pub const dump: []const u8 =
\\Available commands:
\\csv Export all database in a csv format.
\\json Export all database in a json format. (Not implemented)
\\zid Export all database in a zid format. (Not implemented)
\\ \\
\\For more informations: https://mrbounty.github.io/ZipponDB/cli \\For more informations: https://mrbounty.github.io/ZipponDB/cli
\\ \\

73
lib/config_benchmark.zig Normal file
View File

@ -0,0 +1,73 @@
pub const BUFFER_SIZE = 1024 * 10; // Used a bit everywhere. The size for the schema for example. 10kB
pub const MAX_FILE_SIZE = 1024 * 1024; // 1MB
pub const CPU_CORE = 16;
// Debug
pub const PRINT_STATE = false;
pub const DONT_SEND = true;
pub const DONT_SEND_ERROR = false;
pub const RESET_LOG_AT_RESTART = false; // If true, will reset the log file at the start of the db, otherwise just keep adding to it
// Help message
pub const HELP_MESSAGE = struct {
pub const main: []const u8 =
\\Welcome to ZipponDB v0.2!
\\
\\Available commands:
\\run To run a query.
\\db Create or chose a database.
\\schema Initialize the database schema.
\\dump To export data in other format and backup.
\\quit Stop the CLI with memory safety.
\\
\\For more informations: https://mrbounty.github.io/ZipponDB/cli
\\
;
pub const db: []const u8 =
\\Available commands:
\\use Select or create a folder to use as database.
\\metrics Print some metrics of the current database.
\\state Print the current db state (Ok, MissingSchemaEngine, MissingFileEngine).
\\
\\For more informations: https://mrbounty.github.io/ZipponDB/cli
\\
;
pub const schema: []const u8 =
\\Available commands:
\\describe Print the schema use by the currently database.
\\use Take the path to a schema file and initialize the database.
\\
\\For more informations: https://mrbounty.github.io/ZipponDB/cli
\\
;
pub const dump: []const u8 =
\\Available commands:
\\csv Export all database in a csv format.
\\json Export all database in a json format. (Not implemented)
\\zid Export all database in a zid format. (Not implemented)
\\
\\For more informations: https://mrbounty.github.io/ZipponDB/cli
\\
;
pub const no_engine: []const u8 =
\\To start using ZipponDB you need to create a new database.
\\This is a directory/folder that will be use to store data, logs, backup, ect.
\\To create one use 'db new path/to/directory'. E.g. 'db new data'.
\\Or use an existing one with 'db use'.
\\
\\You can also set the environment variable ZIPPONDB_PATH to the desire path.
\\
\\For more informations: https://mrbounty.github.io/ZipponDB/cli
\\
;
pub const no_schema: []const u8 =
\\A database was found here `{s}` but no schema find inside.
\\To start a database, you need to attach it a schema using a schema file.
\\By using 'schema init path/to/schema'. For more informations on how to create a schema: TODO add link
\\
\\You can also set the environment variable ZIPPONDB_SCHEMA to the path to a schema file.
\\
\\For more informations: https://mrbounty.github.io/ZipponDB/Schema
\\
;
};

20
schema/benchmark Normal file
View File

@ -0,0 +1,20 @@
User (
name: str,
email: str,
orders: []Order,
)
Order (
items: []Item,
at: datetime,
)
Item (
name: str,
price: float,
category: Category,
)
Category (
name: str,
)