সি ++ এর মধ্যে সময়ের পার্থক্য কীভাবে গণনা করা যায়


96

সি ++ এর সাথে সময়ের পার্থক্য গণনা করার সর্বোত্তম উপায় কী? আমি একটি প্রোগ্রামের সম্পাদনের গতির সময় নির্ধারণ করছি, তাই আমি মিলিসেকেন্ডে আগ্রহী। আরও ভাল, সেকেন্ড.মিলিসেকেন্ড ..

গৃহীত উত্তরটি কাজ করে তবে মন্তব্যে উল্লিখিত সিটিটাইম বা টাইম হ'ল অন্তর্ভুক্ত করা দরকার।


ডুপে, তবে এখনই লিঙ্ক করতে পারছেন না
রবার্ট গোল্ড

4
ভোট বন্ধ করার ভোট খুব কম, খুব দেরিতে ছিল। আমি একটি কাজের উত্তর পেয়েছি। ভাল চেষ্টা যদিও। বিটিডব্লু, আমি কোনও লিঙ্কও পাইনি।
জ্যাক BeNimble

এটি উইন্ডো জন্য? তারপরে গেটটিকাউন্ট (উইন্ডোজ এপিআই) চেষ্টা করুন
এজে।

4
রবার্ট: সৌভাগ্যক্রমে, কারণ নতুন পোস্টিংয়ের ফলে আরও বেশ কয়েকটি উত্তর মঞ্জুর হয়েছিল যার মধ্যে একটি আমি বেছে নিয়েছি। গুরুতরভাবে, আমি একটি ডুপ পোস্ট বন্ধ করার মান নিয়ে প্রশ্ন করি। কিছু সমাধান যদি প্রথমটিতে উল্লেখ না করা হয় তবে কী হবে? নতুন প্রযুক্তির বিকাশ? বিভিন্ন শিরোনামের কারণে এটি খুঁজে পাচ্ছেন না?
জ্যাক BeNimble

4
@ জ্যাকবিনিম্বলে কয়েকটি "দ্বিধা" প্রাপ্তি শেষ হয়েছে যা হুবহু ডুপস ছিল না (সম্ভবত যে লোকেরা সম্ভবত প্রশ্নটি দ্রুত পড়ে এবং এটি অন্য প্রশ্নের অনুরূপ বলে মনে হয় বলে চিহ্নিত করে), আমি আপনার বক্তব্যের সাথে দৃ strongly়ভাবে একমত ... মেটা স্ট্যাক এক্সচেঞ্জের জন্য সম্ভবত একটি পয়েন্ট: o
কোড_fodder

উত্তর:


124

std::clock()ফাংশন দেখুন ।

const clock_t begin_time = clock();
// do something
std::cout << float( clock () - begin_time ) /  CLOCKS_PER_SEC;

যদি আপনি নিজের জন্য (ব্যবহারকারীর জন্য নয়) এক্সিকিউশন সময় গণনা করতে চান, তবে এটি ক্লক টিকগুলিতে (সেকেন্ড নয়) করা ভাল।

সম্পাদনা:
দায়ী হেডার ফাইল - <ctime>বা<time.h>


4
মনে রাখবেন যে যদিও ঘড়ি () বেশ কয়েকটি মিলিসেকেন্ডে ফেরত দেয় তবে ঘড়ির যথার্থতা এর চেয়ে আরও খারাপ হতে পারে। উইন্ডোজের প্রথম উদাহরণটি ক্লকটির সঠিকতা () ফাংশনটি 40 এমএসের মতো।
জন ডিবলিং

4
আমি ম্যাক 10.7 এ চেষ্টা করেছি। আমার অ্যাপ্লিকেশনটি 15 সেকেন্ডের মধ্যে একটি 100 এমবি ফাইল কার্যকর করে, তবে ভিন্ন সময়টি 61 সেকেন্ডে রিপোর্ট করে। বেশি ব্যবহার হয় না। আমি মনে করি সময় () সম্ভবত আরও ভাল।
মাইক

6
clock()প্রোগ্রাম দ্বারা গ্রাহিত সিপিইউ সময় প্রদান করে। সুতরাং যদি প্রোগ্রামটি সমান্তরালভাবে সঞ্চালিত
আমির জেহাদাকি

4
এই উত্তরটি বিভ্রান্তিকর কারণ এটি সিপিইউ সময় দেখায়, প্রাচীরের ঘড়ির সময় নয়।
আল্ট্রাভায়োলেট

4
আমাকে এখানে আল্ট্রাভায়োলেট সহ একমত হতে হবে, কোনও প্রোগ্রামের গতি পরিমাপ করতে সিপিইউ সময় ব্যবহার করা ভুল কাজ বলে মনে হয়। ওপির সঠিক উত্তর হিসাবে এটি চিহ্নমুক্ত করা উচিত। আইএমও আপনি স্ট্যান্ড :: ক্রোনো :: স্টেডি_ক্লাব :: এখন () নীচের
থ্রেডওভারফ্লো / প্রশ্ন

37

আপনি যদি সি ++ 11 ব্যবহার করেন তবে এখানে একটি সাধারণ মোড়ক দেওয়া আছে (এই টুকরোটি দেখুন ):

#include <iostream>
#include <chrono>

class Timer
{
public:
    Timer() : beg_(clock_::now()) {}
    void reset() { beg_ = clock_::now(); }
    double elapsed() const { 
        return std::chrono::duration_cast<second_>
            (clock_::now() - beg_).count(); }

private:
    typedef std::chrono::high_resolution_clock clock_;
    typedef std::chrono::duration<double, std::ratio<1> > second_;
    std::chrono::time_point<clock_> beg_;
};

অথবা সি ++ 03 এর জন্য * নিক্সে:

#include <iostream>
#include <ctime>

class Timer
{
public:
    Timer() { clock_gettime(CLOCK_REALTIME, &beg_); }

    double elapsed() {
        clock_gettime(CLOCK_REALTIME, &end_);
        return end_.tv_sec - beg_.tv_sec +
            (end_.tv_nsec - beg_.tv_nsec) / 1000000000.;
    }

    void reset() { clock_gettime(CLOCK_REALTIME, &beg_); }

private:
    timespec beg_, end_;
};

ব্যবহারের উদাহরণ:

int main()
{
    Timer tmr;
    double t = tmr.elapsed();
    std::cout << t << std::endl;

    tmr.reset();
    t = tmr.elapsed();
    std::cout << t << std::endl;
    return 0;
}

4
অন্য বিকল্পটি হ'ল সি ++ 11 এসটিএল স্ট্যান্ড :: ক্রোনো নেমস্পেসের পরিবর্তে বুস্ট :: ক্রোনো ব্যবহার করা হবে। আপনার কোডের জন্য আপনাকে ধন্যবাদ।
দিদাক পেরেজ পারেরা

সাবধান হন: এই ব্যবহারকারী মধ্যে তার সময় পরিবর্তন যদি কাজ করবে না Timer()এবং কল elapsed()যদি !std::chrono::high_resolution_clock::is_steady- যা লিনাক্স ক্ষেত্রে দেখা যায়!
hasাসে

30

আমি বুস্টের ব্যবহারটি বিশেষত বুস্ট :: পিক্সিক_টাইম :: পিটাইম এবং বুস্ট :: পিক্সিক_টাইম :: সময়_দূত্রে ( http://www.boost.org/doc/libs/1_38_0/doc/html/date_time/posix_time এ গুরুত্ব সহকারে বিবেচনা করব) .html )।

এটি ক্রস প্ল্যাটফর্ম, সহজেই ব্যবহারযোগ্য এবং আমার অভিজ্ঞতায় একটি অপারেটিং সিস্টেমের সর্বোচ্চ স্তরের সময় রেজোলিউশন সরবরাহ করে। সম্ভবত খুব গুরুত্বপূর্ণ; এটি কিছু খুব সুন্দর আইও অপারেটর সরবরাহ করে।

প্রোগ্রামের প্রয়োগের পার্থক্য গণনা করতে এটি ব্যবহার করতে (মাইক্রোসেকেন্ডগুলিতে; সম্ভবত ওভারকিল), এটি দেখতে কিছুটা [ব্রাউজার লিখিত, পরীক্ষিত নয়]:

ptime time_start(microsec_clock::local_time());
//... execution goes here ...
ptime time_end(microsec_clock::local_time());
time_duration duration(time_end - time_start);
cout << duration << '\n';

4
তবে লোকাল_টাইম () উন্নত করা একঘেয়ে নয়, তাই সময় নষ্ট করার জন্য এটি ব্যবহার করা উচিত নয়। বুস্টের কাছ থেকে একঘেয়েমি সময় অ্যাক্সেসের কোনও উপায় খুঁজে পাইনি।
গাটোপিচ

28

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

আপনার আসল সময়টি পেতে,

#include <chrono>

auto t_start = std::chrono::high_resolution_clock::now();
// the work...
auto t_end = std::chrono::high_resolution_clock::now();

double elapsed_time_ms = std::chrono::duration<double, std::milli>(t_end-t_start).count();

4
আমি এই উত্তর ছাড়া স্টাডি :: ক্রোনো ব্যবহার করতে পারতাম না, ধন্যবাদ!
গাইল 21

13

1.46.0 অনুমোদন এবং আপ অন্তর্ভুক্ত Chrono গ্রন্থাগার:

থ্রেড_ক্লক ক্লাসটি আসল থ্রেড ওয়াল-ক্লক, অর্থাৎ কলিং থ্রেডের আসল সিপিইউ-টাইম ক্লকটিতে অ্যাক্সেস সরবরাহ করে। থ্রেড আপেক্ষিক বর্তমান সময় থ্রেড_ক্লোক :: এখন () কল করে পাওয়া যাবে

#include <boost/chrono/thread_clock.hpp>
{
...
    using namespace boost::chrono;
    thread_clock::time_point start = thread_clock::now();
    ...
    thread_clock::time_point stop = thread_clock::now();  
    std::cout << "duration: " << duration_cast<milliseconds>(stop - start).count() << " ms\n";

7
এছাড়াও, সি ++ 11 এর std::chronoপ্রায় একই বিষয়বস্তুর সাথে নেমস্পেস রয়েছে।
ulidtko


8

আপনি ক্লক_জেটটাইমও ব্যবহার করতে পারেন । এই পদ্ধতিটি পরিমাপ করতে ব্যবহার করা যেতে পারে:

  1. সিস্টেমের প্রশস্ত রিয়েল-টাইম ঘড়ি
  2. সিস্টেম প্রশস্ত একঘেয়ে ঘড়ি
  3. প্রসেস সিপিইউ সময়
  4. প্রতি প্রক্রিয়া থ্রেড সিপিইউ সময়

কোডটি নিম্নরূপ:

#include < time.h >
#include <iostream>
int main(){
  timespec ts_beg, ts_end;
  clock_gettime(CLOCK_PROCESS_CPUTIME_ID, &ts_beg);
  clock_gettime(CLOCK_PROCESS_CPUTIME_ID, &ts_end);
  std::cout << (ts_end.tv_sec - ts_beg.tv_sec) + (ts_end.tv_nsec - ts_beg.tv_nsec) / 1e9 << " sec";
}

`


6

আপনি যদি ইউনিক্সে থাকেন timeতবে এক্সিকিউশনের সময় পেতে আপনি এটি ব্যবহার করতে পারেন :

$ g++ myprog.cpp -o myprog
$ time ./myprog

5

কেবলমাত্র একটি পার্শ্ব নোট: আপনি যদি উইন্ডোয় চলমান থাকেন এবং আপনার যদি সত্যই নির্ভুলতার প্রয়োজন হয় তবে আপনি কোয়েরি পারফরম্যান্স কাউন্টার ব্যবহার করতে পারেন । এটি আপনাকে (সম্ভাব্য) ন্যানো সেকেন্ডে সময় দেয় ।


5

আমার জন্য, সবচেয়ে সহজ উপায় হ'ল:

#include <boost/timer.hpp>

boost::timer t;
double duration;

t.restart();
/* DO SOMETHING HERE... */
duration = t.elapsed();

t.restart();
/* DO OTHER STUFF HERE... */
duration = t.elapsed();

এই কোডের টুকরোটি ব্যবহার করে আপনাকে ক্লাসিকটি করতে হবে না end - start

আপনার পছন্দসই পদ্ধতির উপভোগ করুন।


t.elapsed () সেকেন্ড বা মিলি সেকেন্ডে হয়?
এমকিউজ ২

4

শুরুতে মিলিসেকেন্ডে সিস্টেমের সময়টি পান, এবং আবার শেষে, এবং বিয়োগ করুন।

পসিক্সে ১৯ 1970০ সাল থেকে মিলিসেকেন্ডের সংখ্যা পেতে আপনি লিখতে পারেন:

struct timeval tv;

gettimeofday(&tv, NULL);
return ((((unsigned long long)tv.tv_sec) * 1000) +
        (((unsigned long long)tv.tv_usec) / 1000));

উইন্ডোজে 1601 সাল থেকে মিলিসেকেন্ডের সংখ্যা পেতে আপনি লিখতে পারেন:

SYSTEMTIME systime;
FILETIME filetime;

GetSystemTime(&systime);
if (!SystemTimeToFileTime(&systime, &filetime))
    return 0;

unsigned long long ns_since_1601;
ULARGE_INTEGER* ptr = (ULARGE_INTEGER*)&ns_since_1601;

// copy the result into the ULARGE_INTEGER; this is actually
// copying the result into the ns_since_1601 unsigned long long.
ptr->u.LowPart = filetime.dwLowDateTime;
ptr->u.HighPart = filetime.dwHighDateTime;

// Compute the number of milliseconds since 1601; we have to
// divide by 10,000, since the current value is the number of 100ns
// intervals since 1601, not ms.
return (ns_since_1601 / 10000);

আপনি যদি উইন্ডোজ উত্তরটি স্বাভাবিক করার জন্য যত্নশীল হন যাতে এটি 1970 সাল থেকে মিলিসেকেন্ডের সংখ্যাটিও ফিরিয়ে দেয় তবে আপনাকে নিজের উত্তরটি 11644473600000 মিলিসেকেন্ড দ্বারা সামঞ্জস্য করতে হবে। তবে এটি প্রয়োজনীয় নয় যদি আপনার যত্ন নেওয়া সমস্ত সময় অতিবাহিত হয়।


4

আপনি যদি ব্যবহার করছেন:

tstart = clock();

// ...do something...

tend = clock();

তারপরে আপনার সেকেন্ডে সময় পেতে নিম্নলিখিতগুলির প্রয়োজন হবে:

time = (tend - tstart) / (double) CLOCKS_PER_SEC;

0

এটি ইন্টেল ম্যাক 10.7 এর জন্য দুর্দান্ত কাজ করছে বলে মনে হচ্ছে:

#include <time.h>

time_t start = time(NULL);


    //Do your work


time_t end = time(NULL);
std::cout<<"Execution Time: "<< (double)(end-start)<<" Seconds"<<std::endl;
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.