Closed
Description
Short description
The json.match_schema
function takes much longer when the JSON schema is significantly large.
I created a simple reproducer here: https://github.com/lcarva/opa-json-schema-perf
(Schema too large for rego playground)
The reproducer validates a small object against the CycloneDX SBOM JSON Schema (about 5k lines long).
$ opa eval --data . 'data.main.results' --profile --format=pretty
[
[
true,
[]
],
[
true,
[]
]
]
+------------------------------+-----------+
| METRIC | VALUE |
+------------------------------+-----------+
| timer_rego_load_files_ns | 26615260 |
| timer_rego_module_compile_ns | 24751477 |
| timer_rego_module_parse_ns | 26171100 |
| timer_rego_query_compile_ns | 38743 |
| timer_rego_query_eval_ns | 288952134 |
| timer_rego_query_parse_ns | 37035 |
+------------------------------+-----------+
+--------------+----------+----------+--------------+-------------------+
| TIME | NUM EVAL | NUM REDO | NUM GEN EXPR | LOCATION |
+--------------+----------+----------+--------------+-------------------+
| 288.827434ms | 4 | 4 | 4 | main.rego:10 |
| 63.714µs | 4 | 4 | 4 | main.rego:12 |
| 32.994µs | 4 | 4 | 4 | main.rego:14 |
| 15.366µs | 1 | 1 | 1 | data.main.results |
| 3.809µs | 1 | 1 | 1 | main.rego:5 |
| 3.181µs | 1 | 1 | 1 | schema.rego:3 |
| 2.385µs | 1 | 1 | 1 | schema.rego:36 |
+--------------+----------+----------+--------------+-------------------+
main.rego:10
is the json.match_schema
call where the CycloneDX schema is being used. main.rego:12
uses a much smaller schema. That's 288,827 vs 63 microseconds.
Version: 0.68.0
Build Commit: db53d77c482676fadd53bc67a10cf75b3d0ce00b
Build Timestamp: 2024-08-29T15:23:19Z
Build Hostname: 3aae2b82a15f
Go Version: go1.22.5
Platform: linux/amd64
WebAssembly: available
Steps To Reproduce
See description.
Expected behavior
Validation of object should not take longer than 1ms.
Activity