الفريق العربي للبرمجةأرشيف المنتديات · 2000 – 2023
نسخة أرشيفية للقراءة فقط — التسجيل والمشاركة مغلقان، والمحتوى محفوظ كما كان.

time كيف يحسب الوقت

بدأه light stars في 7 يونيو 2011 · 4 رد · 738 مشاهدة · في الأسئلة المجابة
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

كبف أحسب الوقت المستغرق لخوارزمية معينة

int hamdist_d(string x, string y)
{	

	int val , dist = 0 ,max;

//------------------maximum: for chose the longest string----------------	
	max=Maxmum(x.length(),y.length());
//-------------Count the number of distance------

	for(size_t i = 0; i < max; i++)
	{	
		if (x != y)
			dist++;
	}
	return dist;
}

يعني عندي هذا الكود

وأبي أحسب كم أستغرق من الوقت

علما أني أستخدمت time_t------clock_t

ويعطيني الناتج صفر ﻷن العملية بسيطة وسريعة

هل من دلة أسرع في حساب الوقت

تم تعديل هذه المشاركة بواسطة light stars في 7 يونيو 2011 في 14:02

#3
اقتباس
وأبي أحسب كم أستغرق من الوقت

هذا يعتمد على تعريفك لمعنى "كم يستغرق من الوقت".

إن كنت تقصد الوقت الطبيعي الخارجي الذي يحس به المستخدم, يعني يسمونها "ساعة الحائط":

#include <ctime>

int main()
{
	std::time_t start = std::time(NULL);
	// Your code!
	std::time_t end = std::time(NULL);
	double duration = std::difftime(end, start); // duration in seconds
}

أما إن كنت تتكلم عن عدد الـ ticks التي يستغرقها البرنامج في قطعة كود:

#include <ctime>

int main()
{
	std::clock_t start = std::clock();
	// Your code!
	std::clock_t end = std::clock();
	std::clock_t duration = end - start; // duration in ticks
	double duration_seconds = duration / CLOCKS_PER_SEC; // duration in seconds
}

في الحالتين يجب أن تكون حذراً لأن البرنامج في الحالة الأولى قد لا يعطى أولوية في التنفيذ في حالة ما على جهاز ما, و في الحالة الثانية قد توهمك عمليات الـ optimization بأن الكود لا يعمل أصلاً :wink:

تم تعديل هذه المشاركة بواسطة Khaled.Alshaya في 9 يونيو 2011 في 00:35

1
#4

طبقت الكودين Khaled.Alshaya لكن النتائج تكون صفر ﻷني كما ذكرت الخوارزمية صغيرة جدا (تقارن بين نصين one "for" loop)

لكن طبقت هذا الكود من أخي Xacker فأعطي نتائج (صغيررررررررررررررة جدا) وهذا ما أريد

typedef unsigned long long timestamp_t;

    static timestamp_t
    get_timestamp ()
    {
      struct timeval now;
      gettimeofday (&now, NULL);
      return  now.tv_usec + (timestamp_t)now.tv_sec * 1000000;
    }

int main()
{
	int val , dist = 0 ,max;
	string x="Khaled.Alshaya";
	string y="Xacker";
        if(x.length()>y.length())
		max=x.length();
	else
		max=y.length();

//---------------------------test 1-------------------------------
	std::clock_t start = std::clock();
        for(size_t i = 0; i < max; i++)
        {       
                if (x != y)
                        dist++;
        }
        std::clock_t end = std::clock();
        std::clock_t duration = end - start; // duration in ticks
        double duration_seconds = duration / CLOCKS_PER_SEC; // duration in seconds
	cout<<"time test1:"<<duration_seconds<<endl;
//----------------------------test 2-------------------------
	time_t c1=clock();
        for(size_t i = 0; i < max; i++)
        {       
                if (x != y)
                        dist++;
        }	time_t c2=clock();
  	cout <<"time test2:"<<(c2-c1)/(double)CLOCKS_PER_SEC<<endl;
//----------------------------test 3------------------------------------
	timestamp_t t0 = get_timestamp();
        for(size_t i = 0; i < max; i++)
        {       
                if (x != y)
                        dist++;
        }
	timestamp_t t1 = get_timestamp();
	double secs = (t1 - t0) / 1000000.0L;
	cout<<"time test4:"<<secs<<endl;
return 0;
}

وجزاكما الله خيرا على المساعدة

post-244405-057509000 1307621799_thumb.p

المرفقات
Screenshot-1.png
#5
اقتباس
طبقت الكودين Khaled.Alshaya لكن النتائج تكون صفر ﻷني كما ذكرت الخوارزمية صغيرة جدا (تقارن بين نصين one "for" loop)

لكن طبقت هذا الكود من أخي Xacker فأعطي نتائج (صغيررررررررررررررة جدا) وهذا ما أريد

هنا يأتي دور الـ precision التي تدعمها المنصة في العتاد و نظام التشغيل. بمعنى أنه صحيح أنك تقوم بقراءة عدد الـ ticks التي تخطاها البرنامج, إلا أنه في الحقيقة لايحدث هذا الـ counter إلا من خلال interrupts تفعل على فترات أضعاف مضاعفة من الـ ticks. عموماً هذه ليست الطريقة المثلى لفعل ما تريد. استخدام profiler حتى لو كان بسيطاً كـ gprof و سوف يفي بالغرض لكي يريك المناطق التي تستهلاك معظم الوقت.

مواضيع مشابهة