Files
lvgl/scripts/perf/serialize_results.py
2025-06-26 08:09:23 +02:00

152 lines
4.2 KiB
Python

"""
This script takes json and mpk input files and combines them
An mpk (msgpack) file contains the benchmark result history for a specific config.
Unpacked, this file will have the following format:
```json
[
{
"commit_hash": "<commit_hash>"
"scenes": [
{
"scene_name": "",
"avg_cpu": 0,
"avg_fps": 0,
"avg_time": 0,
"render_time": 0,
"flush_time": 0,
}
...
]
},
...
]
```
A json file contains the benchmark result for a specific commit:
```json
[
{
"scene_name": "",
"avg_cpu": 0,
"avg_fps": 0,
"avg_time": 0,
"render_time": 0,
"flush_time": 0,
}
...
]
```
This script combines the json files with the mpk files and outputs new mpk files
The files are expected to follow the format 'results-<image_type>-<config_name>.[mpk|json]'
There are 3 possibilities when handling these files
1. The pair (`file1.mpk` `file1.json`) exists: Normal operation, we have a history file and some new results.
In this case we take the information inside the `file1.json` and append it to the `file1.mpk` before exporting it
2. `file1.json` exists but `file1.mpk` doesn't: Happens when a new config and/or image type are added and there's no history yet
In this case we create a new `file1.mpk` with a single history entry.
3. `file1.mpk` exists but `file1.json` doesn't: Happens when an old config isn't tested anymore for any reason.
In this case we simpyl copy the old `file1.mpk`
"""
import argparse
import os
import shutil
import msgpack
import json
def save_mpk(mpk_path, mpk_data):
with open(mpk_path, "wb") as f:
f.write(mpk_data)
def generate_new_mpk(json_path, output_path, commit_hash):
with open(json_path, "r") as f:
json_data: list = json.load(f)
mpk_data = msgpack.packb([{"commit_hash": commit_hash, "scenes": json_data}])
save_mpk(output_path, mpk_data)
def append_json_to_mpk(mpk_path, json_path, output_path, commit_hash):
with open(mpk_path, "rb") as f:
mpk_data: list = msgpack.unpackb(f.read())
with open(json_path, "r") as f:
json_data = json.load(f)
mpk_data.append({"commit_hash": commit_hash, "scenes": json_data})
save_mpk(output_path, msgpack.packb(mpk_data))
def path(folder, filename):
return os.path.join(folder, filename)
def main():
parser = argparse.ArgumentParser(
description="Merge new results into previous results"
)
parser.add_argument("--commit-hash", type=str, required=True, help="Commit Hash")
parser.add_argument(
"--input",
type=str,
required=True,
help="Input Folder",
)
parser.add_argument(
"--output",
type=str,
required=True,
help="Output Folder",
)
args = parser.parse_args()
input_folder: str = args.input
output_folder: str = args.output
commit_hash: str = args.commit_hash
input_files = os.listdir(input_folder)
input_mpk: set[str] = {file for file in input_files if ".mpk" in file}
input_json: list[str] = [file for file in input_files if ".json" in file]
for json_file in input_json:
mpk_file = json_file.replace(".json", ".mpk")
json_path = path(input_folder, json_file)
output_path = path(output_folder, mpk_file)
if mpk_file not in input_mpk:
# First time this config is being run
print(
f"Couldn't find pair for {json_file} - ({mpk_file} not found). Generating new mpk file"
)
generate_new_mpk(json_path, output_path, commit_hash)
else:
print(f"Found pair ({mpk_file} {json_file}). Combining")
mpk_path = path(input_folder, mpk_file)
append_json_to_mpk(mpk_path, json_path, output_path, commit_hash)
input_mpk.remove(mpk_file)
# Keep old mpk files
for mpk_file in input_mpk:
print(f"Couldn't find new reults to add to {mpk_file}. Copying it")
mpk_path = path(input_folder, mpk_file)
output_path = path(output_folder, mpk_file)
shutil.copy2(mpk_path, output_path)
if __name__ == "__main__":
main()