191 lines · python
1#!/usr/bin/env python32# SPDX-License-Identifier: GPL-2.03#4# Copyright (C) xFusion Digital Technologies Co., Ltd., 20235#6# Author: Wang Jinchao <wangjinchao@xfusion.com>7#8"""9A tool for comparing tcrypt speed test logs.10 11Please note that for such a comparison, stability depends12on whether we allow frequency to float or pin the frequency.13 14Both support tests for operations within one second and15cycles of operation.16For example, use it in the bash script below.17 18```bash19#!/bin/bash20 21# log file prefix22seq_num=023 24# When sec=0, it will perform cycle tests;25# otherwise, it indicates the duration of a single test26sec=027num_mb=828mode=21129 30# base speed test31lsmod | grep pcrypt && modprobe -r pcrypt32dmesg -C33modprobe tcrypt alg="pcrypt(rfc4106(gcm(aes)))" type=334modprobe tcrypt mode=${mode} sec=${sec} num_mb=${num_mb}35dmesg > ${seq_num}_base_dmesg.log36 37# new speed test38lsmod | grep pcrypt && modprobe -r pcrypt39dmesg -C40modprobe tcrypt alg="pcrypt(rfc4106(gcm(aes)))" type=341modprobe tcrypt mode=${mode} sec=${sec} num_mb=${num_mb}42dmesg > ${seq_num}_new_dmesg.log43lsmod | grep pcrypt && modprobe -r pcrypt44 45tools/crypto/tcrypt/tcrypt_speed_compare.py \46 ${seq_num}_base_dmesg.log \47 ${seq_num}_new_dmesg.log \48 >${seq_num}_compare.log49grep 'average' -A2 -B0 --group-separator="" ${seq_num}_compare.log50```51"""52 53import sys54import re55 56 57def parse_title(line):58 pattern = r'tcrypt: testing speed of (.*?) (encryption|decryption)'59 match = re.search(pattern, line)60 if match:61 alg = match.group(1)62 op = match.group(2)63 return alg, op64 else:65 return "", ""66 67 68def parse_item(line):69 pattern_operations = r'\((\d+) bit key, (\d+) byte blocks\): (\d+) operations'70 pattern_cycles = r'\((\d+) bit key, (\d+) byte blocks\): 1 operation in (\d+) cycles'71 match = re.search(pattern_operations, line)72 if match:73 res = {74 "bit_key": int(match.group(1)),75 "byte_blocks": int(match.group(2)),76 "operations": int(match.group(3)),77 }78 return res79 80 match = re.search(pattern_cycles, line)81 if match:82 res = {83 "bit_key": int(match.group(1)),84 "byte_blocks": int(match.group(2)),85 "cycles": int(match.group(3)),86 }87 return res88 89 return None90 91 92def parse(filepath):93 result = {}94 alg, op = "", ""95 with open(filepath, 'r') as file:96 for line in file:97 if not line:98 continue99 _alg, _op = parse_title(line)100 if _alg:101 alg, op = _alg, _op102 if alg not in result:103 result[alg] = {}104 if op not in result[alg]:105 result[alg][op] = []106 continue107 parsed_result = parse_item(line)108 if parsed_result:109 result[alg][op].append(parsed_result)110 return result111 112 113def merge(base, new):114 merged = {}115 for alg in base.keys():116 merged[alg] = {}117 for op in base[alg].keys():118 if op not in merged[alg]:119 merged[alg][op] = []120 for index in range(len(base[alg][op])):121 merged_item = {122 "bit_key": base[alg][op][index]["bit_key"],123 "byte_blocks": base[alg][op][index]["byte_blocks"],124 }125 if "operations" in base[alg][op][index].keys():126 merged_item["base_ops"] = base[alg][op][index]["operations"]127 merged_item["new_ops"] = new[alg][op][index]["operations"]128 else:129 merged_item["base_cycles"] = base[alg][op][index]["cycles"]130 merged_item["new_cycles"] = new[alg][op][index]["cycles"]131 132 merged[alg][op].append(merged_item)133 return merged134 135 136def format(merged):137 for alg in merged.keys():138 for op in merged[alg].keys():139 base_sum = 0140 new_sum = 0141 differ_sum = 0142 differ_cnt = 0143 print()144 hlen = 80145 print("="*hlen)146 print(f"{alg}")147 print(f"{' '*(len(alg)//3) + op}")148 print("-"*hlen)149 key = ""150 if "base_ops" in merged[alg][op][0]:151 key = "ops"152 print(f"bit key | byte blocks | base ops | new ops | differ(%)")153 else:154 key = "cycles"155 print(f"bit key | byte blocks | base cycles | new cycles | differ(%)")156 for index in range(len(merged[alg][op])):157 item = merged[alg][op][index]158 base_cnt = item[f"base_{key}"]159 new_cnt = item[f"new_{key}"]160 base_sum += base_cnt161 new_sum += new_cnt162 differ = round((new_cnt - base_cnt)*100/base_cnt, 2)163 differ_sum += differ164 differ_cnt += 1165 bit_key = item["bit_key"]166 byte_blocks = item["byte_blocks"]167 print(168 f"{bit_key:<7} | {byte_blocks:<11} | {base_cnt:<11} | {new_cnt:<11} | {differ:<8}")169 average_speed_up = "{:.2f}".format(differ_sum/differ_cnt)170 ops_total_speed_up = "{:.2f}".format(171 (base_sum - new_sum) * 100 / base_sum)172 print('-'*hlen)173 print(f"average differ(%s) | total_differ(%)")174 print('-'*hlen)175 print(f"{average_speed_up:<21} | {ops_total_speed_up:<10}")176 print('='*hlen)177 178 179def main(base_log, new_log):180 base = parse(base_log)181 new = parse(new_log)182 merged = merge(base, new)183 format(merged)184 185 186if __name__ == "__main__":187 if len(sys.argv) != 3:188 print(f"usage: {sys.argv[0]} base_log new_log")189 exit(-1)190 main(sys.argv[1], sys.argv[2])191