นี่คือสคริปต์ Python สำหรับแปลงเอาต์พุตจากตัวสร้างโปรไฟล์หลายตัวให้เป็นกราฟจุด
มันสามารถ:
หากคุณต้องการโปรแกรมดูแบบโต้ตอบสำหรับกราฟที่สร้างโดย gprof2dot ให้ตรวจสอบ xdot.py
ปัจจุบัน gprof2dot ตอบสนองความต้องการของฉัน และฉันมีเวลาเพียงเล็กน้อยหรือไม่มีเลยในการบำรุงรักษา ดังนั้น ฉันเกรงว่าฟีเจอร์ที่ร้องขอจะไม่สามารถนำไปใช้ได้ และฉันอาจประมวลผลรายงานปัญหาหรือดึงคำขอได้ช้า
นี่เป็นผลลัพธ์จากข้อมูลตัวอย่างในบทความ Linux Gazette ที่มีการตั้งค่าเริ่มต้น:
ในการรัน Debian/Ubuntu:
apt-get install python3 graphviz
ในการรัน RedHat/Fedora
yum install python3 graphviz
พีพีไอ
pip install gprof2dot
สคริปต์แบบสแตนด์อโลน
พื้นที่เก็บข้อมูล Git
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 -d เอาท์พุต.etl
เริ่มวิชวลไลเซอร์:
xperf output.etl
ในเมนู การติดตาม ให้เลือก โหลดสัญลักษณ์ กำหนดค่าเส้นทางสัญลักษณ์ หากจำเป็น
เลือกพื้นที่ที่สนใจบน กราฟการสุ่มตัวอย่าง CPU คลิกขวา และเลือก ตารางสรุป
ในเมนู คอลัมน์ ตรวจสอบให้แน่ใจว่าคอลัมน์ สแต็ก เปิดใช้งานและมองเห็นได้
คลิกขวาที่แถว เลือก Export Full Table และบันทึกลงใน output.csv
จากนั้นเรียกใช้ gprof2dot as
gprof2dot.py -f xperf output.csv | dot -Tpng -o output.png
รวบรวมข้อมูลโปรไฟล์เป็น (สามารถทำได้จาก GUI):
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
ดูโพสต์บล็อกของ Kirill Rogozhin ด้วย
/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 |
+------------------------------+
ที่ไหน:
Edge แสดงถึงการโทรระหว่างสองฟังก์ชันและมีโครงร่างดังต่อไปนี้:
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 globbing/รูปแบบ ในลักษณะเดียวกับที่ทำโดยแฟล็ก -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 และสำหรับระดับการปรับให้เหมาะสมบางระดับ มันเป็นไปไม่ได้ที่จะเดิน call stack โดยไม่มีมัน) หาก คุณใช้ gprof คุณจะต้องใช้ตัวเลือก -pg
เช่นกัน แต่ในปัจจุบัน คุณสามารถได้ผลลัพธ์ที่ดีขึ้นมากด้วยเครื่องมือสร้างโปรไฟล์อื่นๆ ซึ่งส่วนใหญ่ไม่จำเป็นต้องใช้เครื่องมือโค้ดพิเศษเมื่อทำการคอมไพล์
คุณต้องการให้โค้ดที่คุณกำลังสร้างโปรไฟล์ใกล้เคียงที่สุดเท่าที่จะเป็นไปได้กับโค้ดที่คุณจะเผยแพร่ ดังนั้นคุณ ควร รวมตัวเลือกทั้งหมดที่คุณใช้ในรหัสการเผยแพร่ โดยทั่วไป:
-O2
: การเพิ่มประสิทธิภาพที่ไม่เกี่ยวข้องกับการแลกเปลี่ยนความเร็วอวกาศ-DNDEBUG
: ปิดการใช้งานรหัสการดีบักในไลบรารีมาตรฐาน (เช่นมาโครยืนยัน)อย่างไรก็ตาม การเพิ่มประสิทธิภาพหลายๆ รายการที่ทำโดย gcc จะรบกวนความถูกต้อง/ความละเอียดของผลลัพธ์การทำโปรไฟล์ คุณ ควร ผ่านตัวเลือกเหล่านี้เพื่อปิดใช้งานการเพิ่มประสิทธิภาพเฉพาะเหล่านั้น:
-fno-inline-functions
: อย่าอินไลน์ฟังก์ชันในพาเรนต์ของพวกเขา (มิฉะนั้นเวลาที่ใช้ในฟังก์ชันเหล่านี้จะถือเป็นของผู้โทร)-fno-inline-functions-called-once
: คล้ายกับด้านบน-fno-optimize-sibling-calls
: อย่าปรับการเรียกแบบพี่น้องและการเรียกซ้ำแบบหางให้เหมาะสม (มิฉะนั้นการเรียกแบบหางอาจเป็นผลมาจากฟังก์ชันหลัก)หากรายละเอียดยังต่ำเกินไป คุณ อาจ ผ่านตัวเลือกเหล่านี้เพื่อให้ได้รายละเอียดที่ละเอียดยิ่งขึ้น:
-fno-default-inline
: อย่าทำให้ฟังก์ชันสมาชิกอินไลน์เป็นค่าเริ่มต้นเพียงเพราะถูกกำหนดไว้ภายในขอบเขตของคลาส-fno-inline
: อย่าใส่ใจกับคีย์เวิร์ดแบบอินไลน์ โปรดทราบว่าด้วยตัวเลือกสุดท้ายเหล่านี้ การกำหนดเวลาของฟังก์ชันที่เรียกใช้หลายครั้งจะบิดเบี้ยวเนื่องจากค่าใช้จ่ายในการเรียกใช้ฟังก์ชัน นี่เป็นเรื่องจริงโดยเฉพาะอย่างยิ่งสำหรับโค้ด C++ ทั่วไปที่ คาดหวัง ว่าการปรับให้เหมาะสมเหล่านี้จะทำเพื่อประสิทธิภาพที่เหมาะสมดูรายการตัวเลือกการเพิ่มประสิทธิภาพ gcc ทั้งหมดสำหรับข้อมูลเพิ่มเติม
ดูวิกิสำหรับแหล่งข้อมูลภายนอก รวมถึงเครื่องมือเสริม/ทางเลือก