هذا هو برنامج نصي بلغة Python لتحويل المخرجات من العديد من ملفات التعريف إلى رسم بياني نقطي.
يمكن:
إذا كنت تريد عارضًا تفاعليًا للرسوم البيانية التي تم إنشاؤها بواسطة gprof2dot ، فراجع xdot.py.
يلبي gprof2dot حاليًا احتياجاتي، ولا أملك سوى القليل من الوقت لصيانته أو ليس لدي وقت على الإطلاق. لذلك أخشى أنه من غير المرجح أن يتم تنفيذ أي ميزات مطلوبة، وقد أكون بطيئًا في معالجة تقارير المشكلات أو طلبات السحب.
هذه هي النتيجة من البيانات النموذجية في مقالة Linux Gazette بالإعدادات الافتراضية:
عند تشغيل Debian/Ubuntu:
apt-get install python3 graphviz
على تشغيل RedHat/Fedora
yum install python3 graphviz
بايبي
pip install gprof2dot
برنامج نصي مستقل
مستودع جيت
Usage:
gprof2dot.py [options] [file] ...
Options:
-h, --help show this help message and exit
-o FILE, --output=FILE
output filename [stdout]
-n PERCENTAGE, --node-thres=PERCENTAGE
eliminate nodes below this threshold [default: 0.5]
-e PERCENTAGE, --edge-thres=PERCENTAGE
eliminate edges below this threshold [default: 0.1]
-f FORMAT, --format=FORMAT
profile format: axe, callgrind, collapse, dtrace,
hprof, json, oprofile, perf, prof, pstats, sleepy,
sysprof or xperf [default: prof]
--total=TOTALMETHOD preferred method of calculating total time: callratios
or callstacks (currently affects only perf format)
[default: callratios]
-c THEME, --colormap=THEME
color map: bw, color, gray, pink or print [default:
color]
-s, --strip strip function parameters, template parameters, and
const modifiers from demangled C++ function names
--color-nodes-by-selftime
color nodes by self time, rather than by total time
(sum of self and descendants)
-w, --wrap wrap function names
--show-samples show function samples
--node-label=MEASURE measurements to on show the node (can be specified
multiple times): self-time, self-time-percentage,
total-time or total-time-percentage [default: total-
time-percentage, self-time-percentage]
--list-functions=LIST_FUNCTIONS
list functions available for selection in -z or -l,
requires selector argument ( use '+' to select all).
Recall that the selector argument is used with
Unix/Bash globbing/pattern matching, and that entries
are formatted '::'. When
argument starts with '%', a dump of all available
information is performed for selected entries, after
removal of leading '%'.
-z ROOT, --root=ROOT prune call graph to show only descendants of specified
root function
-l LEAF, --leaf=LEAF prune call graph to show only ancestors of specified
leaf function
--depth=DEPTH prune call graph to show only descendants or ancestors
until specified depth
--skew=THEME_SKEW skew the colorization curve. Values < 1.0 give more
variety to lower percentages. Values > 1.0 give less
variety to lower percentages
-p FILTER_PATHS, --path=FILTER_PATHS
Filter all modules not in a specified path
--compare Compare two graphs with almost identical structure. With this
option two files should be provided.gprof2dot.py
[options] --compare [file1] [file2] ...
--compare-tolerance=TOLERANCE
Tolerance threshold for node difference
(default=0.001%).If the difference is below this value
the nodes are considered identical.
--compare-only-slower
Display comparison only for function which are slower
in second graph.
--compare-only-faster
Display comparison only for function which are faster
in second graph.
--compare-color-by-difference
Color nodes based on the value of the difference.
Nodes with the largest differences represent the hot
spots.
perf record -g -- /path/to/your/executable
perf script | c++filt | gprof2dot.py -f perf | dot -Tpng -o output.png
opcontrol --callgraph=16
opcontrol --start
/path/to/your/executable arg1 arg2
opcontrol --stop
opcontrol --dump
opreport -cgf | gprof2dot.py -f oprofile | dot -Tpng -o output.png
إذا لم تكن على دراية بـ xperf، فاقرأ هذه المقالة الممتازة أولاً. ثم افعل:
ابدأ تشغيل xperf كـ
xperf -on Latency -stackwalk profile
قم بتشغيل التطبيق الخاص بك.
احفظ البيانات. `xperf -doutput.etl
ابدأ المتخيل:
xperf output.etl
في قائمة التتبع ، حدد تحميل الرموز . قم بتكوين مسارات الرموز إذا لزم الأمر.
حدد منطقة الاهتمام على الرسم البياني لعينات وحدة المعالجة المركزية ، وانقر بزر الماوس الأيمن، وحدد جدول الملخص .
في قائمة الأعمدة ، تأكد من تمكين عمود المكدس ومرئيته.
انقر بزر الماوس الأيمن على أحد الصفوف، واختر "تصدير جدول كامل" ، ثم احفظه في ملف Output.csv .
ثم قم باستدعاء gprof2dot كـ
gprof2dot.py -f xperf output.csv | dot -Tpng -o output.png
جمع بيانات الملف الشخصي على النحو التالي (يمكن القيام به أيضًا من خلال واجهة المستخدم الرسومية):
amplxe-cl -collect hotspots -result-dir output -- your-app
تصور بيانات الملف الشخصي على النحو التالي:
amplxe-cl -report gprof-cc -result-dir output -format text -report-output output.txt
gprof2dot.py -f axe output.txt | dot -Tpng -o output.png
راجع أيضًا مشاركة مدونة كيريل روجوزين.
/path/to/your/executable arg1 arg2
gprof path/to/your/executable | gprof2dot.py | dot -Tpng -o output.png
python -m profile -o output.pstats path/to/your/script arg1 arg2
gprof2dot.py -f pstats output.pstats | dot -Tpng -o output.png
python -m cProfile -o output.pstats path/to/your/script arg1 arg2
gprof2dot.py -f pstats output.pstats | dot -Tpng -o output.png
java -agentlib:hprof=cpu=samples ...
gprof2dot.py -f hprof java.hprof.txt | dot -Tpng -o output.png
راجع منشور مدونة Russell Power للحصول على التفاصيل.
dtrace -x ustackframes=100 -n 'profile-97 /pid == 12345/ { @[ustack()] = count(); } tick-60s { exit(0); }' -o out.user_stacks
gprof2dot.py -f dtrace out.user_stacks | dot -Tpng -o output.png
# Notice: sometimes, the dtrace outputs format may be latin-1, and gprof2dot will fail to parse it.
# To solve this problem, you should use iconv to convert to UTF-8 explicitly.
# TODO: add an encoding flag to tell gprof2dot how to decode the profile file.
iconv -f ISO-8859-1 -t UTF-8 out.user_stacks | gprof2dot.py -f dtrace
تأخذ أداة FlameGraph الخاصة بـ Brendan Gregg ملفًا نصيًا يحتوي على سطر واحد لكل عينة كمدخل لها. يمكن إنشاء هذا التنسيق من مدخلات أخرى مختلفة باستخدام البرامج النصية stackcollapse
الموجودة في مستودع FlameGraph. ويمكن أيضًا إنشاؤها بواسطة أدوات مثل py-spy.
مثال على الاستخدام:
الأداء
perf record -g -- /path/to/your/executable
perf script | FlameGraph/stackcollapse-perf.pl > out.collapse
gprof2dot.py -f collapse out.collapse | dot -Tpng -o output.png
باي جاسوس
py-spy record -p -f raw -o out.collapse
gprof2dot.py -f collapse out.collapse | dot -Tpng -o output.png
توضح هذه الصورة مثالاً لاستخدام خياري --compare
و --compare-color-by-difference
.
يشير السهم الذي يشير إلى اليمين إلى العقدة حيث تم تنفيذ الوظيفة بشكل أسرع في ملف التعريف المقدم باعتباره الملف الثاني (ملف التعريف الثاني)، بينما يشير السهم الذي يشير إلى اليسار إلى العقدة حيث كانت الوظيفة أسرع في ملف التعريف المقدم باعتباره الملف الأول (ملف التعريف الأول) .
+-----------------------------+
| function name
| total time % -/+ total_diff
| ( self time % ) -/+ self_diff /
| total calls1 / total calls2 /
+-----------------------------+
أين
total time %
self time %
يأتيان من الملف الشخصي الأولdiff
على أنه القيمة المطلقة time in the first profile - time in the second profile
.ملاحظة: تم اختبار خيار المقارنة لملفات تعريف pstats وax وcallgrind.
تمثل العقدة في الرسم البياني الناتج دالة ولها التخطيط التالي:
+------------------------------+
| function name |
| total time % ( self time % ) |
| total calls |
+------------------------------+
أين:
تمثل الحافة المكالمات بين وظيفتين ولها التخطيط التالي:
total time %
calls
parent --------------------> children
أين:
لاحظ أنه في الدورات العودية، إجمالي الوقت % في العقدة هو نفسه بالنسبة للوظائف بأكملها في الدورة، ولا يوجد إجمالي الوقت % في الحواف داخل الدورة، لأن هذا الرقم لن يكون له أي معنى.
يختلف لون العقد والحواف وفقًا لقيمة الوقت الإجمالي٪ . في الخريطة الملونة الافتراضية التي تشبه درجة الحرارة ، يتم تمييز الوظائف التي يتم قضاء معظم الوقت فيها (النقاط الفعالة) باللون الأحمر المشبع، ويتم تمييز الوظائف التي يتم قضاء وقت قليل فيها باللون الأزرق الداكن. لاحظ أن الوظائف التي لا يتم قضاء وقت يذكر فيها أو لا يتم قضاء أي وقت فيها لا تظهر في الرسم البياني بشكل افتراضي.
تسمح العلامة --list-functions
بإدراج إدخالات الوظيفة الموجودة في إدخال gprof
. يهدف هذا إلى أن يكون أداة للتحضير للاستخدامات باستخدام علامتي --leaf
( -l
) أو --root
( -z
).
prof2dot.py -f pstats /tmp/myLog.profile --list-functions "test_segments:*:*"
test_segments:5:,
test_segments:206:TestSegments,
test_segments:46:
يتم استخدام وسيطة المحدد مع مطابقة النمط/النمط Unix/Bash، بنفس الطريقة التي يتم بها تنفيذ العلامتين -l
و- -z
.
يتم تنسيق الإدخالات '
عندما تبدأ وسيطة المحدد بـ '%'، يتم تنفيذ تفريغ كافة المعلومات المتوفرة للإدخالات المحددة، بعد إزالة بادئة المحدد '%'. إذا كان المحدد هو "+" أو "*"، فستتم طباعة القائمة الكاملة للوظائف.
افتراضيًا، يُنشئ gprof2dot.py
رسمًا بيانيًا جزئيًا للاتصال، باستثناء العقد والحواف ذات التأثير الضئيل أو المعدوم في إجمالي وقت الحساب. إذا كنت تريد الرسم البياني الكامل للمكالمة، فقم بتعيين عتبة صفرية للعقد والحواف عبر خيارات -n
/ --node-thres
و -e
/ --edge-thres
، على النحو التالي:
gprof2dot.py -n0 -e0
يمكن أن تصبح تسميات العقدة واسعة جدًا عند تصنيف كود C++، وذلك بسبب تضمين النطاق ووسائط الوظائف ووسائط القالب في أسماء وظائف C++ المفككة.
إذا لم تكن بحاجة إلى معلومات وسيطات الوظيفة والقالب، فقم بتمرير خيار -s
/ --strip
لإزالتها.
إذا كنت تريد الاحتفاظ بكل هذه المعلومات، أو إذا كانت التسميات لا تزال واسعة جدًا، فيمكنك تمرير -w
/ --wrap
، لتغليف التسميات. لاحظ أنه نظرًا لأن dot
لا تقوم بتغليف التسميات تلقائيًا، فلن تتم محاذاة هوامش التسمية بشكل مثالي.
من المحتمل أن يكون إجمالي وقت التنفيذ قصيرًا جدًا، لذلك لا توجد دقة كافية في ملف التعريف لتحديد مكان قضاء الوقت.
لا يزال بإمكانك فرض عرض الرسم البياني بالكامل عن طريق تعيين حد صفري للعقد والحواف عبر خيارات -n
/ --node-thres
و -e
/ --edge-thres
، على النحو التالي:
gprof2dot.py -n0 -e0
ولكن للحصول على نتائج ذات معنى، ستحتاج إلى إيجاد طريقة لتشغيل البرنامج لفترة زمنية أطول (إجمالي النتائج من عمليات التشغيل المتعددة).
من المحتمل أن يكون لديك وقت تنفيذ قصير جدًا، مما يتسبب في أن تكون أخطاء التقريب كبيرة.
راجع السؤال أعلاه للتعرف على طرق زيادة وقت التنفيذ.
الخيارات الضرورية لتحقيق نتائج مناسبة هي:
-g
: إنتاج معلومات التصحيح-fno-omit-frame-pointer
: استخدم مؤشر الإطار (يتم تعطيل استخدام مؤشر الإطار افتراضيًا في بعض البنيات مثل x86_64 وفي بعض مستويات التحسين؛ ومن المستحيل السير في مكدس الاستدعاءات بدونه) إذا كنت تستخدم gprof فستحتاج أيضًا إلى خيار -pg
، ولكن في الوقت الحاضر يمكنك الحصول على نتائج أفضل بكثير باستخدام أدوات ملفات التعريف الأخرى، والتي لا يتطلب معظمها أي أدوات تعليمات برمجية خاصة عند التجميع.
تريد أن يكون الكود الذي تقوم بتوصيفه أقرب ما يكون إلى الكود الذي ستصدره. لذلك يجب عليك تضمين كافة الخيارات التي تستخدمها في رمز الإصدار الخاص بك، عادةً:
-O2
: التحسينات التي لا تتضمن مقايضة السرعة الفضائية-DNDEBUG
: تعطيل تعليمات التصحيح البرمجية في المكتبة القياسية (مثل تأكيد الماكرو)ومع ذلك، فإن العديد من التحسينات التي تجريها دول مجلس التعاون الخليجي تتداخل مع دقة/دقة نتائج التوصيف. يجب عليك تمرير هذه الخيارات لتعطيل هذه التحسينات المحددة:
-fno-inline-functions
: لا تقم بتضمين الوظائف في والديهم (وإلا فسيتم نسب الوقت المستغرق في هذه الوظائف إلى المتصل)-fno-inline-functions-called-once
: مشابه لما سبق-fno-optimize-sibling-calls
: لا تقم بتحسين المكالمات المتكررة للأخوة والذيل (وإلا قد تُنسب المكالمات الخلفية إلى الوظيفة الأصلية)إذا كانت التفاصيل لا تزال منخفضة جدًا، فيمكنك تمرير هذه الخيارات لتحقيق دقة أفضل:
-fno-default-inline
: لا تجعل وظائف الأعضاء مضمنة افتراضيًا لمجرد أنها محددة داخل نطاق الفئة-fno-inline
: لا تنتبه إلى الكلمة الأساسية المضمنة. لاحظ أنه مع هذه الخيارات الأخيرة، سيتم تشويه توقيت الوظائف التي يتم استدعاؤها عدة مرات بسبب الحمل الزائد لاستدعاء الوظيفة. ينطبق هذا بشكل خاص على كود C++ النموذجي الذي يتوقع إجراء هذه التحسينات للحصول على أداء لائق.راجع القائمة الكاملة لخيارات تحسين دول مجلس التعاون الخليجي لمزيد من المعلومات.
راجع الويكي للاطلاع على الموارد الخارجية، بما في ذلك الأدوات التكميلية/البديلة.