আমি কিভাবে কল 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
সি স্ট্যান্ডার্ড লাইব্রেরির প্রধান শিরোনাম থেকে time.h
এবং তাই std
তাদের লাইব্রেরি অন্তর্ভুক্তির পরে নেমস্পেস উপসর্গ ব্যবহার করার প্রয়োজন নেই । <ctime>
সেই মানটি এবং মোড়কের সাথে std
নেমস্পেসটি মুড়িয়ে দেয় তবে এটি ব্যবহারের দরকার নেই। বাস্তবায়নের বিশদগুলির জন্য এখানে চেক করুন: en.cppreferences.com/w/cpp/header/ctime
একটি বিকল্প সমাধান, যা পোর্টেবল এবং উচ্চতর স্পষ্টতা সাথে আছেন, সি যেহেতু ++, 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
using Clock=std::chrono::high_resolution_clock;
। প্রকারের উপন্যাসটি দেখুন ।
std::chrono::high_resolution_clock
সমস্ত স্টাড lib বাস্তবায়ন জুড়ে একঘেয়ে না। সিপ্রেফারেন্স থেকে - সাধারণত
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
more
কমপক্ষে উইন্ডোজে, একমাত্র ব্যবহারিকভাবে সঠিক পরিমাপ প্রক্রিয়া হল কোয়েরি পারফরম্যান্স কাউন্টার (কিউপিসি)। স্ট্যান্ড :: ক্রোনো এটি ব্যবহার করে বাস্তবায়ন করা হয়েছে (যেহেতু আপনি এটি ব্যবহার করেন তবে ভিএস ২০১৫), তবে এটি সরাসরি কোয়েরি পারফরম্যান্স কাউন্টার ব্যবহার করার মতো ডিগ্রির সাথে সঠিক নয় । বিশেষত এটি 1 ন্যানোসেকেন্ডের গ্রানুলারিটিতে রিপোর্ট করার দাবি একেবারে সঠিক নয়। সুতরাং, যদি আপনি এমন কিছু পরিমাপ করেন যা খুব স্বল্প পরিমাণে সময় নেয় (এবং আপনার ক্ষেত্রে কেবল এটির কেস হতে পারে), তবে আপনার কিউপিসি বা আপনার OS এর সমতুল্য ব্যবহার করা উচিত। আমি ক্যাশের বিলম্বগুলি পরিমাপ করার সময় এর বিরুদ্ধে এসেছি এবং আমি এখানে কয়েকটি নোট লিখেছিলাম যা আপনি কার্যকর পেতে পারেন; 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"
সম্ভবত আপনি এই জাতীয় টাইমার আগ্রহী: এইচ: এম: এস। 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";
}
usleep
না এবং আপনি যে পরিমাণ পরিমাণ চেয়েছিলেন ঠিক তার পরে সর্বদা ফিরে আসবে না। কখনও কখনও এটি দীর্ঘ হবে। শুরুতে আপনার বর্তমান সময়টি পরীক্ষা করা উচিত, তারপরে বর্তমান সময়টি পরীক্ষা করুন এবং প্রতিটি সময় লুপের মাধ্যমে শুরু করার পরম সময়টি পেতে বিয়োগ করুন।
আপনার প্রোগ্রাম কতক্ষণ কাজ করে তা আপনি পরিমাপ করতে পারবেন। প্রোগ্রামটি শুরু হওয়ার পরে নিম্নলিখিত ফাংশনগুলি সিপিইউর সময় পরিমাপ করতে সহায়তা করে:
আমার রেফারেন্স : ক্যালিফোর্নিয়া বিশ্ববিদ্যালয় সান দিয়েগো এবং ন্যাশনাল রিসার্চ ইউনিভার্সিটি উচ্চ বিদ্যালয়ের অর্থনীতি দ্বারা ডেটা স্ট্রাকচার এবং অ্যালগরিদম বিশেষীকরণের অ্যালগরিদম সরঞ্জামবাক্স সপ্তাহে 1 কোর্সের অংশ
যাতে আপনি আপনার অ্যালগোরিদমের পরে কোডের এই লাইনটি যুক্ত করতে পারেন
cout << (double)clock() / CLOCKS_PER_SEC ;
প্রত্যাশিত আউটপুট: আউটপুট সংখ্যার প্রতিনিধিত্ব করে clock ticks per second
perf stat -d ./a.out