คำนวณขีด CPU

ฉันกำลังสร้างโปรเจ็กต์ที่เปรียบเทียบวิธีการบางอย่างสำหรับซิงเกิลตันในแง่ของความเร็ว

สิ่งที่ฉันพยายามทำคือขอให้ผู้ใช้ป้อนจำนวนครั้งที่พวกเขาต้องการเรียกใช้แต่ละวิธี วนซ้ำ และนับ CPU ติ๊ก

ปัญหาคือ CPU หนาเป็น 0 ทั้งหมด ทำอย่างไรดี?

นี่คือรหัสของฉัน:

int numOfCalls;
cout << "How many calls do you want for each?";
cin >> numOfCalls;
clock_t beg, end;
beg = clock();
for (size_t i = 0; i != numOfCalls; i++)
    Object* p = GofFixed::instance_GofFixed();
end = clock();
cout << (beg-end) / CLOCKS_PER_SEC << endl;
beg = clock();
for (size_t i = 0; i != numOfCalls; i++)
    Boost::instance_Boost();
end = clock();
cout << (beg - end) / CLOCKS_PER_SEC << endl;

person PHG    schedule 28.05.2015    source แหล่งที่มา
comment
1) clock() ให้การวัดเวลาของโปรเซสเซอร์ แต่อาจไม่แสดงถึงขีดของ CPU 2) ประเภท clock_t และ CLOCKS_PER_SECOND อาจเป็นประเภทจำนวนเต็ม ดังนั้นนิพจน์การแบ่งของคุณจึงมีแนวโน้มที่จะถูกตัดทอน 3) การวัดประสิทธิภาพของคุณค่อนข้างง่าย ดังนั้นจึงอาจเป็นหัวข้อ ไปยังเครื่องมือเพิ่มประสิทธิภาพซึ่งจะช่วยลดการวนซ้ำหลายรอบหรือทั้งหมด   -  person Michael Burr    schedule 28.05.2015
comment
ขีดนาฬิกาเริ่มต้นอาจมีขนาดใหญ่ Windows มีการตรึงไว้ที่ 1/64 ขีดต่อวินาที ดังนั้นสิ่งแรกที่คุณต้องรู้ก็คือ ขีดของระบบของคุณมีขนาดใหญ่แค่ไหน หากเป็น Windows เก่า 15.625 ms คุณอาจต้องเรียกใช้โปรแกรมของคุณซ้ำหลายล้านครั้งบนพีซี 2 GHz เพื่อดูแม้แต่ 1 ขีด โปรดดู: stackoverflow.com/questions/12244153/   -  person user4581301    schedule 28.05.2015
comment
ตรวจสอบแอสเซมบลีผลลัพธ์ คอมไพเลอร์ของคุณอาจตัดการวนซ้ำ for ออกทั้งหมด เนื่องจากคุณไม่เคยทำอะไรกับมันหรือผลลัพธ์เลย   -  person Alejandro    schedule 28.05.2015
comment
ที่นี่คือแอสเซมบลีที่สร้างขึ้นสำหรับ gcc 4.9.2 ที่ไม่มีการเพิ่มประสิทธิภาพ และ ที่นี่ คอมไพล์ด้วย -O2 ให้ความสนใจกับ main: . โครงสร้างที่ได้รับการปรับให้เหมาะสมนั้นไปไม่ถึง for loops ด้วยซ้ำ (ฉันเปลี่ยนฟังก์ชั่นขึ้นเล็กน้อยเนื่องจากฉันไม่มีสิทธิ์เข้าถึง GofFixed::) แต่แนวคิดก็เหมือนเดิม   -  person Alejandro    schedule 28.05.2015
comment
สิ่งที่ฉันพยายามทำคือนับว่าพวกเขาใช้เวลานานเท่าใดในการรันแต่ละวิธีไม่ว่าเวลาที่ผู้ใช้ป้อนเข้ามาก็ตาม มีวิธีที่ง่ายที่สุดในการทำเช่นนั้นหรือไม่?   -  person PHG    schedule 28.05.2015


คำตอบ (1)


อนุญาตให้ clock_t เป็นประเภทจำนวนเต็มตามมาตรฐาน ถ้าเป็นเช่นนั้นก็จะต้องเป็นไปตามกฎการหารจำนวนเต็ม ดูเหมือนว่าเกณฑ์มาตรฐานของคุณน่าจะทำงานได้ภายในเวลาไม่ถึงวินาที หากเป็นเช่นนั้น (beg - end) / CLOCKS_PER_SECOND จะสร้างผลลัพธ์ที่น้อยกว่า 1 ซึ่งจะถูกตัดให้เหลือ 0

วิธีที่ดีกว่าคือใช้ std::chrono::high_resolution_clock จากนั้นคุณสามารถแปลงเป็นหน่วยเวลาใดก็ได้ที่ไลบรารีมาตรฐานรองรับ จะดีกว่าถ้าใช้หน่วยเวลาที่น้อยกว่าเพื่อคงการวัดระดับรองวินาทีไว้ การใช้ chrono จะเปลี่ยนรหัสของคุณเป็น:

auto beg = std::chrono::high_resolution_clock::now();
for (size_t i = 0; i != numOfCalls; i++)
    Object* p = GofFixed::instance_GofFixed();
auto end = std::chrono::high_resolution_clock::now();
cout << std::chrono::duration_cast<std::chrono::milliseconds>(beg - end).count() << endl;
                                           //   ^^^^^^^^^^^^ Used milliseconds instead
                                           //                for greater accuracy

ซึ่งน่าจะใช้งานได้หากการวัดประสิทธิภาพไม่ได้รับการปรับให้เหมาะสมหรือใช้เวลาน้อยกว่าหนึ่งมิลลิวินาที

คุณสามารถอ่านเพิ่มเติมได้ใน std::chrono::high_resolution_clock ที่นี่ และ std::chrono::duration_cast ที่นี่

person phantom    schedule 28.05.2015