brintos

brintos / linux-shallow public Read only

0
0
Text · 5.7 KiB · f3f5783 Raw
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