Path: blob/master/tools/crypto/tcrypt/tcrypt_speed_compare.py
26285 views
#!/usr/bin/env python31# SPDX-License-Identifier: GPL-2.02#3# Copyright (C) xFusion Digital Technologies Co., Ltd., 20234#5# Author: Wang Jinchao <[email protected]>6#7"""8A tool for comparing tcrypt speed test logs.910Please note that for such a comparison, stability depends11on whether we allow frequency to float or pin the frequency.1213Both support tests for operations within one second and14cycles of operation.15For example, use it in the bash script below.1617```bash18#!/bin/bash1920# log file prefix21seq_num=02223# When sec=0, it will perform cycle tests;24# otherwise, it indicates the duration of a single test25sec=026num_mb=827mode=2112829# base speed test30lsmod | grep pcrypt && modprobe -r pcrypt31dmesg -C32modprobe tcrypt alg="pcrypt(rfc4106(gcm(aes)))" type=333modprobe tcrypt mode=${mode} sec=${sec} num_mb=${num_mb}34dmesg > ${seq_num}_base_dmesg.log3536# new speed test37lsmod | grep pcrypt && modprobe -r pcrypt38dmesg -C39modprobe tcrypt alg="pcrypt(rfc4106(gcm(aes)))" type=340modprobe tcrypt mode=${mode} sec=${sec} num_mb=${num_mb}41dmesg > ${seq_num}_new_dmesg.log42lsmod | grep pcrypt && modprobe -r pcrypt4344tools/crypto/tcrypt/tcrypt_speed_compare.py \45${seq_num}_base_dmesg.log \46${seq_num}_new_dmesg.log \47>${seq_num}_compare.log48grep 'average' -A2 -B0 --group-separator="" ${seq_num}_compare.log49```50"""5152import sys53import re545556def parse_title(line):57pattern = r'tcrypt: testing speed of (.*?) (encryption|decryption)'58match = re.search(pattern, line)59if match:60alg = match.group(1)61op = match.group(2)62return alg, op63else:64return "", ""656667def parse_item(line):68pattern_operations = r'\((\d+) bit key, (\d+) byte blocks\): (\d+) operations'69pattern_cycles = r'\((\d+) bit key, (\d+) byte blocks\): 1 operation in (\d+) cycles'70match = re.search(pattern_operations, line)71if match:72res = {73"bit_key": int(match.group(1)),74"byte_blocks": int(match.group(2)),75"operations": int(match.group(3)),76}77return res7879match = re.search(pattern_cycles, line)80if match:81res = {82"bit_key": int(match.group(1)),83"byte_blocks": int(match.group(2)),84"cycles": int(match.group(3)),85}86return res8788return None899091def parse(filepath):92result = {}93alg, op = "", ""94with open(filepath, 'r') as file:95for line in file:96if not line:97continue98_alg, _op = parse_title(line)99if _alg:100alg, op = _alg, _op101if alg not in result:102result[alg] = {}103if op not in result[alg]:104result[alg][op] = []105continue106parsed_result = parse_item(line)107if parsed_result:108result[alg][op].append(parsed_result)109return result110111112def merge(base, new):113merged = {}114for alg in base.keys():115merged[alg] = {}116for op in base[alg].keys():117if op not in merged[alg]:118merged[alg][op] = []119for index in range(len(base[alg][op])):120merged_item = {121"bit_key": base[alg][op][index]["bit_key"],122"byte_blocks": base[alg][op][index]["byte_blocks"],123}124if "operations" in base[alg][op][index].keys():125merged_item["base_ops"] = base[alg][op][index]["operations"]126merged_item["new_ops"] = new[alg][op][index]["operations"]127else:128merged_item["base_cycles"] = base[alg][op][index]["cycles"]129merged_item["new_cycles"] = new[alg][op][index]["cycles"]130131merged[alg][op].append(merged_item)132return merged133134135def format(merged):136for alg in merged.keys():137for op in merged[alg].keys():138base_sum = 0139new_sum = 0140differ_sum = 0141differ_cnt = 0142print()143hlen = 80144print("="*hlen)145print(f"{alg}")146print(f"{' '*(len(alg)//3) + op}")147print("-"*hlen)148key = ""149if "base_ops" in merged[alg][op][0]:150key = "ops"151print(f"bit key | byte blocks | base ops | new ops | differ(%)")152else:153key = "cycles"154print(f"bit key | byte blocks | base cycles | new cycles | differ(%)")155for index in range(len(merged[alg][op])):156item = merged[alg][op][index]157base_cnt = item[f"base_{key}"]158new_cnt = item[f"new_{key}"]159base_sum += base_cnt160new_sum += new_cnt161differ = round((new_cnt - base_cnt)*100/base_cnt, 2)162differ_sum += differ163differ_cnt += 1164bit_key = item["bit_key"]165byte_blocks = item["byte_blocks"]166print(167f"{bit_key:<7} | {byte_blocks:<11} | {base_cnt:<11} | {new_cnt:<11} | {differ:<8}")168average_speed_up = "{:.2f}".format(differ_sum/differ_cnt)169ops_total_speed_up = "{:.2f}".format(170(base_sum - new_sum) * 100 / base_sum)171print('-'*hlen)172print(f"average differ(%s) | total_differ(%)")173print('-'*hlen)174print(f"{average_speed_up:<21} | {ops_total_speed_up:<10}")175print('='*hlen)176177178def main(base_log, new_log):179base = parse(base_log)180new = parse(new_log)181merged = merge(base, new)182format(merged)183184185if __name__ == "__main__":186if len(sys.argv) != 3:187print(f"usage: {sys.argv[0]} base_log new_log")188exit(-1)189main(sys.argv[1], sys.argv[2])190191192