406 lines
10 KiB
Plaintext
406 lines
10 KiB
Plaintext
// encoders.cm — nota/wota/json encode+decode benchmark
|
|
// Isolates per-type bottlenecks across all three serializers.
|
|
|
|
var nota = use('internal/nota')
|
|
var wota = use('internal/wota')
|
|
var json = use('json')
|
|
|
|
// --- Test data shapes ---
|
|
|
|
// Small integers: fast path for all encoders
|
|
var integers_small = array(100, function(i) { return i + 1 })
|
|
|
|
// Floats: stresses nota's snprintf path
|
|
var floats_array = array(100, function(i) {
|
|
return 3.14159 * (i + 1) + 0.00001 * i
|
|
})
|
|
|
|
// Short strings in records: per-string overhead, property enumeration
|
|
var strings_short = array(50, function(i) {
|
|
var r = {}
|
|
r[`k${i}`] = `value_${i}`
|
|
return r
|
|
})
|
|
|
|
// Single long string: throughput test (wota byte loop, nota kim)
|
|
var long_str = ""
|
|
var li = 0
|
|
for (li = 0; li < 100; li++) {
|
|
long_str = `${long_str}abcdefghijklmnopqrstuvwxyz0123456789ABCDEFGHIJKLMN`
|
|
}
|
|
var strings_long = long_str
|
|
|
|
// Unicode text: nota's kim encoding, wota's byte packing
|
|
var strings_unicode = "こんにちは世界 🌍🌎🌏 Ñoño café résumé naïve Ω∑∏ 你好世界"
|
|
|
|
// Nested records: cycle detection, property enumeration
|
|
function make_nested(depth, breadth) {
|
|
var obj = {}
|
|
var i = 0
|
|
var k = null
|
|
if (depth <= 0) {
|
|
for (i = 0; i < breadth; i++) {
|
|
k = `v${i}`
|
|
obj[k] = i * 2.5
|
|
}
|
|
return obj
|
|
}
|
|
for (i = 0; i < breadth; i++) {
|
|
k = `n${i}`
|
|
obj[k] = make_nested(depth - 1, breadth)
|
|
}
|
|
return obj
|
|
}
|
|
var nested_records = make_nested(3, 4)
|
|
|
|
// Flat record: property enumeration cost
|
|
var flat_record = {}
|
|
var fi = 0
|
|
for (fi = 0; fi < 50; fi++) {
|
|
flat_record[`prop_${fi}`] = fi * 1.1
|
|
}
|
|
|
|
// Mixed payload: realistic workload
|
|
var mixed_payload = array(50, function(i) {
|
|
var r = {}
|
|
r.id = i
|
|
r.name = `item_${i}`
|
|
r.active = i % 2 == 0
|
|
r.score = i * 3.14
|
|
r.tags = [`t${i % 5}`, `t${(i + 1) % 5}`]
|
|
return r
|
|
})
|
|
|
|
// --- Pre-encode for decode benchmarks ---
|
|
|
|
var nota_enc_integers = nota.encode(integers_small)
|
|
var nota_enc_floats = nota.encode(floats_array)
|
|
var nota_enc_strings_short = nota.encode(strings_short)
|
|
var nota_enc_strings_long = nota.encode(strings_long)
|
|
var nota_enc_strings_unicode = nota.encode(strings_unicode)
|
|
var nota_enc_nested = nota.encode(nested_records)
|
|
var nota_enc_flat = nota.encode(flat_record)
|
|
var nota_enc_mixed = nota.encode(mixed_payload)
|
|
|
|
var wota_enc_integers = wota.encode(integers_small)
|
|
var wota_enc_floats = wota.encode(floats_array)
|
|
var wota_enc_strings_short = wota.encode(strings_short)
|
|
var wota_enc_strings_long = wota.encode(strings_long)
|
|
var wota_enc_strings_unicode = wota.encode(strings_unicode)
|
|
var wota_enc_nested = wota.encode(nested_records)
|
|
var wota_enc_flat = wota.encode(flat_record)
|
|
var wota_enc_mixed = wota.encode(mixed_payload)
|
|
|
|
var json_enc_integers = json.encode(integers_small)
|
|
var json_enc_floats = json.encode(floats_array)
|
|
var json_enc_strings_short = json.encode(strings_short)
|
|
var json_enc_strings_long = json.encode(strings_long)
|
|
var json_enc_strings_unicode = json.encode(strings_unicode)
|
|
var json_enc_nested = json.encode(nested_records)
|
|
var json_enc_flat = json.encode(flat_record)
|
|
var json_enc_mixed = json.encode(mixed_payload)
|
|
|
|
// --- Benchmark functions ---
|
|
|
|
return {
|
|
// NOTA encode
|
|
nota_encode_integers: function(n) {
|
|
var i = 0
|
|
var r = null
|
|
for (i = 0; i < n; i++) { r = nota.encode(integers_small) }
|
|
return r
|
|
},
|
|
nota_encode_floats: function(n) {
|
|
var i = 0
|
|
var r = null
|
|
for (i = 0; i < n; i++) { r = nota.encode(floats_array) }
|
|
return r
|
|
},
|
|
nota_encode_strings_short: function(n) {
|
|
var i = 0
|
|
var r = null
|
|
for (i = 0; i < n; i++) { r = nota.encode(strings_short) }
|
|
return r
|
|
},
|
|
nota_encode_strings_long: function(n) {
|
|
var i = 0
|
|
var r = null
|
|
for (i = 0; i < n; i++) { r = nota.encode(strings_long) }
|
|
return r
|
|
},
|
|
nota_encode_strings_unicode: function(n) {
|
|
var i = 0
|
|
var r = null
|
|
for (i = 0; i < n; i++) { r = nota.encode(strings_unicode) }
|
|
return r
|
|
},
|
|
nota_encode_nested: function(n) {
|
|
var i = 0
|
|
var r = null
|
|
for (i = 0; i < n; i++) { r = nota.encode(nested_records) }
|
|
return r
|
|
},
|
|
nota_encode_flat: function(n) {
|
|
var i = 0
|
|
var r = null
|
|
for (i = 0; i < n; i++) { r = nota.encode(flat_record) }
|
|
return r
|
|
},
|
|
nota_encode_mixed: function(n) {
|
|
var i = 0
|
|
var r = null
|
|
for (i = 0; i < n; i++) { r = nota.encode(mixed_payload) }
|
|
return r
|
|
},
|
|
|
|
// NOTA decode
|
|
nota_decode_integers: function(n) {
|
|
var i = 0
|
|
var r = null
|
|
for (i = 0; i < n; i++) { r = nota.decode(nota_enc_integers) }
|
|
return r
|
|
},
|
|
nota_decode_floats: function(n) {
|
|
var i = 0
|
|
var r = null
|
|
for (i = 0; i < n; i++) { r = nota.decode(nota_enc_floats) }
|
|
return r
|
|
},
|
|
nota_decode_strings_short: function(n) {
|
|
var i = 0
|
|
var r = null
|
|
for (i = 0; i < n; i++) { r = nota.decode(nota_enc_strings_short) }
|
|
return r
|
|
},
|
|
nota_decode_strings_long: function(n) {
|
|
var i = 0
|
|
var r = null
|
|
for (i = 0; i < n; i++) { r = nota.decode(nota_enc_strings_long) }
|
|
return r
|
|
},
|
|
nota_decode_strings_unicode: function(n) {
|
|
var i = 0
|
|
var r = null
|
|
for (i = 0; i < n; i++) { r = nota.decode(nota_enc_strings_unicode) }
|
|
return r
|
|
},
|
|
nota_decode_nested: function(n) {
|
|
var i = 0
|
|
var r = null
|
|
for (i = 0; i < n; i++) { r = nota.decode(nota_enc_nested) }
|
|
return r
|
|
},
|
|
nota_decode_flat: function(n) {
|
|
var i = 0
|
|
var r = null
|
|
for (i = 0; i < n; i++) { r = nota.decode(nota_enc_flat) }
|
|
return r
|
|
},
|
|
nota_decode_mixed: function(n) {
|
|
var i = 0
|
|
var r = null
|
|
for (i = 0; i < n; i++) { r = nota.decode(nota_enc_mixed) }
|
|
return r
|
|
},
|
|
|
|
// WOTA encode
|
|
wota_encode_integers: function(n) {
|
|
var i = 0
|
|
var r = null
|
|
for (i = 0; i < n; i++) { r = wota.encode(integers_small) }
|
|
return r
|
|
},
|
|
wota_encode_floats: function(n) {
|
|
var i = 0
|
|
var r = null
|
|
for (i = 0; i < n; i++) { r = wota.encode(floats_array) }
|
|
return r
|
|
},
|
|
wota_encode_strings_short: function(n) {
|
|
var i = 0
|
|
var r = null
|
|
for (i = 0; i < n; i++) { r = wota.encode(strings_short) }
|
|
return r
|
|
},
|
|
wota_encode_strings_long: function(n) {
|
|
var i = 0
|
|
var r = null
|
|
for (i = 0; i < n; i++) { r = wota.encode(strings_long) }
|
|
return r
|
|
},
|
|
wota_encode_strings_unicode: function(n) {
|
|
var i = 0
|
|
var r = null
|
|
for (i = 0; i < n; i++) { r = wota.encode(strings_unicode) }
|
|
return r
|
|
},
|
|
wota_encode_nested: function(n) {
|
|
var i = 0
|
|
var r = null
|
|
for (i = 0; i < n; i++) { r = wota.encode(nested_records) }
|
|
return r
|
|
},
|
|
wota_encode_flat: function(n) {
|
|
var i = 0
|
|
var r = null
|
|
for (i = 0; i < n; i++) { r = wota.encode(flat_record) }
|
|
return r
|
|
},
|
|
wota_encode_mixed: function(n) {
|
|
var i = 0
|
|
var r = null
|
|
for (i = 0; i < n; i++) { r = wota.encode(mixed_payload) }
|
|
return r
|
|
},
|
|
|
|
// WOTA decode
|
|
wota_decode_integers: function(n) {
|
|
var i = 0
|
|
var r = null
|
|
for (i = 0; i < n; i++) { r = wota.decode(wota_enc_integers) }
|
|
return r
|
|
},
|
|
wota_decode_floats: function(n) {
|
|
var i = 0
|
|
var r = null
|
|
for (i = 0; i < n; i++) { r = wota.decode(wota_enc_floats) }
|
|
return r
|
|
},
|
|
wota_decode_strings_short: function(n) {
|
|
var i = 0
|
|
var r = null
|
|
for (i = 0; i < n; i++) { r = wota.decode(wota_enc_strings_short) }
|
|
return r
|
|
},
|
|
wota_decode_strings_long: function(n) {
|
|
var i = 0
|
|
var r = null
|
|
for (i = 0; i < n; i++) { r = wota.decode(wota_enc_strings_long) }
|
|
return r
|
|
},
|
|
wota_decode_strings_unicode: function(n) {
|
|
var i = 0
|
|
var r = null
|
|
for (i = 0; i < n; i++) { r = wota.decode(wota_enc_strings_unicode) }
|
|
return r
|
|
},
|
|
wota_decode_nested: function(n) {
|
|
var i = 0
|
|
var r = null
|
|
for (i = 0; i < n; i++) { r = wota.decode(wota_enc_nested) }
|
|
return r
|
|
},
|
|
wota_decode_flat: function(n) {
|
|
var i = 0
|
|
var r = null
|
|
for (i = 0; i < n; i++) { r = wota.decode(wota_enc_flat) }
|
|
return r
|
|
},
|
|
wota_decode_mixed: function(n) {
|
|
var i = 0
|
|
var r = null
|
|
for (i = 0; i < n; i++) { r = wota.decode(wota_enc_mixed) }
|
|
return r
|
|
},
|
|
|
|
// JSON encode
|
|
json_encode_integers: function(n) {
|
|
var i = 0
|
|
var r = null
|
|
for (i = 0; i < n; i++) { r = json.encode(integers_small) }
|
|
return r
|
|
},
|
|
json_encode_floats: function(n) {
|
|
var i = 0
|
|
var r = null
|
|
for (i = 0; i < n; i++) { r = json.encode(floats_array) }
|
|
return r
|
|
},
|
|
json_encode_strings_short: function(n) {
|
|
var i = 0
|
|
var r = null
|
|
for (i = 0; i < n; i++) { r = json.encode(strings_short) }
|
|
return r
|
|
},
|
|
json_encode_strings_long: function(n) {
|
|
var i = 0
|
|
var r = null
|
|
for (i = 0; i < n; i++) { r = json.encode(strings_long) }
|
|
return r
|
|
},
|
|
json_encode_strings_unicode: function(n) {
|
|
var i = 0
|
|
var r = null
|
|
for (i = 0; i < n; i++) { r = json.encode(strings_unicode) }
|
|
return r
|
|
},
|
|
json_encode_nested: function(n) {
|
|
var i = 0
|
|
var r = null
|
|
for (i = 0; i < n; i++) { r = json.encode(nested_records) }
|
|
return r
|
|
},
|
|
json_encode_flat: function(n) {
|
|
var i = 0
|
|
var r = null
|
|
for (i = 0; i < n; i++) { r = json.encode(flat_record) }
|
|
return r
|
|
},
|
|
json_encode_mixed: function(n) {
|
|
var i = 0
|
|
var r = null
|
|
for (i = 0; i < n; i++) { r = json.encode(mixed_payload) }
|
|
return r
|
|
},
|
|
|
|
// JSON decode
|
|
json_decode_integers: function(n) {
|
|
var i = 0
|
|
var r = null
|
|
for (i = 0; i < n; i++) { r = json.decode(json_enc_integers) }
|
|
return r
|
|
},
|
|
json_decode_floats: function(n) {
|
|
var i = 0
|
|
var r = null
|
|
for (i = 0; i < n; i++) { r = json.decode(json_enc_floats) }
|
|
return r
|
|
},
|
|
json_decode_strings_short: function(n) {
|
|
var i = 0
|
|
var r = null
|
|
for (i = 0; i < n; i++) { r = json.decode(json_enc_strings_short) }
|
|
return r
|
|
},
|
|
json_decode_strings_long: function(n) {
|
|
var i = 0
|
|
var r = null
|
|
for (i = 0; i < n; i++) { r = json.decode(json_enc_strings_long) }
|
|
return r
|
|
},
|
|
json_decode_strings_unicode: function(n) {
|
|
var i = 0
|
|
var r = null
|
|
for (i = 0; i < n; i++) { r = json.decode(json_enc_strings_unicode) }
|
|
return r
|
|
},
|
|
json_decode_nested: function(n) {
|
|
var i = 0
|
|
var r = null
|
|
for (i = 0; i < n; i++) { r = json.decode(json_enc_nested) }
|
|
return r
|
|
},
|
|
json_decode_flat: function(n) {
|
|
var i = 0
|
|
var r = null
|
|
for (i = 0; i < n; i++) { r = json.decode(json_enc_flat) }
|
|
return r
|
|
},
|
|
json_decode_mixed: function(n) {
|
|
var i = 0
|
|
var r = null
|
|
for (i = 0; i < n; i++) { r = json.decode(json_enc_mixed) }
|
|
return r
|
|
}
|
|
}
|