diff --git a/.github/workflows/benchmark.yml b/.github/workflows/benchmark.yml index f4ef732b3..061e3a17c 100644 --- a/.github/workflows/benchmark.yml +++ b/.github/workflows/benchmark.yml @@ -17,10 +17,12 @@ jobs: # this is the performance benchmark - name: Cache deps run: deno cache performance/mod.ts + - name: Download sysbench + run: sudo apt-get install -y sysbench - name: Run Benchmark run: NO_COLOR=true deno bench --unstable -A performance/mod.ts | tee output.txt - name: Format Benchmark Output - run: deno run -A performance/tranformOutput.ts + run: deno run --unstable -A performance/tranformOutput.ts # this is the memory benchmark - name: Download db from benchmark repo diff --git a/performance/generateMessage.ts b/performance/generateMessage.ts index 862cb0e48..6527fb978 100644 --- a/performance/generateMessage.ts +++ b/performance/generateMessage.ts @@ -70,7 +70,7 @@ for (const benchmark of latestHeadBenchmarks.benches) { compareWithHead[benchmark.name] = { //@ts-ignore previous: {}, - ...compareWithBase[benchmark.name], + ...compareWithHead[benchmark.name], current: benchmark, }; } diff --git a/performance/mod.ts b/performance/mod.ts index 1ec5bceeb..b131ce0ad 100644 --- a/performance/mod.ts +++ b/performance/mod.ts @@ -14,6 +14,16 @@ const discordGuild = JSON.parse( const currentGuild = bot.transformers.guild(bot, { guild: discordGuild, shardId: 0 }); const previousGuild = oldBot.transformers.guild(oldBot, { guild: discordGuild, shardId: 0 }); +Deno.bench("[Transformer] Discord Guild to a Guild", () => { + bot.transformers.guild(bot, { guild: discordGuild, shardId: 0 }); +}); + +Deno.bench("[Transformer - Previous] Discord Guild to a Guild", { + ignore: Deno.env.get("CI") === "true", +}, () => { + oldBot.transformers.guild(oldBot, { guild: discordGuild, shardId: 0 }); +}); + Deno.bench("[Guild.toggles.features] Get the features of a guild", () => { currentGuild.toggles.features; }); @@ -68,7 +78,8 @@ for ( `https://raw.githubusercontent.com/discordeno/discordeno/benchies/cache/cachedObject/${channelType}.json`, )).text(), ); - const formattedChannelType = channelType.split("-").map((word) => word[0].toUpperCase() + word.slice(1)).join(" "); + let formattedChannelType = channelType.split("-").map((word) => word[0].toUpperCase() + word.slice(1)).join(" "); + if (formattedChannelType === "Rules") formattedChannelType = "Rules Channel"; Deno.bench(`[Transformer] Discord ${formattedChannelType} to a ${formattedChannelType}`, () => { bot.transformers.channel(bot, { channel: discordChannel }); @@ -95,3 +106,96 @@ for ( }); */ } + +// Fetch the cached member +const discordMember = JSON.parse( + await (await fetch("https://raw.githubusercontent.com/discordeno/discordeno/benchies/cache/cachedObject/member.json")) + .text(), +); + +const newMember = bot.transformers.member(bot, discordMember, 0n, 0n); +const oldMember = oldBot.transformers.member(oldBot, discordMember, 0n, 0n); + +Deno.bench("[Transformer] Discord Member to a Member", () => { + bot.transformers.member(bot, discordMember, 0n, 0n); +}); + +Deno.bench("[Transformer - Previous] Discord Member to a Member", { + ignore: Deno.env.get("CI") === "true", +}, () => { + oldBot.transformers.member(oldBot, discordMember, 0n, 0n); +}); + +Deno.bench("[Transformer] Member to a Discord Member", () => { + bot.transformers.reverse.member(bot, newMember); +}); + +Deno.bench("[Transformer - Previous] Member to a Discord Member", { + ignore: Deno.env.get("CI") === "true", +}, () => { + oldBot.transformers.reverse.member(oldBot, oldMember); +}); + +// Fetch the cached role +const discordRole = JSON.parse( + await (await fetch("https://raw.githubusercontent.com/discordeno/discordeno/benchies/cache/cachedObject/role.json")) + .text(), +); + +const newRole = bot.transformers.role(bot, { role: discordRole, guildId: 0n }); +const oldRole = oldBot.transformers.role(oldBot, { role: discordRole, guildId: 0n }); + +Deno.bench("[Transformer] Discord Role to a Role", () => { + bot.transformers.role(bot, { role: discordRole, guildId: 0n }); +}); + +Deno.bench("[Transformer - Previous] Discord Role to a Role", { + ignore: Deno.env.get("CI") === "true", +}, () => { + oldBot.transformers.role(oldBot, { role: discordRole, guildId: 0n }); +}); + +/* Not implemented +Deno.bench("[Transformer] Role to a Discord Role", () => { +bot.transformers.reverse.role(bot, newRole); +}); + +Deno.bench("[Transformer - Previous] Role to a Discord Role", { +ignore: Deno.env.get("CI") === "true", +}, () => { +oldBot.transformers.reverse.role(oldBot, oldRole); +}); +*/ + +// Fetch the cached message +const discordMessage = JSON.parse( + await (await fetch( + "https://raw.githubusercontent.com/discordeno/discordeno/benchies/cache/cachedObject/message.json", + )) + .text(), +); + +const newMessage = bot.transformers.message(bot, discordMessage); +const oldMessage = oldBot.transformers.message(oldBot, discordMessage); + +Deno.bench("[Transformer] Discord Message to a Message", () => { + bot.transformers.message(bot, discordMessage); +}); + +Deno.bench("[Transformer - Previous] Discord Message to a Message", { + ignore: Deno.env.get("CI") === "true", +}, () => { + oldBot.transformers.message(oldBot, discordMessage); +}); + +/* Not implemented +Deno.bench("[Transformer] User to a Discord User", () => { + bot.transformers.reverse.message(bot, newUser); +}); + +Deno.bench("[Transformer - Previous] User to a Discord User", { + ignore: Deno.env.get("CI") === "true", +}, () => { + oldBot.transformers.reverse.message(oldBot, oldUser); +}); +*/ diff --git a/performance/tranformOutput.ts b/performance/tranformOutput.ts index c0a96a8c7..d60d26618 100644 --- a/performance/tranformOutput.ts +++ b/performance/tranformOutput.ts @@ -1,13 +1,26 @@ +// Just a constant sysbench sorce to compare against +const baselineSysbenchScore = 2000; +let sysbenchScore = 2000; + +try { + const { stdout } = await Deno.spawn("sysbench", { args: ["cpu", "run"] }); + const textout = new TextDecoder().decode(stdout); + sysbenchScore = parseFloat(textout.match(/\s+events per second:\s+(.+)/)![1]); +} catch { + // +} + const output = await Deno.readTextFile("output.txt"); const lines = output.split(/\r?\n/g); const ret = []; const unitMultiplier = { - "s": 1000 * 1000 * 1000, - "ms": 1000 * 1000, - "µs": 1000, - "ns": 1, + "s": 1000 * 1000 * 1000 * (sysbenchScore / baselineSysbenchScore), + "ms": 1000 * 1000 * (sysbenchScore / baselineSysbenchScore), + "µs": 1000 * (sysbenchScore / baselineSysbenchScore), + "ns": 1 * (sysbenchScore / baselineSysbenchScore), + "ps": 0.1 * (sysbenchScore / baselineSysbenchScore), }; for (const line of lines) {