~ [ source navigation ] ~ [ diff markup ] ~ [ identifier search ] ~

TOMOYO Linux Cross Reference
Linux/tools/crypto/tcrypt/tcrypt_speed_compare.py

Version: ~ [ linux-6.12-rc7 ] ~ [ linux-6.11.7 ] ~ [ linux-6.10.14 ] ~ [ linux-6.9.12 ] ~ [ linux-6.8.12 ] ~ [ linux-6.7.12 ] ~ [ linux-6.6.60 ] ~ [ linux-6.5.13 ] ~ [ linux-6.4.16 ] ~ [ linux-6.3.13 ] ~ [ linux-6.2.16 ] ~ [ linux-6.1.116 ] ~ [ linux-6.0.19 ] ~ [ linux-5.19.17 ] ~ [ linux-5.18.19 ] ~ [ linux-5.17.15 ] ~ [ linux-5.16.20 ] ~ [ linux-5.15.171 ] ~ [ linux-5.14.21 ] ~ [ linux-5.13.19 ] ~ [ linux-5.12.19 ] ~ [ linux-5.11.22 ] ~ [ linux-5.10.229 ] ~ [ linux-5.9.16 ] ~ [ linux-5.8.18 ] ~ [ linux-5.7.19 ] ~ [ linux-5.6.19 ] ~ [ linux-5.5.19 ] ~ [ linux-5.4.285 ] ~ [ linux-5.3.18 ] ~ [ linux-5.2.21 ] ~ [ linux-5.1.21 ] ~ [ linux-5.0.21 ] ~ [ linux-4.20.17 ] ~ [ linux-4.19.323 ] ~ [ linux-4.18.20 ] ~ [ linux-4.17.19 ] ~ [ linux-4.16.18 ] ~ [ linux-4.15.18 ] ~ [ linux-4.14.336 ] ~ [ linux-4.13.16 ] ~ [ linux-4.12.14 ] ~ [ linux-4.11.12 ] ~ [ linux-4.10.17 ] ~ [ linux-4.9.337 ] ~ [ linux-4.4.302 ] ~ [ linux-3.10.108 ] ~ [ linux-2.6.32.71 ] ~ [ linux-2.6.0 ] ~ [ linux-2.4.37.11 ] ~ [ unix-v6-master ] ~ [ ccs-tools-1.8.12 ] ~ [ policy-sample ] ~
Architecture: ~ [ i386 ] ~ [ alpha ] ~ [ m68k ] ~ [ mips ] ~ [ ppc ] ~ [ sparc ] ~ [ sparc64 ] ~

  1 #!/usr/bin/env python3
  2 # SPDX-License-Identifier: GPL-2.0
  3 #
  4 # Copyright (C) xFusion Digital Technologies Co., Ltd., 2023
  5 #
  6 # Author: Wang Jinchao <wangjinchao@xfusion.com>
  7 #
  8 """
  9 A tool for comparing tcrypt speed test logs.
 10 
 11 Please note that for such a comparison, stability depends
 12 on whether we allow frequency to float or pin the frequency.
 13 
 14 Both support tests for operations within one second and
 15 cycles of operation.
 16 For example, use it in the bash script below.
 17 
 18 ```bash
 19 #!/bin/bash
 20 
 21 # log file prefix
 22 seq_num=0
 23 
 24 # When sec=0, it will perform cycle tests;
 25 # otherwise, it indicates the duration of a single test
 26 sec=0
 27 num_mb=8
 28 mode=211
 29 
 30 # base speed test
 31 lsmod | grep pcrypt && modprobe -r pcrypt
 32 dmesg -C
 33 modprobe tcrypt alg="pcrypt(rfc4106(gcm(aes)))" type=3
 34 modprobe tcrypt mode=${mode} sec=${sec} num_mb=${num_mb}
 35 dmesg > ${seq_num}_base_dmesg.log
 36 
 37 # new speed test
 38 lsmod | grep pcrypt && modprobe -r pcrypt
 39 dmesg -C
 40 modprobe tcrypt alg="pcrypt(rfc4106(gcm(aes)))" type=3
 41 modprobe tcrypt mode=${mode} sec=${sec} num_mb=${num_mb}
 42 dmesg > ${seq_num}_new_dmesg.log
 43 lsmod | grep pcrypt && modprobe -r pcrypt
 44 
 45 tools/crypto/tcrypt/tcrypt_speed_compare.py \
 46     ${seq_num}_base_dmesg.log \
 47     ${seq_num}_new_dmesg.log  \
 48         >${seq_num}_compare.log
 49 grep 'average' -A2 -B0 --group-separator="" ${seq_num}_compare.log
 50 ```
 51 """
 52 
 53 import sys
 54 import re
 55 
 56 
 57 def 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, op
 64     else:
 65         return "", ""
 66 
 67 
 68 def 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 res
 79 
 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 res
 88 
 89     return None
 90 
 91 
 92 def parse(filepath):
 93     result = {}
 94     alg, op = "", ""
 95     with open(filepath, 'r') as file:
 96         for line in file:
 97             if not line:
 98                 continue
 99             _alg, _op = parse_title(line)
100             if _alg:
101                 alg, op = _alg, _op
102                 if alg not in result:
103                     result[alg] = {}
104                 if op not in result[alg]:
105                     result[alg][op] = []
106                 continue
107             parsed_result = parse_item(line)
108             if parsed_result:
109                 result[alg][op].append(parsed_result)
110     return result
111 
112 
113 def 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 merged
134 
135 
136 def format(merged):
137     for alg in merged.keys():
138         for op in merged[alg].keys():
139             base_sum = 0
140             new_sum = 0
141             differ_sum = 0
142             differ_cnt = 0
143             print()
144             hlen = 80
145             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_cnt
161                 new_sum += new_cnt
162                 differ = round((new_cnt - base_cnt)*100/base_cnt, 2)
163                 differ_sum += differ
164                 differ_cnt += 1
165                 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 
179 def 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 
186 if __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])

~ [ source navigation ] ~ [ diff markup ] ~ [ identifier search ] ~

kernel.org | git.kernel.org | LWN.net | Project Home | SVN repository | Mail admin

Linux® is a registered trademark of Linus Torvalds in the United States and other countries.
TOMOYO® is a registered trademark of NTT DATA CORPORATION.

sflogo.php