Beyond Stack Sampling: C ++ Profilers


146

เรื่องของแฮกเกอร์

วันที่คือ 12/02/10 หลายวันก่อนวันคริสต์มาสกำลังจะหายไปและฉันก็โดนบล็อกถนนสายสำคัญในฐานะโปรแกรมเมอร์หน้าต่าง ฉันใช้ AQTime ฉันพยายามง่วงนอนเป็นประกายและง่วงนอนมากและเมื่อเราพูด VTune กำลังติดตั้ง ฉันได้ลองใช้ตัวสร้างโปรไฟล์ VS2008 และมันก็ถูกลงโทษในทางบวกเช่นกัน ฉันใช้เทคนิคการหยุดชั่วคราวแบบสุ่ม ฉันตรวจสอบต้นไม้ต้นสาย ฉันไล่ออกจากฟังก์ชั่นการติดตาม แต่ข้อเท็จจริงที่เจ็บปวดอันน่าเศร้าของเรื่องนี้ก็คือแอปที่ฉันใช้งานอยู่นั้นมีโค้ดมากกว่าหนึ่งล้านบรรทัดโดยอาจมีแอพของบุคคลที่สามอีกกว่าล้านบรรทัด

ฉันต้องการเครื่องมือที่ดีกว่า ฉันอ่านหัวข้ออื่นแล้ว ฉันลองแต่ละโปรไฟล์ที่ระบุไว้ในแต่ละหัวข้อ จะต้องมีสิ่งที่ดีกว่าตัวเลือกขยะและราคาแพงเหล่านี้หรือจำนวนงานที่น่าหัวเราะจนแทบไม่มีกำไร เพื่อให้เกิดความซับซ้อนยิ่งขึ้นรหัสของเรามีการใช้เธรดอย่างหนักและเรียกใช้ลูป Qt Event จำนวนหนึ่งซึ่งบางส่วนมีความเปราะบางจนเกิดความผิดพลาดภายใต้เครื่องมือหนักเนื่องจากความล่าช้าของเวลา อย่าถามฉันว่าเหตุใดเราจึงเรียกใช้ลูปหลายเหตุการณ์ ไม่มีใครสามารถบอกได้

มีตัวเลือกเพิ่มเติมตามแนวของ Valgrind ในสภาพแวดล้อมของ windows หรือไม่?
มีอะไรดีไปกว่าเครื่องมือที่ชำรุดอันยาวเหยียดที่ฉันได้ลองไปแล้วหรือไม่?
มีอะไรที่ออกแบบมาเพื่อรวมเข้ากับ Qt หรืออาจจะมีการแสดงกิจกรรมที่เป็นประโยชน์ในคิว?

รายการทั้งหมดของเครื่องมือที่ฉันลองด้วยเครื่องมือที่มีประโยชน์จริง ๆ ในตัวเอียง:

  • AQTime:ค่อนข้างดี! มีปัญหากับการเรียกซ้ำแบบลึก แต่กราฟการโทรนั้นถูกต้องในกรณีเหล่านี้และสามารถใช้เพื่อกำจัดความสับสนที่คุณอาจมี ไม่ใช่เครื่องมือที่สมบูรณ์แบบ แต่ควรลองใช้ดู มันอาจเหมาะกับความต้องการของคุณและมันก็ดีพอสำหรับฉันเกือบตลอดเวลา
  • หยุดการโจมตีแบบสุ่มชั่วคราวในโหมดดีบั๊ก:มีข้อมูลไม่เพียงพอ
    เครื่องมือที่ดี แต่ไม่ใช่โซลูชันที่สมบูรณ์
  • Parallel Studios: ตัวเลือกนิวเคลียร์ เสือกแปลกและทรงพลังอย่างบ้าคลั่ง ฉันคิดว่าคุณควรประเมินผล 30 วันและคิดออกว่าเหมาะสมหรือไม่ มันก็เจ๋งเกินไปเช่นกัน
  • AMD Codeanalyst: ยอดเยี่ยมใช้งานง่ายล้มเหลวได้ง่ายมาก แต่ฉันคิดว่านั่นเป็นสิ่งที่อยู่ในสภาพแวดล้อม ฉันขอแนะนำให้ลองเพราะฟรี
  • Luke Stackwalker:ทำงานได้ดีในโครงการขนาดเล็กมันเป็นบิตพยายามทำให้มันทำงานกับเรา บางผลลัพธ์ที่ดีและแน่นอนแทนที่ Sleepy สำหรับงานส่วนตัวของฉัน
  • PurifyPlus:ไม่รองรับสภาพแวดล้อม Win-x64 ซึ่งเป็น Windows 7 ที่เด่นชัดที่สุด เพื่อนร่วมงานของฉันจำนวนหนึ่งในแผนกอื่น ๆ ต่างก็สาบานต่อเรื่องนี้
  • VS2008 Profiler: สร้างเอาต์พุตในช่วง 100 + gigs ในโหมดติดตามการทำงานที่ความละเอียดที่ต้องการ ด้านบวกให้ผลลัพธ์ที่มั่นคง
  • GProf: ต้องการ GCC ให้มีประสิทธิภาพปานกลาง
  • VTune: W7 ของ VTune สนับสนุนพรมแดนทางอาญา ยอดเยี่ยมเป็นอย่างอื่น
  • PIN: ฉันต้องแฮ็คเครื่องมือของตัวเองดังนั้นนี่เป็นวิธีสุดท้าย
  • ง่วงนอน \ VerySleepy: มีประโยชน์สำหรับแอปขนาดเล็ก แต่ทำให้ฉันล้มเหลวที่นี่
  • EasyProfiler: ไม่เลวเลยถ้าคุณไม่สนใจรหัสที่ถูกฉีดด้วยตัวเองเล็กน้อยเพื่อระบุตำแหน่งของเครื่องดนตรี
  • Valgrind: * ระวังเท่านั้น แต่ดีมากเมื่อคุณอยู่ในสภาพแวดล้อมนั้น
  • OProfile: Linux เท่านั้น
  • Proffy: พวกเขายิงม้าป่า

เครื่องมือแนะนำที่ฉันไม่ได้ลอง:

  • Xperf:
  • Glowcode:
  • DevPartner:

หมายเหตุ: สภาพแวดล้อมของ Intel ในขณะนี้ VS2008 เร่งห้องสมุด Qt 4+ และผู้สร้างเสียงอึกทึกของพวกเขาทั้งหมด: การรวม Qt / MFC ผ่าน trolltech


ตอนนี้:เกือบสองสัปดาห์ต่อมาดูเหมือนว่าปัญหาของฉันจะได้รับการแก้ไข ขอบคุณเครื่องมือที่หลากหลายรวมถึงเกือบทุกอย่างในรายการและกลเม็ดส่วนตัวของฉันทำให้เราพบคอขวดหลัก อย่างไรก็ตามฉันจะทำการทดสอบสำรวจและทดลองใช้โปรไฟล์ใหม่รวมถึงเทคโนโลยีใหม่ ๆ ทำไม? เพราะฉันเป็นหนี้พวกคุณเพราะพวกคุณร็อค มันทำให้ไทม์ไลน์ช้าลงเล็กน้อย แต่ฉันก็ยังรู้สึกตื่นเต้นมากที่ได้ลองใช้เครื่องมือใหม่ ๆ

บทสรุป
ท่ามกลางปัญหาอื่น ๆ จำนวนของส่วนประกอบได้ถูกสลับไปยังแบบจำลองเธรดที่ไม่ถูกต้องทำให้เกิดการวางสายที่ร้ายแรงเนื่องจากความจริงที่ว่ารหัสที่อยู่ภายใต้เรานั้นไม่ได้ถูกมัลติเธรดอีกต่อไป ฉันไม่สามารถพูดได้มากกว่านี้เพราะมันเป็นการละเมิด NDA ของฉัน แต่ฉันสามารถบอกคุณได้ว่าสิ่งนี้จะไม่ถูกค้นพบโดยการตรวจสอบทั่วไปหรือแม้แต่จากการตรวจสอบรหัสปกติ หากไม่มีโปรไฟล์ผู้โทรเข้าและการหยุดเล่นแบบสุ่มร่วมกันเราจะยังคงส่งเสียงกรีดร้องของเราที่ความโค้งสีน้ำเงินอันงดงามของท้องฟ้า โชคดีที่ฉันทำงานกับแฮ็กเกอร์ที่ดีที่สุดบางคนที่ฉันเคยพบมาและฉันสามารถเข้าถึงบทกวีที่น่าทึ่งซึ่งเต็มไปด้วยเครื่องมือที่ยอดเยี่ยมและผู้คนที่ยอดเยี่ยม

สุภาพบุรุษ, ฉันซาบซึ้งอย่างมากและเสียใจเพียงว่าฉันไม่มีตัวแทนมากพอที่จะให้รางวัลแก่คุณทุกคนด้วยความกรุณา ฉันยังคงคิดว่านี่เป็นคำถามสำคัญที่จะได้คำตอบที่ดีกว่าคำถามที่เราได้รับมาจนถึงตอนนี้

เป็นผลให้ในแต่ละสัปดาห์สำหรับสามสัปดาห์ถัดไปฉันจะวางรางวัลที่ใหญ่ที่สุดที่ฉันสามารถจ่ายได้และมอบให้กับคำตอบด้วยเครื่องมือที่อร่อยที่สุดที่ฉันคิดว่าไม่ใช่ความรู้ทั่วไป หลังจากสามสัปดาห์เราหวังว่าจะได้รวบรวมโปรไฟล์ที่ชัดเจนของโปรไฟล์หากคุณยกเลิกการติดตามของฉัน

Take-away
ใช้ profiler มันดีพอสำหรับ Ritchie, Kernighan, Bentley และ Knuth ฉันไม่สนใจว่าคุณคิดว่าคุณเป็นใคร ใช้ profiler หากคนที่คุณมีไม่ทำงานให้หาคนอื่น หากคุณไม่พบหนึ่งรหัสหนึ่ง หากคุณไม่สามารถเขียนโค้ดได้หรือวางสายเล็ก ๆ หรือติดค้างอยู่ให้ใช้การหยุดแบบสุ่ม หากทุกอย่างล้มเหลวให้จ้างผู้สำเร็จการศึกษาบางคนเพื่อใช้เครื่องมือสร้างโปรไฟล์


ดูอีกต่อไป
ดังนั้นฉันคิดว่ามันคงจะดีถ้าเขียนย้อนหลังไปซักหน่อย ฉันเลือกที่จะทำงานอย่างกว้างขวางกับ Parallel Studios ซึ่งส่วนหนึ่งเป็นเพราะมันถูกสร้างขึ้นจากเครื่องมือ PIN เมื่อมีการติดต่อทางวิชาการกับนักวิจัยบางคนที่เกี่ยวข้องฉันรู้สึกว่านี่อาจเป็นเครื่องหมายของคุณภาพ โชคดีที่ฉันพูดถูก ในขณะที่ GUI นั้นค่อนข้างน่ากลัวฉันพบว่า IPS มีประโยชน์อย่างเหลือเชื่อ แต่ฉันไม่สามารถแนะนำได้อย่างสบายสำหรับทุกคน อย่างยิ่งไม่มีวิธีที่ชัดเจนในการรับจำนวนการเข้าชมระดับบรรทัดสิ่งที่ AQT และผู้ให้บริการรายอื่นจำนวนมากให้และฉันพบว่ามีประโยชน์มากสำหรับการตรวจสอบอัตราการเลือกสาขาจากสิ่งอื่น ๆ ในเน็ตฉันสนุกกับการใช้ AQTime ด้วยและฉันพบว่าการสนับสนุนของพวกเขานั้นตอบสนองได้ดีจริงๆ อีกครั้งฉันต้องผ่านการรับรอง: ฟีเจอร์มากมายของพวกเขานั้นใช้งานไม่ได้ดีและบางฟีเจอร์บางตัวนั้นใช้งานได้ง่ายบน Win7x64 XPerf ยังทำงานได้อย่างน่าทึ่ง แต่ช้ามากสำหรับรายละเอียดการสุ่มตัวอย่างที่ต้องใช้เพื่อให้สามารถอ่านแอปพลิเคชันบางประเภทได้ดี

ตอนนี้ฉันต้องบอกว่าฉันไม่คิดว่าจะมีตัวเลือกที่ชัดเจนสำหรับการทำโปรไฟล์ C ++ ในสภาพแวดล้อม W7x64 แต่มีตัวเลือกที่แน่นอนที่ไม่สามารถให้บริการที่มีประโยชน์


18
คุณเคยได้งานที่แตกต่างออกไปหรือไม่? :)
Nikolai Fetissov

10
ฉันจะแก้ไขปริศนานี้ยากที่ไหนอีก? ฉันเดาว่าฉันสามารถกลับไปที่การแฮ็กเคอร์เนลได้ แต่นั่นก็ไม่ได้ผลเช่นกัน
Jake Kurzer

3
@Kos ฉันคิดว่า gprof จะเป็นประโยชน์ใด ๆ คุณต้องใช้ gcc toolset ที่คอมไพล์ด้วย -pg ไม่เช่นนั้นจะไม่สร้างไฟล์ gprof.out ในกรณีของ OP ดูเหมือนว่าเขาใช้ msvc ซึ่งเป็นกฎที่ใช้ gprof จากนั้นอีกครั้งฉันไม่คิดว่า gprof จะยุติธรรมดีกว่าสำหรับเขาถ้าคนอื่น ๆ ในรายการล้มเหลวในความต้องการของเขา
greatwolf

2
@Marc Gravell นั่นยุติธรรมพอฉันคิดว่า .... ดูเหมือนว่าจะเป็นการแก้ปัญหาที่แปลกสำหรับฉันที่โพสต์ที่ได้รับการดูแลอย่างดีที่สุดส่งผ่านไปยังโดเมนชุมชนอย่างฉับพลันสร้างสถานการณ์ที่มีการอัพเดทและรักษาคำถามหรือคำตอบของคุณมากขึ้น ยิ่งคุณได้รับการบำรุงรักษาน้อยลงในสายตาของชุมชนโดยรวม ฉันควรใช้เมตาดาต้านี้หรือไม่
Jake Kurzer

2
ไม่มีใครต้องการหวนกลับให้ตอนนี้ฉันรู้เกี่ยวกับโปรไฟล์หรือไม่
Jake Kurzer

คำตอบ:


65

ครั้งแรก:

การสุ่มตัวอย่างการสุ่มตัวอย่างเวลานั้นแข็งแกร่งกว่าการสุ่มตัวอย่างของ CPU ฉันไม่คุ้นเคยกับเครื่องมือในการพัฒนาของ Windows ดังนั้นฉันจึงไม่สามารถบอกได้ว่าอันไหนเป็นแบบไหน Profilers ส่วนใหญ่เป็นการสุ่มตัวอย่าง CPU

Profiler การสุ่มตัวอย่าง CPU คว้าการติดตามสแต็กทุกคำสั่ง N
เทคนิคนี้จะเปิดเผยส่วนของรหัสของคุณที่ถูกผูกไว้กับ CPU ซึ่งน่ากลัวถ้านั่นคือคอขวดในใบสมัครของคุณ ไม่ดีนักหากเธรดแอปพลิเคชันของคุณใช้เวลาส่วนใหญ่ในการต่อสู้กับ mutex

profiler การสุ่มตัวอย่างเวลาคว้าการติดตามสแต็คทุก N microseconds
เทคนิคนี้จะเป็นศูนย์ในรหัส"ช้า" ไม่ว่าจะเป็นสาเหตุที่ถูกผูกไว้กับ CPU, การปิดกั้น IO ที่ถูกผูกไว้, mutex ผูกพันหรือแคช thrashing ส่วนของรหัส กล่าวโดยย่อว่ารหัสส่วนใดบ้างที่ทำให้แอปพลิเคชันของคุณช้าลง

ดังนั้นใช้ profiler การสุ่มตัวอย่างเวลาหากเป็นไปได้โดยเฉพาะอย่างยิ่งเมื่อทำโปรไฟล์รหัสเธรด

ประการที่สอง:

การสุ่มตัวอย่าง profilers สร้าง gobs ของข้อมูล ข้อมูลมีประโยชน์มาก แต่มักจะมีประโยชน์มากเกินไป Visualizer ข้อมูลโปรไฟล์ช่วยได้อย่างมากที่นี่ เครื่องมือที่ดีที่สุดที่ฉันได้พบสำหรับการแสดงข้อมูลรายละเอียดคือgprof2dot อย่าปล่อยให้ชื่อหลอกคุณมันจัดการการสุ่มตัวอย่างเอาท์พุท profiler ทุกชนิด (AQtime, Sleepy, XPerf ฯลฯ ) เมื่อการสร้างภาพข้อมูลชี้ไปที่ฟังก์ชั่นที่กระทำผิดให้ข้ามกลับไปที่ข้อมูลโปรไฟล์ดิบเพื่อรับคำแนะนำที่ดีขึ้นเกี่ยวกับสาเหตุที่แท้จริง

เครื่องมือ gprof2dot สร้างคำอธิบายกราฟแบบจุดที่คุณป้อนลงในเครื่องมือกราฟวิซ เอาท์พุทนั้นเป็น callgraph ที่มีฟังก์ชั่นรหัสสีโดยมีผลกระทบต่อแอพพลิเคชั่น ข้อความแสดงแทน

คำแนะนำเล็กน้อยในการรับ gprof2dot เพื่อสร้างผลลัพธ์ที่ดี

  • ฉันใช้--skew0.001 ในกราฟของฉันเพื่อให้ฉันสามารถดูเส้นทางรหัสร้อน มิฉะนั้นint main()กราฟจะครอบงำ
  • หากคุณกำลังทำอะไรบ้ากับ C ++ --stripแม่คุณอาจจะต้องการที่จะเพิ่ม โดยเฉพาะอย่างยิ่งกับ Boost
  • ฉันใช้ OProfile เพื่อสร้างข้อมูลการสุ่มตัวอย่าง เพื่อให้ได้ผลลัพธ์ที่ดีฉันต้องกำหนดค่าให้โหลดสัญลักษณ์การดีบักจากบุคคลที่สามและไลบรารีระบบของฉัน อย่าลืมทำเช่นเดียวกันมิฉะนั้นคุณจะเห็นว่า CRT ใช้เวลา 20% ของเวลาที่แอปพลิเคชันของคุณเกิดขึ้นจริงคือmallocการทิ้งกองขยะและกินมากถึง 15%

ในขณะที่ฉันไม่ทราบว่านี่เป็นคำตอบที่สมบูรณ์สำหรับปัญหาของฉัน gprof2dot ได้เข้าสู่คลังแสงอันกว้างใหญ่ของฉันและกำลังสมมติว่าเป็นสถานที่โปรดอย่างรวดเร็ว ฉันคิดว่ามันคุ้มค่าเงิน!
Jake Kurzer

2
ผมถามคำถามนี้ลินุกซ์เวลาตัวอย่างตาม Profiler OProfile ควรได้รับการสุ่มตัวอย่างตามเวลาในที่สุด พวกเขาสร้างผลผลิตที่มีคุณภาพสูงมากดังนั้นเมื่อพวกเขาเพิ่มคุณสมบัติที่ฉันจะใช้พวกเขา นอกเหนือจากนั้นฉันมีเพื่อนแฮ็คด้วยโซลูชัน gdb + backtrace สำหรับการทำโปรไฟล์ แฮ็คมาก แต่มันพบว่าคอขวด
deft_code

@deft_code: "แฮ็คโซลูชัน gdb + backtrace ร่วมกันเพื่อทำโปรไฟล์แฮ็คมาก แต่ก็พบปัญหาคอขวด" คุณยืนยันพูดจาโผงผางคงที่ของฉัน :) บางคนต้องการที่จะเป็นโปรไฟล์สวยแต่ถ้าผลเป็นสิ่งที่คุณต้องไปกับสิ่งที่ทำงานไม่ได้สิ่งที่สวย
Mike Dunlavey

ฉันเห็นด้วยกับ Mike Dunlavey สิ่งต่าง ๆ เช่น XPerf / WPA นั้นดูน่ารักและทรงพลังมาก แต่การหาวิธีใช้เครื่องมือเหล่านี้ใช้เวลาสักครู่และในตอนท้ายของการหยุดสุ่มแบบสุ่มนั้นง่ายมากและให้ข้อมูลที่ดีกว่าในการแก้ปัญหา การแก้ปัญหาอัตโนมัติมากขึ้นดูเหมือนจะบ่อยกว่าไม่กรองข้อมูลที่สำคัญที่จำเป็นในการแก้ปัญหาคอขวด
JDiMatteo

16

เกิดอะไรขึ้นเมื่อคุณพยายามหยุดการสุ่มชั่วคราว ฉันใช้มันตลอดเวลาบนแอปมอนสเตอร์ คุณบอกว่ามันให้ข้อมูลไม่เพียงพอและคุณแนะนำว่าคุณต้องการความละเอียดสูง บางครั้งผู้คนต้องการความช่วยเหลือเล็กน้อยในการทำความเข้าใจวิธีใช้

สิ่งที่ฉันทำภายใต้ VS คือการกำหนดค่าการแสดงผลแบบสแต็กดังนั้นจึงไม่แสดงอาร์กิวเมนต์ของฟังก์ชั่นการใช้งาน

แล้วฉันจะใช้เวลาประมาณ 10 ตัวอย่างโดยการกดปุ่ม "หยุด" ในช่วงเวลาที่มันทำให้ฉันรอ ฉันใช้ ^ A, ^ C และ ^ V เพื่อคัดลอกลงในแผ่นจดบันทึกเพื่อใช้อ้างอิง จากนั้นฉันศึกษาแต่ละคนเพื่อพยายามคิดออกว่ามันเป็นอย่างไรในกระบวนการของการพยายามทำให้สำเร็จในเวลานั้น

หากพยายามทำบางอย่างกับตัวอย่าง 2 ชิ้นขึ้นไปและสิ่งนั้นไม่จำเป็นอย่างเคร่งครัดจากนั้นฉันก็พบปัญหาอยู่และฉันรู้ว่าการแก้ไขนั้นจะประหยัดได้มากเพียงใด

มีบางสิ่งที่คุณไม่จำเป็นต้องรู้จริง ๆ เช่นเปอร์เซ็นต์ที่แม่นยำนั้นไม่สำคัญและสิ่งที่เกิดขึ้นในโค้ดของบุคคลที่สามนั้นไม่สำคัญเพราะคุณไม่สามารถทำอะไรกับสิ่งเหล่านั้นได้ สิ่งที่คุณสามารถทำอะไรได้บ้างคือชุดของจุดโทรในรหัสที่คุณสามารถแก้ไขที่แสดงในแต่ละตัวอย่างสแต็ก นั่นคือพื้นล่าสัตว์ที่มีความสุขของคุณ

ตัวอย่างของสิ่งต่าง ๆ ที่ฉันพบ:

  • ในระหว่างการเริ่มต้นอาจมีความลึกประมาณ 30 ชั้นในกระบวนการพยายามแยกสตริงอักขระที่เป็นสากลจากทรัพยากร DLL หากมีการตรวจสอบสตริงจริงมันสามารถเปิดออกได้อย่างง่ายดายว่าสตริงไม่จำเป็นต้องถูกทำให้เป็นสากลเช่นเดียวกับสตริงที่ผู้ใช้ไม่เคยเห็นจริง ๆ

  • ในระหว่างการใช้งานปกติบางรหัสอย่างบริสุทธิ์ใจตั้งค่าคุณสมบัติที่ปรับเปลี่ยนในวัตถุบางอย่าง วัตถุนั้นมาจากซุปเปอร์คลาสที่รวบรวมการเปลี่ยนแปลงและทริกเกอร์การแจ้งเตือนที่กระเพื่อมทั่วทั้งโครงสร้างข้อมูลทั้งหมดจัดการกับ UI สร้างและทำลายสิ่งกีดขวางในลักษณะที่ยากต่อการมองเห็น สิ่งนี้สามารถเกิดขึ้นได้มากมาย - ผลที่ตามมาของการแจ้งเตือนที่ไม่คาดคิด

  • กรอกข้อมูลลงในเวิร์กชีตแบบทีละแถวแบบเซลล์ต่อเซลล์ ปรากฎว่าคุณสร้างแถวทั้งหมดในครั้งเดียวจากอาร์เรย์ของค่ามันเร็วกว่ามาก

ป.ล. ถ้าคุณมัลติเธรดเมื่อคุณหยุดชั่วคราวเธรดทั้งหมดจะหยุดชั่วคราว ลองดูที่ call stack ของแต่ละเธรด มีโอกาสเพียงคนเดียวเท่านั้นที่เป็นผู้ร้ายตัวจริงและอีกคนไม่ทำงาน


2
ความคิดเห็น? ความคิดเห็น? นี่คือสปาร์ตา! ฉัน ... ขออภัยไม่ทราบว่ามาจากไหน ไม่รหัสทำให้ Klingon Opera ดูอ่านง่ายและมีเอกสารเกี่ยวกับเช่นกัน ที่จริงฉันคิดว่ามันเป็นเอกสารน้อยกว่ามาก .... โอ้พระเจ้า
Jake Kurzer

3
บูรณาการ QTMFC? โอ้เยี่ยมมากคุณมีความซับซ้อนและความชั่วและคุณยังไม่ได้รับรหัสเฉพาะแอปพลิเคชันเลย
Ben Voigt

5
QT / MFC? ไม่ควรที่จะสร้างเด็กกลายพันธุ์ที่มีหัว 3 หัวที่โยกไปมาในขณะที่เรียกความคิดทุกครั้งที่พวกเขาได้ยินความคิดที่โง่ที่สุด ข้อผิดพลาด ... ฉันพูดนอกเรื่อง ... หากคุณกำลังใช้คลาส MFC Socket ใด ๆ ให้เขียนรหัสซ็อกเก็ตของคุณใหม่ทันทีแล้วจึงโพรไฟล์ มีสถานที่มากในรหัส CSocket ที่ใช้รุ่นลูปข้อความของ WaitForSingleObject ซึ่งฉันได้พบว่าฆ่าประสิทธิภาพ สำหรับชีวิตของฉันฉันจำชื่อรอไม่ได้ ... : /
JimR

2
โอ้พระเจ้าเชื่อฉันเถอะมันช่างน่ากลัวอย่างที่คุณคิด
Jake Kurzer

3
@ เจค: ความสะดวกสบายไม่มาก แต่นั่นเป็นเกียรติของทัวริงสากล ภาษาใด ๆ ไม่ว่าจะสูงหรือต่ำแค่ไหนก็สามารถเทียบเท่ากับความสามารถที่จะนำไปใช้ในทางที่ผิด
Mike Dunlavey

8

ผมเคยประสบความสำเร็จบางอย่างกับเอเอ็มดี CodeAnalyst


สภาพแวดล้อมของ Intel ในขณะนี้ ฉันจะจำไว้! :)
Jake Kurzer

4
@ เจค: ฉันไม่แน่ใจว่าคุณหมายถึงอะไรที่นั่น AMD CodeAnalyst ไม่ต้องการชิป AMD ควรทำงานกับชิปส่วนใหญ่ x86 หรือ x64 (aka x86-64 / IA-64 / AMD64) รวมถึงชิป Intel
Adam Rosenfield

1
เห็นได้ชัดว่าฉันไม่รู้หนังสือ! นั่นเป็นข่าวที่ยอดเยี่ยม ฉันจะลองใช้ในวันพรุ่งนี้และอัปเดตคำถาม
Jake Kurzer

จนถึงตอนนี้มันไม่เสถียรมากเมื่อทำการสุ่มตัวอย่างตามความละเอียดที่ฉันต้องการ
Jake Kurzer

@ อดัม: ฉันได้ลองใช้นักวิเคราะห์รหัสบนเครื่อง Intel pentium IV และเพิ่งให้การสุ่มตัวอย่างตามเวลาโดยไม่มีข้อมูลเกี่ยวกับการใช้เธรดหรือข้อมูลที่เกี่ยวข้องกับเธรดใด ๆ ... ปริมาณของข้อมูลที่ฉันได้รับจริงๆปานกลาง .. นอกจากนี้ยังทำให้เกิดปัญหาในการรวม qt ของ visual studio .. ฉันไม่พอใจ :(
smerlin

7

คุณมีฟังก์ชัน MFC OnIdle หรือไม่ ในอดีตที่ผ่านมาฉันมีแอพแบบเรียลไทม์ที่ฉันต้องแก้ไขนั่นก็คือการทิ้งแพ็กเก็ตอนุกรมเมื่อตั้งค่าความเร็ว 19.2K ซึ่ง PentiumD น่าจะสามารถติดตามได้ ฟังก์ชัน OnIdle คือสิ่งที่ฆ่าสิ่งต่าง ๆ ฉันไม่แน่ใจว่า QT มีแนวคิดนั้นหรือไม่ แต่ฉันก็ตรวจสอบเรื่องนั้นด้วย


2
เรามี OnIdle จริง ๆ และด้วยการรวม QTMFC ของเรามันจึงไหลผ่าน QT EV .. e ... eve ... วนรอบเหตุการณ์ โอ้ G'd
Jake Kurzer

ปรากฎว่าสิ่งนี้นำไปสู่การแก้ปัญหาของเราโดยตรงดังนั้นแม้ว่าจะไม่ใช่คำตอบที่สมบูรณ์แบบสำหรับคำถามนี้ แต่ฉันคิดว่าคำถามนี้ไม่สามารถตอบได้
Jake Kurzer

4

VS Profiler อีกครั้ง - ถ้ามันสร้างไฟล์ขนาดใหญ่บางทีช่วงเวลาการสุ่มตัวอย่างของคุณบ่อยเกินไป? ลองลดมันลงเพราะคุณอาจมีตัวอย่างอยู่ดี

และให้แน่ใจว่าคุณไม่ได้เก็บตัวอย่างจนกว่าคุณจะออกกำลังกายในพื้นที่ปัญหา ดังนั้นเริ่มต้นด้วยคอลเลกชันที่หยุดชั่วคราวรับโปรแกรมของคุณเพื่อทำ "กิจกรรมช้า" จากนั้นเริ่มคอลเลกชัน คุณต้องมีการรวบรวมไม่เกิน 20 วินาที หยุดการรวบรวมหลังจากนี้

สิ่งนี้จะช่วยลดขนาดไฟล์ตัวอย่างของคุณและบันทึกเฉพาะสิ่งที่จำเป็นสำหรับการวิเคราะห์ของคุณ


ฉันจะให้สิ่งนี้ในวันพรุ่งนี้
Jake Kurzer

4

ฉันใช้PurifyPlusสำหรับ Windows ได้สำเร็จ แม้ว่าจะไม่ถูก แต่ IBM จัดให้มีรุ่นทดลองที่พิการเล็กน้อย สิ่งที่คุณต้องการสำหรับการทำโปรไฟล์ด้วยquantifyคือไฟล์ pdb และการลิงก์ด้วย / FIXED: NO ข้อเสียเปรียบเท่านั้น: ไม่รองรับ Win7 / 64


น่าเสียดายเป้าหมายหลักของเราคือ Win7 ฉันจะเพิ่มข้อมูลนั้นในโพสต์หลัก
Jake Kurzer

1
PurifyPlus รุ่นปัจจุบันรองรับ Win7 / 64
hmuelner

3

Easyprofiler - ฉันไม่ได้เห็นมันพูดถึงที่นี่ แต่ไม่แน่ใจว่าคุณได้ดูมันแล้ว ใช้วิธีการที่แตกต่างกันเล็กน้อยในการรวบรวมข้อมูลเมตริก ข้อเสียเปรียบในการใช้วิธีรวบรวมโปรไฟล์แบบเวลาคือคุณต้องทำการเปลี่ยนแปลงรหัสฐาน ดังนั้นคุณจะต้องมีความคิดบางอย่างที่ช้าและอาจจะมีการแทรกรหัสโปรไฟล์มี

ไปตามความคิดเห็นล่าสุดของคุณแม้ว่ามันเสียงเหมือนคุณอย่างน้อยทำให้บางส่วนความคืบหน้า บางทีเครื่องมือนี้อาจมีตัวชี้วัดที่มีประโยชน์สำหรับคุณ ถ้าไม่มีอะไรอื่นมันก็มีชาร์ตและรูปภาพที่สกปรกจริงๆ: P


3

คำแนะนำเครื่องมือเพิ่มเติมอีกสองข้อ

Luke Stackwalker มีชื่อน่ารัก (แม้ว่ามันจะพยายามอย่างหนักสำหรับรสชาติของฉัน) มันจะไม่เสียค่าใช้จ่ายใด ๆ และคุณได้รับซอร์สโค้ด มันอ้างว่าสนับสนุนโปรแกรมหลายเธรดเช่นกัน ดังนั้นมันจึงคุ้มค่ากับการหมุน

http://lukestackwalker.sourceforge.net/

Glowcode เช่นกันซึ่งฉันได้ชี้ให้ฉันเห็นว่าคุ้มค่ากับการใช้:

http://www.glowcode.com/

น่าเสียดายที่ฉันยังไม่ได้ใช้งานพีซีสักพักดังนั้นฉันจึงไม่ได้ลองทำอย่างใดอย่างหนึ่ง ฉันหวังว่าคำแนะนำจะช่วยได้


3

ชำระเงินXPerf

โปรแกรมนี้เป็นโปรแกรมสร้างโปรไฟล์ฟรีที่ไม่มีการเจาะและขยายได้โดย MS ได้รับการพัฒนาโดย Microsoft เพื่อทำโปรไฟล์ Windows


3

หากคุณสงสัยว่าวงวนรอบเหตุการณ์สามารถเอาชนะQCoreApplication :: แจ้งเตือน ()และทำโปรไฟล์ด้วยตนเองแบบ dosome (หนึ่งหรือสองแผนที่ของผู้ส่ง / กิจกรรมให้นับ / ครั้ง)

ฉันคิดว่าคุณต้องบันทึกความถี่ของประเภทเหตุการณ์ก่อนจากนั้นตรวจสอบเหตุการณ์เหล่านั้นให้ละเอียดยิ่งขึ้น (วัตถุใดที่ส่งสิ่งนั้นมีอะไรบ้าง) สัญญาณข้ามเธรดจะถูกจัดคิวโดยปริยายดังนั้นพวกมันจึงลงเอยในลูปเหตุการณ์

เราได้ทำเพื่อดักจับและรายงานข้อยกเว้นในตัวจัดการเหตุการณ์ของเราดังนั้นจริงๆแล้วทุกเหตุการณ์ผ่านไปที่นั่น

แค่ความคิด


นั่นเป็นความคิดที่น่ารัก! ฉันไม่คุ้นเคยกับสภาพแวดล้อมของ QT ทำงานส่วนใหญ่ของฉันกับ pyGTK ที่นี่เพื่อไปก่อน ขอบคุณ!
Jake Kurzer

คุณมีวิธีแนะนำในการจัดหาและแก้ไขลักษณะของสัญญาณที่กำหนดหรือไม่?
Jake Kurzer

ฉันเพิ่งทำเพื่อส่งสัญญาณกับ QStateMachine :: SignalEvent ซึ่งดูเหมือนจะไม่เหมือนกัน แหล่งที่มาควรเป็นQObject* objectพารามิเตอร์ บางที MetaCall เป็นประเภทของสัญญาณทั้งหมด (ดูเหมือนว่าเป็นไปได้) แต่ฉันไม่แน่ใจ สิ่งนี้เกินกว่าประสบการณ์ของฉันเล็กน้อย แต่การมองเข้าไปในแหล่งข้อมูล Qt อาจรวบรวมความจริงบางอย่าง (หรือถามคำถามมากขึ้นชี้ WRT เข้าคิวสวดสัญญาณที่นี่ใน SO .. :)
Macke

2

แก้ไข: ฉันเห็นตอนนี้คุณพูดถึงเรื่องนี้ในโพสต์แรกของคุณ Dammit ฉันไม่เคยคิดว่าฉันจะเป็นผู้ชายคนนั้น

คุณสามารถใช้Pin to instrument รหัสของคุณด้วยความละเอียดปลีกย่อย ฉันคิดว่าพินจะให้คุณสร้างเครื่องมือเพื่อนับจำนวนครั้งที่คุณเข้าสู่ฟังก์ชั่นหรือจำนวนนาฬิกาที่คุณใช้อยู่ที่นั่นเลียนแบบสิ่งต่างๆเช่น VTune หรือ CodeAnalyst จากนั้นคุณสามารถตัดการทำงานของฟังก์ชั่นลงไปจนกว่าปัญหาเรื่องเวลาของคุณจะหายไป


ที่จริงแล้ว PIN คือสิ่งที่ฉันได้รับ จริงๆแล้วมีบางสิ่งที่เรียกว่า PIN Play ที่จะสมบูรณ์แบบ แต่ไม่ได้มีไว้สำหรับการเปิดตัวนอก Intel ฉันไม่แน่ใจว่าฉันจำได้เพียงพอเกี่ยวกับการใช้ PIN เพื่อหลบสิ่งที่ดีจริงๆ แต่ ...
Jake Kurzer

2

ฉันสามารถบอกคุณได้ว่าฉันใช้อะไรทุกวัน

a) นักวิเคราะห์รหัส AMD

  • มันง่ายและจะให้ภาพรวมอย่างรวดเร็วของสิ่งที่เกิดขึ้น มันจะโอเคสำหรับเวลาส่วนใหญ่
  • ด้วยซีพียูของ AMD มันจะบอกคุณเกี่ยวกับ cpu ไปป์ไลน์ แต่คุณต้องการสิ่งนี้เฉพาะในกรณีที่คุณมีลูปจำนวนมากเช่นในเครื่องยนต์กราฟิกตัวแปลงสัญญาณวิดีโอเป็นต้น

b) VTune

  • มันรวมกันเป็นอย่างดีใน vs2008

  • หลังจากที่คุณรู้จักฮอตสปอตแล้วคุณต้องสุ่มตัวอย่างไม่เพียง แต่เวลาเท่านั้น แต่ยังมีสิ่งอื่น ๆ เช่นแคชคิดถึงและการใช้หน่วยความจำ นี่คือสิ่งที่สำคัญมาก ตั้งค่าเซสชันการสุ่มตัวอย่างและแก้ไขคุณสมบัติ ฉันมักจะเก็บตัวอย่างเวลาหน่วยความจำการอ่าน / เขียนและแคช (สามการทำงานที่แตกต่างกัน)

แต่ยิ่งกว่าเครื่องมือคุณต้องได้รับประสบการณ์กับการทำโปรไฟล์ และนั่นหมายถึงการเข้าใจว่า CPU / Memory / PCI ทำงานอย่างไร ... นี่คือตัวเลือกที่ 3 ของฉัน

c) การทดสอบหน่วย

สิ่งนี้สำคัญมากหากคุณกำลังพัฒนาแอปพลิเคชั่นขนาดใหญ่ที่ต้องการประสิทธิภาพที่ยอดเยี่ยม หากคุณไม่สามารถแยกแอพออกเป็นบางส่วนจะเป็นการยากที่จะติดตามการใช้งาน cpu ฉันไม่ได้ทดสอบเคสและคลาสทั้งหมด แต่ฉันมีการประมวลผลและอินพุตไฟล์ที่มีคุณสมบัติที่สำคัญ

คำแนะนำของฉันคือการใช้การสุ่มตัวอย่างในการทดสอบขนาดเล็กหลาย ๆ แบบและลองสร้างมาตรฐานของกลยุทธ์โปรไฟล์


นักวิเคราะห์รหัส AMD ไม่เสถียรในสภาพแวดล้อมการพัฒนาของฉันและ VTune ไม่สนับสนุนอย่างชัดเจน : S
Jake Kurzer

2

ฉันใช้ xperf / ETW สำหรับทุกความต้องการในการทำโปรไฟล์ของฉัน มันมีช่วงการเรียนรู้ที่สูงชัน แต่ทรงพลังอย่างเหลือเชื่อ หากคุณกำลังทำโปรไฟล์บน Windows คุณจะต้องรู้จัก xperf ฉันใช้ตัวสร้างโปรไฟล์นี้บ่อยครั้งเพื่อค้นหาปัญหาด้านประสิทธิภาพในรหัสของฉันและในรหัสของคนอื่น

ในการกำหนดค่าที่ฉันใช้:

  • xperf คว้าตัวอย่าง CPU จากทุกคอร์ที่ใช้งานโค้ดทุก ms อัตราการสุ่มตัวอย่างสามารถเพิ่มได้ถึง 8 KHz และตัวอย่างรวมถึงโหมดผู้ใช้และรหัสเคอร์เนล สิ่งนี้อนุญาตให้ค้นหาสิ่งที่เธรดกำลังทำอยู่ขณะที่รัน
  • xperf บันทึกการสลับบริบททุกครั้ง (อนุญาตให้มีการสร้างใหม่อย่างสมบูรณ์แบบว่าใช้เวลานานเท่าไรในแต่ละเธรด) รวมทั้งสแต็คการโทรเมื่อมีการสลับเธรดและการโทรสแต็กสำหรับสิ่งที่เธรดอ่านอีกเธรดอื่น ไม่ได้ทำงาน
  • xperf บันทึกไฟล์ I / O ทั้งหมดจากกระบวนการทั้งหมด
  • xperf บันทึกดิสก์ I / O ทั้งหมดจากกระบวนการทั้งหมด
  • xperf บันทึกหน้าต่างที่เปิดใช้งานความถี่ CPU สถานะพลังงาน CPU ความล่าช้า UI ฯลฯ
  • xperf ยังสามารถบันทึกการจัดสรรฮีปทั้งหมดจากกระบวนการเดียวการจัดสรรเสมือนทั้งหมดจากกระบวนการทั้งหมดและอีกมากมาย

นั่นเป็นข้อมูลจำนวนมากทั้งหมดในหนึ่งไทม์ไลน์สำหรับกระบวนการทั้งหมด ไม่มี profiler อื่น ๆ บน Windows ที่สามารถทำได้

ฉันบล็อกอย่างกว้างขวางเกี่ยวกับวิธีการใช้ xperf / ETW โพสต์บล็อกเหล่านี้และวิดีโอการฝึกอบรมที่มีคุณภาพอย่างมืออาชีพสามารถดูได้ที่นี่: http://randomascii.wordpress.com/2014/08/19/etw-training-videos-available-now/

หากคุณต้องการค้นหาสิ่งที่อาจเกิดขึ้นหากคุณไม่ได้ใช้ xperf อ่านโพสต์บล็อกเหล่านี้: http://randomascii.wordpress.com/category/investigative-reporting/ นี่เป็นปัญหาเรื่องประสิทธิภาพที่ฉันพบในรหัสของคนอื่น ที่ควรได้รับการค้นพบโดยนักพัฒนา ซึ่งรวมถึง mshtml.dll ที่ถูกโหลดลงในคอมไพเลอร์ VC ++ การปฏิเสธการให้บริการในการค้นหาไฟล์ของ VC ++, การควบคุมปริมาณความร้อนในจำนวนลูกค้าที่น่าแปลกใจของเครื่องลูกค้า, ช้าทีละขั้นใน Visual Studio การจัดสรร 4 GB ในฮาร์ด ดิสก์ไดร์เวอร์ข้อผิดพลาดประสิทธิภาพของ PowerPoint และอื่น ๆ


1

ฉันเพิ่งเสร็จสิ้นCxxProfเวอร์ชันที่ใช้งานได้ครั้งแรกซึ่งเป็นไลบรารีการทำโปรไฟล์แบบพกพาที่ทำด้วยมือสำหรับ C ++

มันบรรลุเป้าหมายดังต่อไปนี้:

  • บูรณาการได้ง่าย
  • ถอด lib ออกได้อย่างง่ายดายในช่วงเวลารวบรวม
  • ถอด lib ออกระหว่างการรันไทม์ได้อย่างง่ายดาย
  • รองรับแอพพลิเคชั่นแบบมัลติเธรด
  • รองรับระบบแบบกระจาย
  • ให้ผลกระทบน้อยที่สุด

คะแนนเหล่านี้ถูกคัดลอกมาจากวิกิโครงการดูรายละเอียดเพิ่มเติมที่นั่น

คำเตือน: ฉันเป็นผู้พัฒนาหลักของ CxxProf


1

เพียงแค่โยนมันออกไปแม้ว่ามันจะไม่ใช่ profiler แบบเต็มรูปแบบ: หากคุณเป็นลูปเหตุการณ์ที่แขวนอยู่ซึ่งใช้เวลานานในการประมวลผลเหตุการณ์เครื่องมือ ad-hocนั้นเป็นเรื่องง่ายใน Qt วิธีการนั้นสามารถขยายได้อย่างง่ายดายเพื่อติดตามว่าแต่ละเหตุการณ์ใช้เวลาดำเนินการนานเท่าไรและเหตุการณ์เหล่านั้นเป็นเช่นไร มันไม่ใช่ profiler สากล แต่เป็น event-loop-centric

ใน Qt การโทรข้ามช่องสัญญาณสัญญาณทั้งหมดจะถูกส่งผ่านลูปเหตุการณ์เช่นเดียวกับตัวจับเวลาการแจ้งเตือนเครือข่ายและพอร์ตอนุกรมและการโต้ตอบของผู้ใช้ทั้งหมด ดังนั้นการสังเกตลูปของเหตุการณ์จึงเป็นขั้นตอนที่สำคัญสู่การทำความเข้าใจว่าแอปพลิเคชันใช้เวลาไปกับอะไร


0

DevPartner พัฒนาขึ้นครั้งแรกโดย NuMega และตอนนี้จัดจำหน่ายโดย MicroFocus ครั้งหนึ่งเคยเป็นทางเลือกสำหรับการทำโปรไฟล์และการวิเคราะห์โค้ด (เช่นหน่วยความจำและทรัพยากรรั่วไหล) ฉันไม่ได้ลองมาก่อนดังนั้นฉันไม่สามารถรับรองได้ว่ามันจะช่วยคุณได้ แต่ฉันเคยได้ผลลัพธ์ที่ยอดเยี่ยมกับมันเพื่อเป็นทางเลือกฉันจะพิจารณาติดตั้งใหม่ในกระบวนการคุณภาพของรหัสของเรา (พวกเขาให้ทดลองใช้ 14 วัน)


0

แม้ว่าระบบปฏิบัติการของคุณจะเป็น win7 แต่โปรแกรมไม่สามารถทำงานภายใต้ xp ได้หรือไม่ วิธีการเกี่ยวกับรายละเอียดภายใต้ xp และผลที่ได้ควรจะเป็นคำใบ้สำหรับ win7


แน่นอนว่าทำได้ แต่ต้องมีการซื้อสิทธิ์ใช้งานสำหรับผลิตภัณฑ์ที่อาจไม่สนับสนุนการพัฒนาที่คุณต้องการหรืออาจต้องใช้เวลาหลายปีกว่าจะทำได้ 1.5k เป็นเงินจำนวนมากในการเดิมพันรวมถึงต้นทุนในการถ่ายภาพและปรับใช้กล่อง xp
Jake Kurzer

0

มีโปรไฟล์มากมายที่แสดงไว้ที่นี่และฉันลองด้วยตัวเองสองสามตัว - อย่างไรก็ตามฉันก็จบลงด้วยการเขียนของตัวเองตามนี้:

http://code.google.com/p/high-performance-cplusplus-profiler/

แน่นอนว่าคุณต้องการแก้ไขรหัสฐาน แต่มันเหมาะอย่างยิ่งสำหรับการลดปัญหาคอขวดควรทำงานกับ x86 ทั้งหมด (อาจเป็นปัญหากับกล่องแบบมัลติคอร์เช่นใช้ rdtsc อย่างไรก็ตาม - นี่เป็นเวลาที่บ่งบอกเท่านั้น - ดังนั้นฉันพบว่ามันเพียงพอสำหรับความต้องการของฉัน .. )


สำเนาของโครงการที่github.com/michael-mayes/high-performance-cplusplus-profilerพร้อมคำอธิบายที่floodyberry.wordpress.com/2009/10/07/ …
osgx

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.