স্ট্যান্ড :: সিস্টেম_ক্লাব এবং স্টাডি :: অবিচলিত ঘড়ির মধ্যে পার্থক্য?


98

মধ্যে পার্থক্য কি std::system_clockএবং std::steady_clock? (একটি উদাহরণ যা বিভিন্ন ফলাফল / আচরণগুলি চিত্রিত করে তা দুর্দান্ত হবে)।

আমার লক্ষ্য অবিকল ফাংশন (ক বেঞ্চমার্ক মত) চালু হওয়ার সময়ের পরিমাপ হয়, তাহলে কি মধ্যে ভাল পছন্দ হতে হবে std::system_clock, std::steady_clockএবং std::high_resolution_clock?


9
শুরু করার জন্য, সিস্টেম_ক্লোকটি অবিচ্ছিন্ন নাও হতে পারে।
জেমস ম্যাকনেলিস

12
@ চার্লসসালভিয়া আমি অন্যান্য প্ল্যাটফর্মের পক্ষে কথা বলতে পারি না, তবে system_clockউইন্ডোজটিতে স্থির নয়। উইন্ডোজে, সিস্টেমের সময়টি কোনও পর্যাপ্ত সুবিধা প্রাপ্ত ব্যবহারকারী কোনও যেকোন স্বেচ্ছাসেবী মানতে পরিবর্তন করতে পারে। অতিরিক্তভাবে, সময় সিঙ্ক্রোনাইজেশন পরিষেবাটি প্রয়োজনে সিস্টেমের সময়কে পিছনের দিকে সামঞ্জস্য করতে পারে। আমি প্রত্যাশা করি বেশিরভাগ অন্যান্য প্ল্যাটফর্মে একই বৈশিষ্ট্য রয়েছে যা সিস্টেম সময়ের সামঞ্জস্যকরণের অনুমতি দেয়।
জেমস ম্যাকনেলিস

4
@ চার্লস: আমি জানি বেশিরভাগ পসিক্স বক্সগুলি একইভাবে প্রভাবিত হয়েছে এবং ব্যবহারকারী সময় পরিবর্তন করলে তাদের সময় পরিবর্তন হবে।
বিলি ওয়ানিল

5
এই প্রশ্নের ভিডিওর উত্তর: youtube.com/watch?v=P32hvk8b13M&t=48m44s
হাওয়ার্ড হিন্যান্ট

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

উত্তর:


74

N3376 থেকে:

20.11.7.1 [টাইমক্লক.সিসটেম] / ১:

শ্রেণীর অবজেক্টগুলি system_clockসিস্টেম-প্রশস্ত রিয়েলটাইম ঘড়ি থেকে প্রাচীর ঘড়ির সময়কে উপস্থাপন করে।

20.11.7.2 [টাইমক্লক.স্টেডি] / ১:

শ্রেণীর অবজেক্টগুলি এমন steady_clockঘড়িগুলি উপস্থাপন করে যার জন্য time_pointশারীরিক সময়ের অগ্রগতি হিসাবে কখনই মানগুলি হ্রাস পায় না এবং যার time_pointজন্য বাস্তব সময়ের তুলনায় স্থির হারে অগ্রিমের মানগুলি । অর্থাৎ, ঘড়িটি সামঞ্জস্য করা হতে পারে না।

20.11.7.3 [টাইমক্লক.হায়ার্স] / ১:

ক্লাসের অবজেক্টগুলি high_resolution_clockসংক্ষিপ্ত টিক পিরিয়ড সহ ঘড়িগুলি উপস্থাপন করে। বা এর high_resolution_clockপ্রতিশব্দ হতে পারে ।system_clocksteady_clock

উদাহরণস্বরূপ, সিস্টেম ওয়াইড ক্লকটি দিবালোকের সঞ্চয় সময় যেমন কিছু সময় দ্বারা প্রভাবিত হতে পারে, ঠিক সেই সময়ে ভবিষ্যতে কোনও সময়ে তালিকাভুক্ত প্রকৃত সময়টি আসলে অতীতের একটি সময় হতে পারে। (মার্কিন যুক্তরাষ্ট্রে, শরত্কালে সময়টি এক ঘন্টা পিছনে সরে যায়, সুতরাং একই ঘন্টাটি "দুইবার" অভিজ্ঞ হয়) তবে, steady_clockএই জাতীয় জিনিসগুলির দ্বারা প্রভাবিত হওয়ার অনুমতি নেই।

এই ক্ষেত্রে "অবিচলিত" সম্পর্কে চিন্তা করার আর একটি উপায় হ'ল 20.11.3 এর সারণীতে বর্ণিত প্রয়োজনীয়তাগুলি [টাইমলক্লোক.রেক] / ২:

সারণি 59-এ C1এবং C2ঘড়ির ধরণগুলি বোঝান। t1এবং কলগুলি ফিরে আসার আগে কল রিটার্নিং ঘটে এবং এই উভয় কলের আগেই উপস্থিত হওয়া t2মানগুলি । [দ্রষ্টব্য: এর অর্থ এবং এর মধ্যে প্রায় মোড়ানো হয়নিC1::now()t1t2C1::time_point::max()C1t1t2 । অন্তর্ভুক্ত নোট]

এক্সপ্রেশন: C1::is_steady
রিটার্নস: const bool
অপারেশনাল শব্দার্থক: trueযদি t1 <= t2সর্বদা সত্য হয় এবং ঘড়ির টিকের মাঝে সময় স্থির থাকে অন্যথায় false

এই সমস্ত মান তাদের পার্থক্য উপর আছে।

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


4
@ চারেলস: স্ট্যান্ডার্ডটি দেখানোর জন্য যত্নশীল যেখানে কেসটি? এটি পরিষ্কারভাবে বিপরীতটি ইঙ্গিত করে বলে মনে হচ্ছে।
বিলি ওনিল

9
@ চার্লস: এছাড়াও, পসিক্স সময় "স্থির" নয় - যদি ব্যবহারকারী তাদের কম্পিউটারে সময় সেটিং পরিবর্তন করে তবে পসিক্স সময় পরিবর্তন হবে change যদি আপনি একটি ডিম রান্না করে থাকেন এবং এমন টাইমার প্রয়োজন যা 4 মিনিট অবধি স্থায়ী হয় তবে আপনার বর্তমান সময় পরিবর্তন করা হলেও আপনার এটি 4 মিনিট স্থায়ী হতে হবে। আপনি যদি 5 তম 3 এ একটি সভার জন্য একটি টাইমার সেট পেয়ে থাকেন তবে স্থানীয় সময় পরিবর্তন হলে আপনার অবশ্যই সেই টাইমারটি বদলাতে হবে। সুতরাং steady_clockএবং system_clockএখানে পার্থক্য ।
বিলি ওয়ানিল

4
@ 5gon: কোনও কিছুর জন্য system_clockইউটিসি হওয়া দরকার না ।
বিলি ওনিল

4
@CharlesSalvia এও নোট করুন যে ইউটিসি লিপ সেকন্ড (Cf. হয়েছে POSIX সময় ইউটিসি আবদ্ধ থাকে যেহেতু, এবং দয়া করে en.wikipedia.org/wiki/Unix_time#Leap_seconds )। এর অর্থ হ'ল মেশিনের সময়টি কখনই সমন্বয় করা না গেলেও সি / পসিক্স সময় অ-একঘেয়েমি হতে পারে।
মাইকেল শ্লোটকে-লেকম্পার

4
আপডেট (ভিজ্যুয়াল স্টুডিও 2015) স্থির_ঘড়ির বাস্তবায়ন পরিবর্তিত হয়েছে [.....] স্থির_ক্লক এখন কোয়েরি পারফরম্যান্স কাউন্টার () এর উপর ভিত্তি করে এবং হাই_রেসোলিউশন_ক্লক এখন স্টেডি_ক্লকের জন্য টাইপডেফ। এমএসডিএন.মাইক্রোসফটকম /en-us/library/hh874757.aspx
ফেলিক্স-বি

47

বিলি আইএসও সি ++ স্ট্যান্ডার্ডের উপর ভিত্তি করে একটি দুর্দান্ত উত্তর দিয়েছিল যার সাথে আমি পুরোপুরি সম্মত। তবে গল্পটির আরও একটি দিক রয়েছে - বাস্তব জীবন। দেখে মনে হচ্ছে যে জনপ্রিয় কম্পাইলারগুলি প্রয়োগের ক্ষেত্রে এই ঘড়িগুলির মধ্যে সত্যিই কোনও পার্থক্য নেই:

জিসিসি 4.8:

#ifdef _GLIBCXX_USE_CLOCK_MONOTONIC
   ...
#else
  typedef system_clock steady_clock;
#endif
  typedef system_clock high_resolution_clock;

ভিজ্যুয়াল স্টুডিও 2012:

class steady_clock : public system_clock
{   // wraps monotonic clock
public:
  static const bool is_monotonic = true;    // retained
  static const bool is_steady = true;
};

typedef system_clock high_resolution_clock;

জিসিসির ক্ষেত্রে আপনি অবিচ্ছিন্ন ঘড়িটি কেবল চেক করেই ডিল করেন কিনা তা আপনি পরীক্ষা করতে পারেন is_steady সেই অনুযায়ী আচরণ । তবে ভিএস ২০১২ এখানে কিছুটা প্রতারণা করছে বলে মনে হচ্ছে :-)

আপনার যদি উচ্চ নির্ভুলতার ঘড়ির প্রয়োজন হয় তবে আমি এখনই আপনার নিজের ঘড়িটি লেখার জন্য সুপারিশ করছি যা সি ++ 11 অফিসিয়াল ক্লক ইন্টারফেসের সাথে সঙ্গতিপূর্ণ এবং বাস্তবায়নগুলি অপেক্ষা করার জন্য অপেক্ষা করুন। এটি সরাসরি আপনার কোডে ওএস নির্দিষ্ট এপিআই ব্যবহার করার চেয়ে অনেক ভাল পদ্ধতির হবে। উইন্ডোজের জন্য আপনি এটি এর মতো করতে পারেন:

// Self-made Windows QueryPerformanceCounter based C++11 API compatible clock
struct qpc_clock {
  typedef std::chrono::nanoseconds                       duration;      // nanoseconds resolution
  typedef duration::rep                                  rep;
  typedef duration::period                               period;
  typedef std::chrono::time_point<qpc_clock, duration>   time_point;
  static bool is_steady;                                                // = true
  static time_point now()
  {
    if(!is_inited) {
      init();
      is_inited = true;
    }
    LARGE_INTEGER counter;
    QueryPerformanceCounter(&counter);
    return time_point(duration(static_cast<rep>((double)counter.QuadPart / frequency.QuadPart *
                                                period::den / period::num)));
  }

private:
  static bool is_inited;                                                // = false
  static LARGE_INTEGER frequency;
  static void init()
  {
    if(QueryPerformanceFrequency(&frequency) == 0)
      throw std::logic_error("QueryPerformanceCounter not supported: " + std::to_string(GetLastError()));
  }
};

লিনাক্সের জন্য এটি আরও সহজ। কেবলমাত্র ম্যান পৃষ্ঠাটি পড়ুন clock_gettimeএবং উপরের কোডটি সংশোধন করুন।


19
ভিসি ++ 2012 বাস্তবায়ন এমএসের মানক লাইব্রেরি রক্ষণাবেক্ষণকারী দ্বারা একটি বাগ হিসাবে স্বীকৃত হয়েছে।
iljarn


4
বুস্ট কোয়েরি পারফরম্যান্স কাউন্টার ব্যবহার করে, সুতরাং বুস্ট :: ক্রোনো ব্যবহার করা এই বাগটি ভিজুয়াল স্টুডিও 14 প্রকাশ না হওয়া পর্যন্ত ভাল কাজ
মোহাম্মদ এল-নাকিব

: এবং এখানে POSIX জিসিসি 5.3.0 উপর অপেক্ষায় ঐ কল হয় stackoverflow.com/a/36700301/895245
সিরো Santilli郝海东冠状病六四事件法轮功

19

জিসিসি 5.3.0 বাস্তবায়ন

সি ++ স্ট্ডলিব জিসিসির উত্সের ভিতরে রয়েছে:

  • high_resolution_clock জন্য একটি উপনাম system_clock
  • system_clock নিম্নলিখিত যে প্রথমটি উপলব্ধ তা এগিয়ে পাঠায়:
    • clock_gettime(CLOCK_REALTIME, ...)
    • gettimeofday
    • time
  • steady_clock নিম্নলিখিত যে প্রথমটি উপলব্ধ তা এগিয়ে পাঠায়:
    • clock_gettime(CLOCK_MONOTONIC, ...)
    • system_clock

তারপরে CLOCK_REALTIMEবনাম CLOCK_MONOTONICএখানে ব্যাখ্যা করা হয়েছে: CLOCK_REALTIME এবং CLOCK_MONOTONIC এর মধ্যে পার্থক্য?


3

হতে পারে, সর্বাধিক উল্লেখযোগ্য পার্থক্য হ'ল এর প্রথম দিকটি std::chrono:system_clockহল 1.1.1970, তথাকথিত ইউএনআইএক্স-যুগের। অন্যদিকে, std::chrono::steady_clockসাধারণত আপনার পিসির বুট সময় এবং এটি অন্তরগুলি পরিমাপ করার জন্য সবচেয়ে উপযুক্ত।


2

লেখক হাওয়ার্ড হিন্যান্টের ক্রোনো সম্পর্কে প্রাসঙ্গিক আলোচনাchrono :

high_resolution_clockএটির মধ্যে একটির জন্য এটি একটি উপাস হিসাবে ব্যবহার করবেন না :

  • system_clock: এটি নিয়মিত ঘড়ির মতো, সময় / তারিখ সম্পর্কিত জিনিসগুলির জন্য এটি ব্যবহার করুন
  • steady_clock: এটি স্টপ ওয়াচের মতো, সময় মতো জিনিসগুলির জন্য এটি ব্যবহার করুন।
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.