সি ++ এ কীভাবে ঘড়ি ব্যবহার করবেন


127

আমি কিভাবে কল clock()মধ্যে C++?

উদাহরণস্বরূপ, আমি পরীক্ষা করতে চাই যে একটি অ্যারেতে প্রদত্ত উপাদানটি খুঁজতে একটি রৈখিক অনুসন্ধান কত সময় নেয়।


1
নোট করুন যে প্রাচীর-ঘড়ির সময় সর্বদা মাইক্রোব্যাঙ্কমার্কের পক্ষে ভাল উপায় নয়। ধারাবাহিক ফলাফল পেতে, আপনাকে সিপিইউ ফ্রিকোয়েন্সি-স্কেলিং (ইন্টেল টার্বো বা এএমডি সমতুল্য সহ , যেখানে তাপ / বিদ্যুৎ সীমা অনুমোদিত হলে আপনার সিপিইউ ঘড়িটি আরও বাড়িয়ে দেয়) সহ কাজ করতে হবে। পারফরম্যান্স কাউন্টারগুলির সাথে প্রোফাইলিং আপনাকে মূল ঘড়ির চক্রগুলিতে পরিমাপ দিতে পারে (এবং কেবল কোনও চক্র ব্যতীত কাউন্টারগুলিকে দেখে বাধা কোনও ক্যাশে বনাম নির্দেশনা থ্রুপুট বনাম বিলম্বিতা মিস করে কিনা সে সম্পর্কেও বিশদ) details লিনাক্সে,perf stat -d ./a.out
পিটার কর্ডস

উত্তর:


207
#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/references/ctime/ ਵਜੇ , আপনার "std ::" স্বরলিপি ব্যবহার করার দরকার নেই। কেবল "ঘড়ি" () ব্যবহার করুন
gromit190

4
@ বার্গার: সমস্ত প্রকল্পে আমি এখনও কাজ করেছি কোড স্টাইলের জন্য প্রতিটি স্টাড :: কল করার আগে স্টাড :: প্রয়োজন d
থ। থিলিমান

2
এটি কি সেকেন্ডের মধ্যে উত্তর ফেরত দেয়?
অরনাভ বোরবোরাহ

1
হ্যাঁ, এটি হ'ল
কোয়ান্টাম হানবিস

1
@ থি.ইল্লেমান উভয়ই clock()এবং clock_tসি স্ট্যান্ডার্ড লাইব্রেরির প্রধান শিরোনাম থেকে time.hএবং তাই stdতাদের লাইব্রেরি অন্তর্ভুক্তির পরে নেমস্পেস উপসর্গ ব্যবহার করার প্রয়োজন নেই । <ctime>সেই মানটি এবং মোড়কের সাথে stdনেমস্পেসটি মুড়িয়ে দেয় তবে এটি ব্যবহারের দরকার নেই। বাস্তবায়নের বিশদগুলির জন্য এখানে চেক করুন: en.cppreferences.com/w/cpp/header/ctime
kayleeFrye_onDeck

70

একটি বিকল্প সমাধান, যা পোর্টেবল এবং উচ্চতর স্পষ্টতা সাথে আছেন, সি যেহেতু ++, 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;
}

আইডিয়ো ডট কম এ চালানো আমাকে দিয়েছে:

Delta t2-t1: 282 nanoseconds

11
আপনি যদি সি ++ 11 ব্যবহার করার পরামর্শ দিচ্ছেন তবে আপনি ঠিক পাশাপাশি লিখতেও পারেন using Clock=std::chrono::high_resolution_clock;প্রকারের উপন্যাসটি দেখুন ।
জেএইচবোনারিয়াস

std::chrono::high_resolution_clockসমস্ত স্টাড lib বাস্তবায়ন জুড়ে একঘেয়ে না। সিপ্রেফারেন্স থেকে - সাধারণত
ক্রিস্টিয়ানমিট

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আমার জন্য আসছে । আমি কীভাবে এটি ঠিক করব?
নওফাল

3
@ নফাল সম্ভবত ব্যয় করা সময়টি খুব কম তাই এটি 0 হিসাবে প্রদর্শিত হবে long doublemore
জেরার্ড

সম্ভবত আপনার ঘড়ির রেজোলিউশন পর্যাপ্ত পরিমাণে নেই, তাই কোনও সময় ব্যয় হয়নি।
মার্কো ফ্রয়েডেনবার্গার

4

কমপক্ষে উইন্ডোজে, একমাত্র ব্যবহারিকভাবে সঠিক পরিমাপ প্রক্রিয়া হল কোয়েরি পারফরম্যান্স কাউন্টার (কিউপিসি)। স্ট্যান্ড :: ক্রোনো এটি ব্যবহার করে বাস্তবায়ন করা হয়েছে (যেহেতু আপনি এটি ব্যবহার করেন তবে ভিএস ২০১৫), তবে এটি সরাসরি কোয়েরি পারফরম্যান্স কাউন্টার ব্যবহার করার মতো ডিগ্রির সাথে সঠিক নয় । বিশেষত এটি 1 ন্যানোসেকেন্ডের গ্রানুলারিটিতে রিপোর্ট করার দাবি একেবারে সঠিক নয়। সুতরাং, যদি আপনি এমন কিছু পরিমাপ করেন যা খুব স্বল্প পরিমাণে সময় নেয় (এবং আপনার ক্ষেত্রে কেবল এটির কেস হতে পারে), তবে আপনার কিউপিসি বা আপনার OS এর সমতুল্য ব্যবহার করা উচিত। আমি ক্যাশের বিলম্বগুলি পরিমাপ করার সময় এর বিরুদ্ধে এসেছি এবং আমি এখানে কয়েকটি নোট লিখেছিলাম যা আপনি কার্যকর পেতে পারেন; 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"

এটি ইতিমধ্যে উত্তর দেওয়া প্রশ্নের সাথে যোগ করে না। ক্লি = ক্লক () পরে ঘুমান - সিএল প্রয়োজন হয় না। এবং কাউট প্রতি সেকেন্ডে টিক্স না দিয়ে সেকেন্ড সেকেন্ড করে। সিএল ক্লক টিক্স সঞ্চয় করে।
ডাঃ ইউঙ্কে

0

সম্ভবত আপনি এই জাতীয় টাইমার আগ্রহী: এইচ: এম: এস। Msec।

লিনাক্স ওএসে কোড:

#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 ম্যাসি = 1 সেকেন্ড?
ডাঃ ইউঙ্কে

2
এটি সময়ে আপেক্ষিক ত্রুটি জমে যাবে কারণ আপনি মুদ্রণের জন্য যে সময় লাগে তা অন্তর্ভুক্ত করেন usleepনা এবং আপনি যে পরিমাণ পরিমাণ চেয়েছিলেন ঠিক তার পরে সর্বদা ফিরে আসবে না। কখনও কখনও এটি দীর্ঘ হবে। শুরুতে আপনার বর্তমান সময়টি পরীক্ষা করা উচিত, তারপরে বর্তমান সময়টি পরীক্ষা করুন এবং প্রতিটি সময় লুপের মাধ্যমে শুরু করার পরম সময়টি পেতে বিয়োগ করুন।
পিটার

0

আপনার প্রোগ্রাম কতক্ষণ কাজ করে তা আপনি পরিমাপ করতে পারবেন। প্রোগ্রামটি শুরু হওয়ার পরে নিম্নলিখিত ফাংশনগুলি সিপিইউর সময় পরিমাপ করতে সহায়তা করে:

  • সি ++ (ডাবল) ঘড়ি () / সিটিইএম সহ ক্লক পারের এসইসি অন্তর্ভুক্ত।
  • পাইথন টাইম.ক্লক () সেকেন্ডে ভাসমান-পয়েন্ট মান দেয়।
  • জাভা সিস্টেম.নানোটাইম () ন্যানোসেকেন্ডগুলিতে দীর্ঘ মান দেয়।

আমার রেফারেন্স : ক্যালিফোর্নিয়া বিশ্ববিদ্যালয় সান দিয়েগো এবং ন্যাশনাল রিসার্চ ইউনিভার্সিটি উচ্চ বিদ্যালয়ের অর্থনীতি দ্বারা ডেটা স্ট্রাকচার এবং অ্যালগরিদম বিশেষীকরণের অ্যালগরিদম সরঞ্জামবাক্স সপ্তাহে 1 কোর্সের অংশ

যাতে আপনি আপনার অ্যালগোরিদমের পরে কোডের এই লাইনটি যুক্ত করতে পারেন

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

প্রত্যাশিত আউটপুট: আউটপুট সংখ্যার প্রতিনিধিত্ব করে clock ticks per second


1
প্রশ্নটি কেবল সি ++ এর জন্য জিজ্ঞাসা করা হয়। সুতরাং আপনি অন্যান্য প্রোগ্রামিং ল্যাঙ্গুয়েজ / স্ক্রিপ্টগুলির জন্য রেফারেন্সটি খুব সুন্দর তবে এটি বিষয়টির বাইরে।
dboy
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.