From 677050646f29ea19942782e71f4ed52c6bdcf3ec Mon Sep 17 00:00:00 2001 From: samuelscheit Date: Wed, 15 Jan 2025 20:07:38 +0100 Subject: [PATCH 1/5] feat: recursive json object test --- test/gen.js | 31 +++++++++++++++++++++++++++++++ 1 file changed, 31 insertions(+) create mode 100644 test/gen.js diff --git a/test/gen.js b/test/gen.js new file mode 100644 index 0000000..af45a4d --- /dev/null +++ b/test/gen.js @@ -0,0 +1,31 @@ +const fs = require("fs"); + +const depths = { + "1K": 1_000, + "10K": 10_000, + "100K": 100_000, + "1M": 1_000_000, + "10M": 10_000_000, +}; + +for (let depthName in depths) { + const depth = depths[depthName]; + console.log(`Generating ${depth} depth object`); + + let jsonString = "{"; + + for (let i = 1; i < depth; i++) { + jsonString += '"next":{'; + } + + jsonString += '"next":null'; + + for (let i = 0; i < depth; i++) { + jsonString += "}"; + } + + const fileName = `${depthName}_recursion.json`; + + fs.writeFileSync(__dirname + `/${fileName}`, jsonString); + console.log(`File for depth ${depth} saved as ${fileName}`); +} From 55e557cbd07f2c62a3c57cb0f9aef3e7ff511202 Mon Sep 17 00:00:00 2001 From: samuelscheit Date: Fri, 17 Jan 2025 20:00:08 +0100 Subject: [PATCH 2/5] feat: go and python example --- test/recursion.go | 44 +++++++++++++++++++++++++++++++++++ test/{gen.js => recursion.js} | 0 test/recursion.py | 31 ++++++++++++++++++++++++ 3 files changed, 75 insertions(+) create mode 100644 test/recursion.go rename test/{gen.js => recursion.js} (100%) create mode 100644 test/recursion.py diff --git a/test/recursion.go b/test/recursion.go new file mode 100644 index 0000000..d2eec47 --- /dev/null +++ b/test/recursion.go @@ -0,0 +1,44 @@ +package main + +import ( + "fmt" + "os" + "path/filepath" +) + +var depths = map[string]int{ + "1K": 1000, + "10K": 10000, + "100K": 100000, + "1M": 1000000, + "10M": 10000000, +} + +func main() { + for depthName, depth := range depths { + fmt.Printf("Generating %d depth object\n", depth) + + jsonString := "{" + + for i := 1; i < depth; i++ { + jsonString += `"next":{` + } + + jsonString += `"next":null` + + for i := 0; i < depth; i++ { + jsonString += "}" + } + + fileName := fmt.Sprintf("%s_recursion.json", depthName) + filePath := filepath.Join(filepath.Dir(os.Args[0]), fileName) + + err := os.WriteFile(filePath, []byte(jsonString), 0644) + if err != nil { + fmt.Printf("Error writing file: %v\n", err) + continue + } + + fmt.Printf("File for depth %d saved as %s\n", depth, fileName) + } +} diff --git a/test/gen.js b/test/recursion.js similarity index 100% rename from test/gen.js rename to test/recursion.js diff --git a/test/recursion.py b/test/recursion.py new file mode 100644 index 0000000..c31fccf --- /dev/null +++ b/test/recursion.py @@ -0,0 +1,31 @@ +import os + +depths = { + "1K": 1_000, + "10K": 10_000, + "100K": 100_000, + "1M": 1_000_000, + "10M": 10_000_000, +} + +for depth_name, depth in depths.items(): + print(f"Generating {depth} depth object") + + json_string = "{" + + for _ in range(1, depth): + json_string += '"next":{' + + json_string += '"next":null' + + for _ in range(depth): + json_string += "}" + + file_name = f"{depth_name}_recursion.json" + file_path = os.path.join(os.path.dirname(__file__), file_name) + + with open(file_path, 'w') as f: + f.write(json_string) + + print(f"File for depth {depth} saved as {file_name}") + From 72e336cbdd25b6f4a836fe1f04785d99627138f6 Mon Sep 17 00:00:00 2001 From: samuelscheit Date: Fri, 17 Jan 2025 20:02:24 +0100 Subject: [PATCH 3/5] perf: use string builder --- test/recursion.go | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/test/recursion.go b/test/recursion.go index d2eec47..60541d7 100644 --- a/test/recursion.go +++ b/test/recursion.go @@ -4,6 +4,7 @@ import ( "fmt" "os" "path/filepath" + "strings" ) var depths = map[string]int{ @@ -18,18 +19,21 @@ func main() { for depthName, depth := range depths { fmt.Printf("Generating %d depth object\n", depth) - jsonString := "{" + var builder strings.Builder + builder.WriteString("{") for i := 1; i < depth; i++ { - jsonString += `"next":{` + builder.WriteString(`"next":{`) } - jsonString += `"next":null` + builder.WriteString(`"next":null`) for i := 0; i < depth; i++ { - jsonString += "}" + builder.WriteString("}") } + jsonString := builder.String() + fileName := fmt.Sprintf("%s_recursion.json", depthName) filePath := filepath.Join(filepath.Dir(os.Args[0]), fileName) From 764664328451eb27d8c6b2a6c114dc63e67d7200 Mon Sep 17 00:00:00 2001 From: samuelscheit Date: Fri, 17 Jan 2025 20:03:43 +0100 Subject: [PATCH 4/5] perf: use string builder --- test/recursion.py | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/test/recursion.py b/test/recursion.py index c31fccf..119acdb 100644 --- a/test/recursion.py +++ b/test/recursion.py @@ -11,15 +11,17 @@ for depth_name, depth in depths.items(): print(f"Generating {depth} depth object") - json_string = "{" + json_parts = ["{"] for _ in range(1, depth): - json_string += '"next":{' + json_parts.append('"next":{') - json_string += '"next":null' + json_parts.append('"next":null') for _ in range(depth): - json_string += "}" + json_parts.append("}") + + json_string = "".join(json_parts) file_name = f"{depth_name}_recursion.json" file_path = os.path.join(os.path.dirname(__file__), file_name) @@ -28,4 +30,3 @@ f.write(json_string) print(f"File for depth {depth} saved as {file_name}") - From 3e753079b3804cdbff589373995af7d1941d3946 Mon Sep 17 00:00:00 2001 From: samuelscheit Date: Fri, 17 Jan 2025 20:24:25 +0100 Subject: [PATCH 5/5] chore: remove go and js recursion test + merge in gen.py --- test/bench.sh | 6 ++++++ test/gen.py | 32 +++++++++++++++++++++++++++++++ test/recursion.go | 48 ----------------------------------------------- test/recursion.js | 31 ------------------------------ test/recursion.py | 32 ------------------------------- 5 files changed, 38 insertions(+), 111 deletions(-) delete mode 100644 test/recursion.go delete mode 100644 test/recursion.js delete mode 100644 test/recursion.py diff --git a/test/bench.sh b/test/bench.sh index 9585625..c926892 100755 --- a/test/bench.sh +++ b/test/bench.sh @@ -9,3 +9,9 @@ go build ./test.go hyperfine "./test ./1MB.json" "./test -libjson=false ./1MB.json" hyperfine "./test ./5MB.json" "./test -libjson=false ./5MB.json" hyperfine "./test ./10MB.json" "./test -libjson=false ./10MB.json" + +hyperfine "./test ./1K_recursion.json" "./test -libjson=false ./10MB.json" +hyperfine "./test ./10_recursion.json" "./test -libjson=false ./10MB.json" +hyperfine "./test ./100K_recursion.json" "./test -libjson=false ./10MB.json" +hyperfine "./test ./1M_recursion.json" "./test -libjson=false ./10MB.json" +hyperfine "./test ./10M_recursion.json" "./test -libjson=false ./10MB.json" diff --git a/test/gen.py b/test/gen.py index 50d2bcb..e6b6c95 100644 --- a/test/gen.py +++ b/test/gen.py @@ -1,3 +1,4 @@ +import os from os.path import exists import math @@ -20,3 +21,34 @@ def write_data(size: int): f.write("\n]") [write_data(size) for size in sizes] + +depths = { + "1K": 1_000, + "10K": 10_000, + "100K": 100_000, + "1M": 1_000_000, + "10M": 10_000_000, +} + +for depth_name, depth in depths.items(): + print(f"Generating {depth} depth object") + + json_parts = ["{"] + + for _ in range(1, depth): + json_parts.append('"next":{') + + json_parts.append('"next":null') + + for _ in range(depth): + json_parts.append("}") + + json_string = "".join(json_parts) + + file_name = f"{depth_name}_recursion.json" + file_path = os.path.join(os.path.dirname(__file__), file_name) + + with open(file_path, 'w') as f: + f.write(json_string) + + print(f"File for depth {depth} saved as {file_name}") diff --git a/test/recursion.go b/test/recursion.go deleted file mode 100644 index 60541d7..0000000 --- a/test/recursion.go +++ /dev/null @@ -1,48 +0,0 @@ -package main - -import ( - "fmt" - "os" - "path/filepath" - "strings" -) - -var depths = map[string]int{ - "1K": 1000, - "10K": 10000, - "100K": 100000, - "1M": 1000000, - "10M": 10000000, -} - -func main() { - for depthName, depth := range depths { - fmt.Printf("Generating %d depth object\n", depth) - - var builder strings.Builder - builder.WriteString("{") - - for i := 1; i < depth; i++ { - builder.WriteString(`"next":{`) - } - - builder.WriteString(`"next":null`) - - for i := 0; i < depth; i++ { - builder.WriteString("}") - } - - jsonString := builder.String() - - fileName := fmt.Sprintf("%s_recursion.json", depthName) - filePath := filepath.Join(filepath.Dir(os.Args[0]), fileName) - - err := os.WriteFile(filePath, []byte(jsonString), 0644) - if err != nil { - fmt.Printf("Error writing file: %v\n", err) - continue - } - - fmt.Printf("File for depth %d saved as %s\n", depth, fileName) - } -} diff --git a/test/recursion.js b/test/recursion.js deleted file mode 100644 index af45a4d..0000000 --- a/test/recursion.js +++ /dev/null @@ -1,31 +0,0 @@ -const fs = require("fs"); - -const depths = { - "1K": 1_000, - "10K": 10_000, - "100K": 100_000, - "1M": 1_000_000, - "10M": 10_000_000, -}; - -for (let depthName in depths) { - const depth = depths[depthName]; - console.log(`Generating ${depth} depth object`); - - let jsonString = "{"; - - for (let i = 1; i < depth; i++) { - jsonString += '"next":{'; - } - - jsonString += '"next":null'; - - for (let i = 0; i < depth; i++) { - jsonString += "}"; - } - - const fileName = `${depthName}_recursion.json`; - - fs.writeFileSync(__dirname + `/${fileName}`, jsonString); - console.log(`File for depth ${depth} saved as ${fileName}`); -} diff --git a/test/recursion.py b/test/recursion.py deleted file mode 100644 index 119acdb..0000000 --- a/test/recursion.py +++ /dev/null @@ -1,32 +0,0 @@ -import os - -depths = { - "1K": 1_000, - "10K": 10_000, - "100K": 100_000, - "1M": 1_000_000, - "10M": 10_000_000, -} - -for depth_name, depth in depths.items(): - print(f"Generating {depth} depth object") - - json_parts = ["{"] - - for _ in range(1, depth): - json_parts.append('"next":{') - - json_parts.append('"next":null') - - for _ in range(depth): - json_parts.append("}") - - json_string = "".join(json_parts) - - file_name = f"{depth_name}_recursion.json" - file_path = os.path.join(os.path.dirname(__file__), file_name) - - with open(file_path, 'w') as f: - f.write(json_string) - - print(f"File for depth {depth} saved as {file_name}")