From: Ahmed Karaman <ahmedkhaledkaraman@gmail.com>
To: qemu-devel@nongnu.org, rth@twiddle.net,
aleksandar.qemu.devel@gmail.com, alex.bennee@linaro.org,
eblake@redhat.com, ldoktor@redhat.com, ehabkost@redhat.com,
crosa@redhat.com
Cc: Ahmed Karaman <ahmedkhaledkaraman@gmail.com>
Subject: [PATCH 2/3] scripts/performance: Add callgrind_top_25.py script
Date: Wed, 17 Jun 2020 01:12:03 +0200 [thread overview]
Message-ID: <20200616231204.8850-3-ahmedkhaledkaraman@gmail.com> (raw)
In-Reply-To: <20200616231204.8850-1-ahmedkhaledkaraman@gmail.com>
Python script that prints the top 25 most executed functions in QEMU
using callgrind.
Signed-off-by: Ahmed Karaman <ahmedkhaledkaraman@gmail.com>
---
scripts/performance/callgrind_top_25.py | 95 +++++++++++++++++++++++++
1 file changed, 95 insertions(+)
create mode 100644 scripts/performance/callgrind_top_25.py
diff --git a/scripts/performance/callgrind_top_25.py b/scripts/performance/callgrind_top_25.py
new file mode 100644
index 0000000000..03b089a96d
--- /dev/null
+++ b/scripts/performance/callgrind_top_25.py
@@ -0,0 +1,95 @@
+#!/usr/bin/env python3
+
+# Print the top 25 most executed functions in QEMU using callgrind.
+# Example Usage:
+# callgrind_top_25.py <qemu-build>/x86_64-linux-user/qemu-x86_64 executable
+#
+# This file is a part of the project "TCG Continuous Benchmarking".
+#
+# Copyright (C) 2020 Ahmed Karaman <ahmedkhaledkaraman@gmail.com>
+# Copyright (C) 2020 Aleksandar Markovic <aleksandar.qemu.devel@gmail.com>
+#
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation, either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program. If not, see <https://www.gnu.org/licenses/>.
+
+import os
+import sys
+
+# Ensure sufficient arguments
+if len(sys.argv) < 3:
+ print('Insufficient Script Arguments!')
+ sys.exit(1)
+
+# Get the qemu path and the executable + its arguments
+(qemu, executable) = (sys.argv[1], ' '.join(sys.argv[2:]))
+
+# Run callgrind and callgrind_annotate
+os.system('valgrind --tool=callgrind --callgrind-out-file=callgrind.data {} {} \
+ 2 > / dev / null & & callgrind_annotate callgrind.data \
+ > tmp.callgrind.data'.
+ format(qemu, executable))
+
+# Line number with the total number of instructions
+number_of_instructions_line = 20
+
+# Line number with the top function
+first_func_line = 25
+
+# callgrind_annotate output
+callgrind_data = []
+
+# Open callgrind_annotate output and store it in callgrind_data
+with open('tmp.callgrind.data', 'r') as data:
+ callgrind_data = data.readlines()
+
+# Get the total number of instructions
+total_number_of_instructions = int(
+ callgrind_data[number_of_instructions_line].split(' ')[0].replace(',', ''))
+
+# Number of functions recorded by callgrind
+number_of_functions = len(callgrind_data) - first_func_line
+
+# Limit the number of top functions to 25
+number_of_top_functions = (25 if number_of_functions >
+ 25 else number_of_instructions_line)
+
+# Store the data of the top functions in top_functions[]
+top_functions = callgrind_data[first_func_line:
+ first_func_line + number_of_top_functions]
+# Print information headers
+print('{:>4} {:>10} {:<25} {}\n{} {} {} {}'.format('No.',
+ 'Percentage',
+ 'Name',
+ 'Source File',
+ '-' * 4,
+ '-' * 10,
+ '-' * 25,
+ '-' * 30,
+ ))
+
+# Print top 25 functions
+for (index, function) in enumerate(top_functions, start=1):
+ function_data = function.split()
+ # Calculate function percentage
+ percentage = (float(function_data[0].replace(
+ ',', '')) / total_number_of_instructions) * 100
+ # Get function source path and name
+ path, name = function_data[1].split(':')
+ # Print extracted data
+ print('{:>4} {:>9.3f}% {:<25} {}'.format(index,
+ round(percentage, 3),
+ name,
+ path))
+
+# Remove intermediate files
+os.system('rm callgrind.data tmp.callgrind.data')
--
2.17.1
next prev parent reply other threads:[~2020-06-16 23:14 UTC|newest]
Thread overview: 22+ messages / expand[flat|nested] mbox.gz Atom feed top
2020-06-16 23:12 [PATCH 0/3] Add Scripts for Finding Top 25 Executed Functions Ahmed Karaman
2020-06-16 23:12 ` [PATCH 1/3] MAINTAINERS: Add 'Miscellaneous' section Ahmed Karaman
2020-06-17 5:35 ` Aleksandar Markovic
2020-06-17 5:51 ` Aleksandar Markovic
2020-06-17 12:01 ` Alex Bennée
2020-06-16 23:12 ` Ahmed Karaman [this message]
2020-06-17 5:42 ` [PATCH 2/3] scripts/performance: Add callgrind_top_25.py script Aleksandar Markovic
2020-06-17 12:16 ` Alex Bennée
2020-06-17 16:08 ` Ahmed Karaman
2020-06-16 23:12 ` [PATCH 3/3] scripts/performance: Add perf_top_25.py script Ahmed Karaman
2020-06-17 5:56 ` Aleksandar Markovic
2020-06-17 12:21 ` Alex Bennée
2020-06-17 16:15 ` Ahmed Karaman
2020-06-17 17:35 ` Alex Bennée
2020-06-17 18:21 ` Ahmed Karaman
2020-06-18 15:07 ` Aleksandar Markovic
2020-06-16 23:35 ` [PATCH 0/3] Add Scripts for Finding Top 25 Executed Functions no-reply
2020-06-17 13:53 ` Eric Blake
2020-06-17 15:34 ` Alex Bennée
2020-06-17 16:16 ` Aleksandar Markovic
2020-06-17 17:42 ` Alex Bennée
2020-06-17 16:16 ` Ahmed Karaman
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20200616231204.8850-3-ahmedkhaledkaraman@gmail.com \
--to=ahmedkhaledkaraman@gmail.com \
--cc=aleksandar.qemu.devel@gmail.com \
--cc=alex.bennee@linaro.org \
--cc=crosa@redhat.com \
--cc=eblake@redhat.com \
--cc=ehabkost@redhat.com \
--cc=ldoktor@redhat.com \
--cc=qemu-devel@nongnu.org \
--cc=rth@twiddle.net \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).