วิธีใช้นาฬิกา () ใน C ++


127

ฉันจะโทรclock()เข้าได้C++อย่างไร?

ตัวอย่างเช่นฉันต้องการทดสอบว่าการค้นหาเชิงเส้นใช้เวลาเท่าใดในการค้นหาองค์ประกอบที่กำหนดในอาร์เรย์


1
โปรดทราบว่าเวลาของนาฬิกาแขวนไม่ใช่วิธีที่ดีในการตั้งเวลาไมโครเบนช์มาร์กเสมอไป เพื่อให้ได้ผลลัพธ์ที่สม่ำเสมอคุณต้องหลีกเลี่ยงการปรับขนาดความถี่ของ CPU (รวมถึง Intel turboหรือ AMD ที่เทียบเท่าซึ่งจะช่วยให้นาฬิกา CPU ของคุณสูงขึ้นเมื่ออนุญาตให้มีการ จำกัด อุณหภูมิ / พลังงาน) การสร้างโปรไฟล์ด้วยตัวนับประสิทธิภาพสามารถให้การวัดในรอบสัญญาณนาฬิกาหลัก (และยังให้รายละเอียดว่าคอขวดเป็นแคชหรือไม่เทียบกับปริมาณงานคำสั่งเทียบกับเวลาแฝงหรือไม่โดยดูที่ตัวนับอื่นที่ไม่ใช่แค่รอบ) บน Linuxperf stat -d ./a.out
Peter Cordes

คำตอบ:


206
#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';
}

5
จากสิ่งที่ฉันเห็นที่นี่cplusplus.com/reference/ctime/clockคุณไม่จำเป็นต้องใช้สัญกรณ์ "std ::" เพียงใช้ "clock ()"
gromit190

4
@Birger: ในทุกโปรเจ็กต์ฉันทำงาน แต่สไตล์โค้ดต้องใช้ std :: ก่อนทุกครั้งที่โทร ::
ธ . Thielemann

2
สิ่งนี้ส่งคืนคำตอบในไม่กี่วินาที?
Arnav Borborah

1
@ArnavBorborah ใช่มันไม่
QuantumHoneybees

1
@ Th Thielemann ทั้งสองclock()และclock_tมาจากส่วนหัวของ C Standard Library time.hดังนั้นจึงไม่จำเป็นต้องใช้stdคำนำหน้าเนมสเปซหลังจากการรวมไลบรารี <ctime>รวมค่าและฟังก์ชันนั้นด้วยstdเนมสเปซ แต่ไม่จำเป็นต้องใช้ ตรวจสอบรายละเอียดการใช้งานได้ที่นี่: en.cppreference.com/w/cpp/header/ctime
kayleeFrye_onDeck

70

โซลูชันทางเลือกซึ่งเป็นแบบพกพาและมีความแม่นยำสูงขึ้นมีตั้งแต่ 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

11
หากคุณกำลังบอกจะใช้ภาษา C ++ 11 using Clock=std::chrono::high_resolution_clock;คุณจะทำได้ก็เช่นกันเขียน ดูประเภทนามแฝง
JHBonarius

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 สำหรับเวลานาฬิกาแขวน
Kristianmitk

30

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;

6
timeInSecondsมักจะมา0.000000หาฉัน ฉันจะแก้ไขได้อย่างไร
noufal

3
@noufal บางทีเวลาที่ใช้ไปจะสั้นมากจนแสดงเป็น 0 คุณสามารถลองใช้ a long doubleเพื่อให้ได้ความแม่นยำมากขึ้น
เจอราร์ด

อาจเป็นไปได้ว่านาฬิกาของคุณมีความละเอียดไม่สูงพอจึงไม่ล่วงเลยเวลาไป
Marco Freudenberger

4

อย่างน้อยใน Windows กลไกการวัดที่แม่นยำจริงเพียงอย่างเดียวคือ QueryPerformanceCounter (QPC) std :: chrono ถูกใช้งานโดยใช้มัน (ตั้งแต่ VS2015 ถ้าคุณใช้สิ่งนั้น) แต่มันไม่แม่นยำในระดับเดียวกับการใช้ QueryPerformanceCounter โดยตรง โดยเฉพาะอย่างยิ่งการอ้างว่ารายงานที่ระดับความละเอียด 1 นาโนวินาทีนั้นไม่ถูกต้องอย่างยิ่ง ดังนั้นหากคุณกำลังวัดสิ่งที่ใช้เวลาสั้นมาก (และกรณีของคุณอาจเป็นเช่นนั้น) คุณควรใช้ QPC หรือเทียบเท่าสำหรับระบบปฏิบัติการของคุณ ฉันคิดขึ้นมาเมื่อวัดเวลาแฝงของแคชและฉันจดบันทึกบางอย่างที่คุณอาจพบว่ามีประโยชน์ที่นี่ https://github.com/jarlostensen/notesandcomments/blob/master/stdchronovsqcp.md


0
#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"

สิ่งนี้ไม่ได้เพิ่มในคำถามที่ตอบแล้ว นอนหลับหลังจาก cl = clock () - ไม่จำเป็นต้องใช้ cl และ cout พิมพ์วินาทีไม่เห็บต่อวินาที cl เก็บเห็บนาฬิกา
Dr Yunke

0

คุณอาจสนใจตัวจับเวลาแบบนี้: 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";
}

คุณอาจต้องการตรวจสอบเงื่อนไขแรก ... 10 msec = 1 วินาที?
Dr Yunke

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

0

คุณสามารถวัดระยะเวลาที่โปรแกรมของคุณทำงานได้ ฟังก์ชั่นต่อไปนี้ช่วยวัดเวลาของ CPU ตั้งแต่เริ่มโปรแกรม:

  • นาฬิกา C ++ (คู่) () / นาฬิกาต่อวินาทีพร้อม ctime
  • python time.clock () ส่งคืนค่าทศนิยมเป็นวินาที
  • Java System.nanoTime () ส่งคืนค่า long เป็นนาโนวินาที

ข้อมูลอ้างอิงของฉัน : กล่องเครื่องมืออัลกอริทึมสัปดาห์ที่ 1 ส่วนหนึ่งของโครงสร้างข้อมูลและอัลกอริทึมเฉพาะทางโดย University of California San Diego & National Research University Higher School of Economics

เพื่อให้คุณสามารถเพิ่มบรรทัดของโค้ดนี้หลังอัลกอริทึมของคุณ

cout << (double)clock() / CLOCKS_PER_SEC ;

ผลลัพธ์ที่คาดหวัง: เอาต์พุตที่แสดงจำนวน clock ticks per second


1
คำถามนี้ถามเฉพาะสำหรับ c ++ ดังนั้นจึงเป็นการดีที่คุณจะอ้างอิงถึงภาษา / สคริปต์การเขียนโปรแกรมอื่น ๆ แต่มันไม่อยู่ในหัวข้อ
dboy
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.