1
1
mirror of https://github.com/mgree/ffs.git synced 2024-09-11 19:17:40 +03:00
ffs/utils/synth_json
Michael Greenberg 6ed74ee0c7
Timing support (#46)
Benchmarks, in two flavors: real-world benchmarks and synthetic microbenchmarks.

`--time` flag for benchmarking output on stderr.

Using R to generate pretty graphs. Some overhaul of build scripts and artifacts, with the hope of simplifying the release system.
2021-07-29 17:55:53 -07:00

103 lines
2.1 KiB
Python
Executable File

#!/usr/bin/env python3
from sys import argv, stderr
import os
import json
counter = 0
letters = list("abcdefghijklmnopqrstuvwxyz")
def fresh_name():
global counter
num = counter
counter = counter + 1
name = ""
while num > 0 or name == "":
name += letters[num % 26]
num //= 26
return name
def object(field,value):
o = dict()
o[field] = value
return o
def deep(kind, depth):
if kind == "list":
if depth <= 0:
return list()
f = lambda v: [v]
elif kind == "named":
if depth <= 0:
return dict()
def f(v):
o = dict()
o[fresh_name()] = v
return o
else:
raise(ValueError("Unknown kind '{}'".format(kind)))
v = None
for i in range(0,depth):
v = f(v)
return v
def wide(kind, width):
if kind == "list":
v = list()
def f(v):
v.append(None)
return v
elif kind == "named":
v = dict()
def f(v):
v[fresh_name()] = None
return v
else:
raise(ValueError("Unknown kind '{}'".format(kind)))
for i in range(0,width):
v = f(v)
return v
def usage():
print("Usage: {} [list|named] [wide|deep] [size]".format(os.path.basename(argv[0])), file=stderr)
exit(2)
if __name__ == "__main__":
if len(argv) != 4:
usage()
kind,approach,size = argv[1:]
if kind.lower().strip() not in ["named", "list"]:
print("Unknown kind '{}' (expected 'list' or 'named')".format(kind), file=stderr)
usage()
else:
kind = kind.lower().strip()
if approach.lower().strip() == "wide":
f = wide
elif approach.lower().strip() == "deep":
f = deep
else:
print("Unknown approach '{}' (expected 'wide' or 'deep')".format(kind), file=stderr)
usage()
try:
size = int(size)
except:
print("Unknown size '{}', expected non-negative number".format(size), file=stderr)
usage()
print(json.dumps(f(kind, size), separators=(',', ':')))