ฉันจะโทรclock()
เข้าได้C++
อย่างไร?
ตัวอย่างเช่นฉันต้องการทดสอบว่าการค้นหาเชิงเส้นใช้เวลาเท่าใดในการค้นหาองค์ประกอบที่กำหนดในอาร์เรย์
ฉันจะโทรclock()
เข้าได้C++
อย่างไร?
ตัวอย่างเช่นฉันต้องการทดสอบว่าการค้นหาเชิงเส้นใช้เวลาเท่าใดในการค้นหาองค์ประกอบที่กำหนดในอาร์เรย์
คำตอบ:
#include <iostream>
#include <cstdio>
#include <ctime>
int main() {
std::clock_t start;
double duration;
start = std::clock();
/* Your algorithm here */
duration = ( std::clock() - start ) / (double) CLOCKS_PER_SEC;
std::cout<<"printf: "<< duration <<'\n';
}
clock()
และclock_t
มาจากส่วนหัวของ C Standard Library time.h
ดังนั้นจึงไม่จำเป็นต้องใช้std
คำนำหน้าเนมสเปซหลังจากการรวมไลบรารี <ctime>
รวมค่าและฟังก์ชันนั้นด้วยstd
เนมสเปซ แต่ไม่จำเป็นต้องใช้ ตรวจสอบรายละเอียดการใช้งานได้ที่นี่: en.cppreference.com/w/cpp/header/ctime
โซลูชันทางเลือกซึ่งเป็นแบบพกพาและมีความแม่นยำสูงขึ้นมีตั้งแต่ C ++ 11 std::chrono
คือการใช้งาน
นี่คือตัวอย่าง:
#include <iostream>
#include <chrono>
typedef std::chrono::high_resolution_clock Clock;
int main()
{
auto t1 = Clock::now();
auto t2 = Clock::now();
std::cout << "Delta t2-t1: "
<< std::chrono::duration_cast<std::chrono::nanoseconds>(t2 - t1).count()
<< " nanoseconds" << std::endl;
}
การรันบน ideone.com ทำให้ฉัน:
Delta t2-t1: 282 nanoseconds
using Clock=std::chrono::high_resolution_clock;
คุณจะทำได้ก็เช่นกันเขียน ดูประเภทนามแฝง
std::chrono::high_resolution_clock
ไม่ใช่เสียงเดียวในการใช้งาน std lib ทั้งหมด จาก cppreference - โดยทั่วไปควรใช้ std :: chrono :: steady_clock หรือ std :: chrono :: system_clock โดยตรงแทน std :: chrono :: high_resolution_clock: ใช้ steady_clock สำหรับการวัดระยะเวลาและ system_clock สำหรับเวลานาฬิกาแขวน
clock()
ส่งคืนจำนวนเห็บนาฬิกาตั้งแต่เริ่มโปรแกรมของคุณ มีค่าคงที่ที่เกี่ยวข้องCLOCKS_PER_SEC
ซึ่งจะบอกจำนวนนาฬิกาที่เกิดขึ้นในหนึ่งวินาที ดังนั้นคุณสามารถทดสอบการดำเนินการใด ๆ เช่นนี้:
clock_t startTime = clock();
doSomeOperation();
clock_t endTime = clock();
clock_t clockTicksTaken = endTime - startTime;
double timeInSeconds = clockTicksTaken / (double) CLOCKS_PER_SEC;
timeInSeconds
มักจะมา0.000000
หาฉัน ฉันจะแก้ไขได้อย่างไร
long double
เพื่อให้ได้ความแม่นยำมากขึ้น
อย่างน้อยใน Windows กลไกการวัดที่แม่นยำจริงเพียงอย่างเดียวคือ QueryPerformanceCounter (QPC) std :: chrono ถูกใช้งานโดยใช้มัน (ตั้งแต่ VS2015 ถ้าคุณใช้สิ่งนั้น) แต่มันไม่แม่นยำในระดับเดียวกับการใช้ QueryPerformanceCounter โดยตรง โดยเฉพาะอย่างยิ่งการอ้างว่ารายงานที่ระดับความละเอียด 1 นาโนวินาทีนั้นไม่ถูกต้องอย่างยิ่ง ดังนั้นหากคุณกำลังวัดสิ่งที่ใช้เวลาสั้นมาก (และกรณีของคุณอาจเป็นเช่นนั้น) คุณควรใช้ QPC หรือเทียบเท่าสำหรับระบบปฏิบัติการของคุณ ฉันคิดขึ้นมาเมื่อวัดเวลาแฝงของแคชและฉันจดบันทึกบางอย่างที่คุณอาจพบว่ามีประโยชน์ที่นี่ https://github.com/jarlostensen/notesandcomments/blob/master/stdchronovsqcp.md
#include <iostream>
#include <ctime>
#include <cstdlib> //_sleep() --- just a function that waits a certain amount of milliseconds
using namespace std;
int main()
{
clock_t cl; //initializing a clock type
cl = clock(); //starting time of clock
_sleep(5167); //insert code here
cl = clock() - cl; //end point of clock
_sleep(1000); //testing to see if it actually stops at the end point
cout << cl/(double)CLOCKS_PER_SEC << endl; //prints the determined ticks per second (seconds passed)
return 0;
}
//outputs "5.17"
คุณอาจสนใจตัวจับเวลาแบบนี้: H: M: S มิลลิวินาที
รหัสใน Linux OS:
#include <iostream>
#include <unistd.h>
using namespace std;
void newline();
int main() {
int msec = 0;
int sec = 0;
int min = 0;
int hr = 0;
//cout << "Press any key to start:";
//char start = _gtech();
for (;;)
{
newline();
if(msec == 1000)
{
++sec;
msec = 0;
}
if(sec == 60)
{
++min;
sec = 0;
}
if(min == 60)
{
++hr;
min = 0;
}
cout << hr << " : " << min << " : " << sec << " . " << msec << endl;
++msec;
usleep(100000);
}
return 0;
}
void newline()
{
cout << "\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n";
}
usleep
จะไม่ส่งคืนหลังจากครบตามจำนวนที่คุณขอ บางทีก็นานกว่านั้น คุณควรตรวจสอบเวลาปัจจุบันเมื่อเริ่มต้นจากนั้นตรวจสอบเวลาปัจจุบันและลบเพื่อให้ได้เวลาที่แน่นอนนับตั้งแต่คุณเริ่มต้นทุกครั้งในการวนซ้ำ
คุณสามารถวัดระยะเวลาที่โปรแกรมของคุณทำงานได้ ฟังก์ชั่นต่อไปนี้ช่วยวัดเวลาของ CPU ตั้งแต่เริ่มโปรแกรม:
ข้อมูลอ้างอิงของฉัน : กล่องเครื่องมืออัลกอริทึมสัปดาห์ที่ 1 ส่วนหนึ่งของโครงสร้างข้อมูลและอัลกอริทึมเฉพาะทางโดย University of California San Diego & National Research University Higher School of Economics
เพื่อให้คุณสามารถเพิ่มบรรทัดของโค้ดนี้หลังอัลกอริทึมของคุณ
cout << (double)clock() / CLOCKS_PER_SEC ;
ผลลัพธ์ที่คาดหวัง: เอาต์พุตที่แสดงจำนวน clock ticks per second
perf stat -d ./a.out