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

نتائج غير منطقية لهذا الكود

مغلق
بدأه elalia في 8 أغسطس 2006 · 31 رد · 2,046 مشاهدة · في JavaSE
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

السلام عليكم لدي برنامج احساب الوقت المتوسط الذي ينتظره thread في طابور الانظار CPU ولكن مشكلة هذا البرنامج انه يعطيني وقت بالسالب او معدوم فاطلب صاحب االفراسة ان يكتشف اين الخلل في هذا الكود:

try {int	nbr=5;
do{
	t1=System.currentTimeMillis();//System.out.println("t1:"+t1);
	for ( int i=0; i<nbr;i++)
	sleep(3000);

	t2=System.currentTimeMillis();System.out.println("t2:"+t2);

	temps=t2-t1-3000*nbr;
	tempsm=temps/nbr;

System.out.println("load="+tempsm);

}while ( true);}catch(InterruptedException e) {};

انتظركم وشكرا

تم تعديل هذه المشاركة بواسطة مجدي محمود في 8 أغسطس 2006 في 02:58

كلما ادبني الدهر اراني نقص عقلي و كلما زادني علما اراني علما بجهلي

#2
temps=t2-t1-3000*nbr;

بسبب هذا ياتي رقم سالب لان t1,t2 بتكون بالميلي ثانية وكل 1000 ميلي ثانية حاول تعديلها الا اذا بالطباعة ما خرج رقم سالب يعني استخدم system.out.println ل temps

tempsm=temps/nbr;

كمان هون رح يكون الجواب INFINITY لان الحلقة تبدا من الصفر

لست متواجد بشكل يومي

#3

شكرا للاجابة و لكن لم افهم ما تقصده اظن ان هناك كلمات ناقصة

بتكون بالميلي ثانية وكل 1000 ميلي ثانية****** حاول تعديلها الا اذا بالطباعة ما خرج رقم سالب يعني استخدم

كلما ادبني الدهر اراني نقص عقلي و كلما زادني علما اراني علما بجهلي

#4

سلام

طرحت الموضوع في منتدى فرنكوفوني فقيل لي ان System.currentTimeMillis() ينتقصها الدقة و هي السبب في اتلنتائج السالبة فهل هذا صحيح

كلما ادبني الدهر اراني نقص عقلي و كلما زادني علما اراني علما بجهلي

#5

لم اجرب الكود ولكن اليك جوابي بالنظر الى الكود:

دائما الفرق بين t1 و t2 هو 3000 اللي موجودة في ال sleep .

وفي الكود انت تطرح t2-t1 اللي تساوي 3000 ، من 3000 * 5 (nbr).

اذا الناتج طبيعي راح يكون بالسالب.

واعتذر عن عدم تجربة الكود لاني على جهاز لايوجد به جافا.

اسف سوف اقطعك من كتابة الكود، ادخل هنا لدقيقتين فقط

http://www.shbab1.com/2minutes.htm

#6

السلام عليكم

اقتباس
تم تحرير المشاركة بواسطة مجدي محمود: أمس, 07:58 PM

لا أعلم هل الأخ مجدي عدل بالكود او لا

المهم

لنفرض ان قيمة ال t1 = 1000

t1=System.currentTimeMillis

	for ( int i=0; i<nbr;i++)
	sleep(3000);

المفروض ان الthread الحالي ان يتوقف

3000*5=15000

t2=System.currentTimeMillis

اذا تم تنفيذ عمليات الthread الحالي بدون تأخير فان

قيمة t2 يجب ان تكون t1+15000

اما اذا تاخر تنفيذ الthread الحالي فان t2 ستصبح

t1+15000 + الوقت الذي انتظره الthread

فقيمة الوقت المنتظر اذا نفذ الthread بدون تأخير تكون

t2-t1-3000*nbr	= 16000-1000-3000*5
16000-1000-3000*5 = 16000-1000-15000 = 0

اما في حالة تأخر

لنفرض ان تأخر 100 ms

t2-t1-3000*nbr	= 16100-1000-3000*5
16100-1000-3000*5 = 16100-1000-15000 = 100

فالجواب دائما اما صفر اذا تم تنفيذ ال thread بدون تأخير

اما اذا تأخر فان القيمه العائدة هي موجبة وتكون الوقت المنتظر بال بالميلي ثانيه

والله أعلم

اما انه يطلع الناتج بالسالب فالله اعلم

راجع الكود مزبوط ممكن كاتب t1-t2 بدل t2-t1

اقتباس
طرحت الموضوع في منتدى فرنكوفوني فقيل لي ان System.currentTimeMillis() ينتقصها الدقة و هي السبب في اتلنتائج السالبة فهل هذا صحيح

اخي الكريم القيمةالناتجة عن الcurrentTimeMillis تعتمد على نظام التشغيل

والله اعلم انها توخذ من

فهي تطرح التاريخ والوقت الحالي للجهاز من 1/1/1970 00:00:00 بتوقيت غرنتش بالثواني

طبعا ستضيف او تحذف الوفرق بين توقيتك وتوقيت غرنتش

ويضرب في 1000 ليكون الناتج بالميلي ثانية

فلا اعتقد ان الcurrentTimeMillis ينقصها الدقة الله اعلم طبعا

سبحانك اللهم وبحمدك أشهد ان لا اله الا أنت

أستغفرك وأتوب اليك

الهم صلي وسلم وبارك على سيدنا وحبيبنا محمد

#7

سلام

شكرا لتجاوبكم

الاخ فيصل : قد اجابك الاخ محب الرسول(ص)

الاخ محب الرسول(ص): الظاهر انه فعلا المشكلة في System.currentTimeMillis();

جرب الكود التالي تجد انه[ فعلا المشكلة تكمن في

[public test(){

long start = 0;

long stop = 0;

int correctMs = 0;

long maxValue = 0;

long minValue = -1;

long total = 0;

try{ for (int i = 0; i < 50; i++) {

start = System. nanoTime();

Thread.sleep(3000);

stop = System.nanoTime();

total = stop -start;

if (total == 3000) {

correctMs++;System.out.println("total : " + total);

} else {

if (total >3000) {maxValue++;System.out.println("total : " + total);}

else {minValue ++;System.out.println("total : " + total);}

}

}}catch(InterruptedException e) {};

System.out.println("Correct ms : " + correctMs);

System.out.println("min : " + minValue);

System.out.println("max : " + maxValue););}}

ه

انتظر نتائج تجربتك لانك انت الي فاهم الموضوع جيد

كلما ادبني الدهر اراني نقص عقلي و كلما زادني علما اراني علما بجهلي

#8

السلام عليكم

اخي الكريم حياك الله

بس لو طلب بسيط انه تشطب أخر جمله الله يبارك فيك

بالنسبه للمقارنه اللي واضعها عدم المؤاخذه فهي مش صحيحه لأنه كل 1 millisecond تساوي مليون nanosecond

1ms=1000000ns

فدايما را يكون الناتج اكبر من 3000 بكثير

وان شاء الله لما اروح عالمحل بتأكد اكثر من البرنامج

ماعندي وقت حاليا لأني لازم أجهز للشغل

ممكن تضع النتائج اللي بتطلع عندك لو سمحت

سبحانك اللهم وبحمدك أشهد ان لا اله الا أنت

أستغفرك وأتوب اليك

الهم صلي وسلم وبارك على سيدنا وحبيبنا محمد

#9

لاول نظرة على الكود اعتقدت انه الخطا هون في هذا السطر

 temps=t2-t1-3000*nbr;

ولكن

   for ( int i=0; i<nbr;i++)
	sleep(3000);

اين { } يعني بدايتها ونهايتها ضعها ثم اخبرنا بالنتيجة

في ردي الاول مبين انه كتبته وانا نايم :rolleyes:

عدلت المشاركة ولم اعدل الكود

لست متواجد بشكل يومي

#10

اليك هذه النتيجة بعد تركيز لاني استغربت كثير خاصة لان t2-t1 موجب

t2 رح تكون اكبر من t1 لذلك t2-t1 رح يكون موجب و لكن long مش مثل int يعني بهذا الامر

temps=t2-t1-3000*nbr;

معناه

long-long-int

ومن هنا تاتي الاجابة السالبة يعني لازم تعمل casting

temps=t2-(t1-(long)(3000*nbr));

وهذا البرنامج

public static void main(String[] args)throws InterruptedException {
		Thread thread = new Thread();
		thread.start();
		int nbr =5;
		long t1=System.currentTimeMillis();
		for ( int i=0; i<nbr;i++){

			thread.sleep(3000); 
			long t2=System.currentTimeMillis();
			System.out.println("t1:"+t1);
			System.out.println("t2:"+t2);
			System.out.println("t2-t1:"+(t2-t1));
			long temps=t2-(t1-(long)(3000*nbr));
			long tempsm=temps/nbr;
			System.out.println("temps="+temps);
			System.out.println("tempsm="+tempsm);
		}
	}

وهذه النتائج

t1:1155236761323
t2:1155236764327
t2-t1:3004
temps=18004
tempsm=3600
t1:1155236761323
t2:1155236767332
t2-t1:6009
temps=21009
tempsm=4201
t1:1155236761323
t2:1155236770336
t2-t1:9013
temps=24013
tempsm=4802
t1:1155236761323
t2:1155236773330
t2-t1:12007
temps=27007
tempsm=5401
t1:1155236761323
t2:1155236776334
t2-t1:15011
temps=30011
tempsm=6002

تم تعديل هذه المشاركة بواسطة مجدي محمود في 10 أغسطس 2006 في 22:19

لست متواجد بشكل يومي

#11

شكرا للاخوة رايحة اجرب الكود وارد الخبر انتظروني

كلما ادبني الدهر اراني نقص عقلي و كلما زادني علما اراني علما بجهلي

#12

سلام

الاخ محب الرسول و مجدي الكود التالي مفيهش علاقة مع intو من بين 50 حلقة و جدت انه

34 حلقة تجد انه t2>t1+3000

16حلقة تجد انه t2<t1+3000

0 حلقة t2=t1+3000

هذا يعني انه يا اخ مجدي انه مفيهش علاقة مع نوع المتغير

اما بالنسبة للحاضنتين {}} ان لم تجدهما معناه انه الحلقة فيها تعليمة واحدة و هيsleep (3000);

الاخ محب رسول الله صحيح انا كنت اجرب في النانو سكوند و لم انتبه استبدلها currentTimeMillis();

public test(){
long start = 0;
long stop = 0;
int correctMs = 0;
long maxValue = 0;
long minValue = 0;
long total = 0;
try{ for (int i = 0; i < 50; i++) {
  start = System. currentTimeMillis();
 Thread.sleep(3000);
  stop = System. currentTimeMillis();
  total = stop -start;
  if (total == 3000) {
	correctMs++;System.out.println("total : " + total);
  } else {
	if (total >3000) {maxValue++;System.out.println("total : " + total);}
  else  {minValue ++;System.out.println("total : " + total);}
  }

}}catch(InterruptedException e) {};
System.out.println("Correct ms : " + correctMs);
System.out.println("min : " + minValue);
System.out.println("max : " + maxValue);System.out.println("total : " + total);}}

فما هو تفسيرك الان يا مجدي :wacko:

تم تعديل هذه المشاركة بواسطة مجدي محمود في 11 أغسطس 2006 في 12:11

كلما ادبني الدهر اراني نقص عقلي و كلما زادني علما اراني علما بجهلي

#13

السلام عليكم

حياك الله مجدي كيف الحال

اذا لم تضع {} بعد ال for فسيتم تتفيذ اول جملة فقط

for ( int i=0; i<nbr;i++)
	sleep(3000);

نفس الجملة التاليه

for ( int i=0; i<nbr;i++)
{sleep(3000);}

وتقربا نفس

Thread.sleep(15000);

ولكن باختلاف شوية نانو سكندات :P

والله اعلم

اقتباس
long-long-int

ومن هنا تاتي الاجابة السالبة يعني لازم تعمل casting

الانواع ما الها علاقة

اخوي elalia

ههذه هي النتائج

Correct ms : 50
min : 0
max : 0
total : 3000


Correct ms : 47
min : 0
max : 3
total : 3000


Correct ms : 50
min : 0
max : 0
total : 3000

Correct ms : 47
min : 0
max : 3
total : 3000

مجرد سؤال شو نظام التشغيل الي انت شغال عليه والمعالج

تم تعديل هذه المشاركة بواسطة Mo7eb_Alrasool في 11 أغسطس 2006 في 02:35

سبحانك اللهم وبحمدك أشهد ان لا اله الا أنت

أستغفرك وأتوب اليك

الهم صلي وسلم وبارك على سيدنا وحبيبنا محمد

#14

انا اشتغل على الملنيوم و win2000prof على بنتيوم 3

كلما ادبني الدهر اراني نقص عقلي و كلما زادني علما اراني علما بجهلي

#15

لكن يا اخ محب رسول الله في هذه الحالة مش رايح يكون عندك وقت انتظار

كلما ادبني الدهر اراني نقص عقلي و كلما زادني علما اراني علما بجهلي

#16

الانواع لها علاقة في العمليات الحسابية انا جربت الكود وفي فرق بزيد وبنقص نظرت الى javadoc ووجدت التالي

See the description of the class Date for
 a discussion of slight discrepancies that may arise between
 "computer time" and coordinated universal time (UTC).

انا بستخدم windows xp --Timezone--Berlin

الكلاس Date وجدت فيها التالي

Some computer standards are defined in terms of Greenwich mean time (GMT), which is equivalent to universal time (UT). GMT is the 
"civil" name for the standard; UT is the 
"scientific" name for the same standard. 
The distinction between UTC and UT is that UTC is based on an atomic clock and UT is based on astronomical observations, which for all practical purposes is an invisibly fine hair to split. Because the earth's rotation is not uniform (it slows down and speeds up in complicated ways), UT does not always flow uniformly. Leap seconds are introduced as needed into UTC so as to keep UTC within 0.9 seconds of UT1, which is a version of UT with certain corrections applied. There are other time and date systems as well; for example, the time scale used by the satellite-based global positioning system (GPS) is synchronized to UTC but is not adjusted for leap seconds. An interesting source of further information is the U.S. Naval Observatory, particularly the Directorate of Time at: 
	 http://tycho.usno.navy.mil


and their definitions of "Systems of Time" at: 
	 http://tycho.usno.navy.mil/systime.html

عدل الكود باستخدام الكلاس Date

 int start = 0;
		int stop = 0;
		int total = 0;


			for (int i = 0; i < 5; i++) {
				start = new Date().getSeconds();
				Thread.sleep(3000);
				stop = new Date().getSeconds();
				total = stop -start;			 
				System.out.println("start : " + start);
				System.out.println("stop : " + stop);
				System.out.println("total : " + total);

هذه النتائج

start : 5
stop : 8
total : 3
start : 8
stop : 11
total : 3
start : 11
stop : 14
total : 3
start : 14
stop : 17
total : 3
start : 17
stop : 20
total : 3

اقتباس
كن يا اخ محب رسول الله في هذه الحالة مش رايح يكون عندك وقت انتظار

الثلاث ثواني هي وقت الانتظار انت نسيت الكود تاعك لانها start لها قيمة واحدة و stop بتزيد وهذا الكود الي في البداية مع التعديل

	public static void main(String[] args) throws InterruptedException{

		int start =new Date().getSeconds();
		int total =0;
		int nbr =5;
		int stop =0;
		long tempsm=0,temps=0;
		for ( int i=0; i<nbr;i++){

			Thread.sleep(3000);
			stop=new Date().getSeconds();
			temps=stop-(start-3*nbr);
			tempsm=temps/nbr;
			System.out.println("start :"+start);
			System.out.println("stop:"+stop);
			System.out.println("temps="+temps);
			System.out.println("tempsm="+tempsm);


		}
	}
	public static long ChangeToMillis(int seconds){
		return seconds*1000;
	}

النتائج

start :21
stop:24
temps=18
tempsm=3
start :21
stop:27
temps=21
tempsm=4
start :21
stop:30
temps=24
tempsm=4
start :21
stop:33
temps=27
tempsm=5
start :21
stop:36
temps=30
tempsm=6

لست متواجد بشكل يومي

#17

السلام عليكم

كيف حالكو ان شاء الله تكونوا بخير

اخوي مجدي انا راح احكيلك شو المشكلة اللي عند اخونا elalia

1 + 3 = 4 right
 but he got
 1 + 3 = 3.7  ??

هاي المشكلة انه كيف طلع الناتج هيك مش منطقي

اما نالنسبه للانواع انا اقصد ال long and integer

انا جربت الكود على جهاز ثالث وصحيح كان يعطيني قيم اقل من 3000 وكل ما سويت ثريد جديد بتزيد نسبة

الأقل من 3000

بس المشكلة مش بالجافا

نفس القيم كانت تظهرلي لما استخدمت لغات برمجه ثانية وكنت استخدم الدوال

 sleep
 getTickCount

اللي موجودات في ال kernel32.dll

اللي حصل

srart=System.currentTimeMillis()

لنفرض انها اعادت قيمة 1000

فلو كانت start = 1000

نفذنا

sleep(3000)
stop=System.currentTimeMillis()

يجت ان تكون قيمه stop 1000+3000 او اكتر بقليل

stop-start= 3000 or 3000>+

ولكن المشكله انه كان الناتج اقل من 3000

ممكن يكون غلط من ال currentTimeMillis؟؟ استبعد ذلك

ممكن يكون غلط من ال sleep؟؟ استبعد ذلك ايضا

راح اضع بعض التساؤلات ممكن توصانا لنتيجه

لنرجع للمثال السابق

srart=System.currentTimeMillis()

start=1000

ولكن في الواقع هذه القيمه ليست دقيقه بالنسبه لل nanosecound

اكرر ليست دقيقة بالنسبه لل النانو ثانيه التي تساوي 1/1000000 من الميلي ثابيه

والعمليات تنفذ باقل من ملي ثانية

**********

في اشي انا مش متأكد منه انه لمل يكون مثل

currentTimeMillis = 1000.550000

ال.550000 اقصد نها النانو ثانيه

كيف يتعامل معها هل يرجع 1000 او يقربها لاقرب عدد صحيح ال 1001

ارجو ان تكونو فهمتو قصدي

لاني في الشرح ما شاء الله صفر

*********

1000.550000=10000  // i think this one [maybe]
or
1000.550000=10001

واشي ثاني برضو

ال sleep ميثود هل تستجدم الميلي ثانيه في حساب الوقت ام تستجدم النانو ثانيه؟

مثال توضيحي

public static void sleep_mills(long millsecound)
  {if(millsecound<=0)return;
   long currmills=System.currentTimeMillis();
   while(System.currentTimeMillis()<currmills+millsecound){}
  }

public static void sleep_nanos(long millsecound)
  {if(millsecound<=0)return;
   millsecound*=1000000;
   long currnanos=System.nanoTime();
   while(System.nanoTime()<currnanos+millsecound){}
  }

ارجو انه تجربوا ونشوف نتائج التجربة

يعني احسب النانو ثانيه قبل ال sleep وبعدها

وقارن النتائج

وانا راح اجرب بس مش هسا لانه طلعت روحي من العربي

ولسا ماخلصت حكي بس خلص زهقت من الكتابة بالعربي

اخر شيئ حاول تربط السؤالين اللي طرحتهم

وحط جميع الاحتمالات ولا تنسى النانو ثانية وطريقة ال sleep ممكن تصل لنتيجة بإذن الله

والي عودة و ان شاء الله اشوف اللي وصلتولو

جرب هالبرامج وراح تشوف انه نفس النتائج اللي باجافا

// c++ code
#include <stdio.h>
#include <windows.h>
int main()
{
	long start,end;
	int correctMs = 0;
	long maxValue = 0;
	long minValue = 0;
 long total=0;

	for (int i = 0; i < 50; i++) 
 {
  start = GetTickCount();
	 Sleep(3000);
	 end = GetTickCount();
  total=end-start;
	 if (total==3000)correctMs++;
  else if(total>3000)maxValue++;
  else if(total<3000)minValue++;

  //printf("Start = %d\n",start);
  //printf("End   = %d\n",end);
  printf("Total = %d\n",total);
 }
  printf("correct Ms = %d\n",correctMs);
  printf("maxValue   = %d\n",maxValue);
  printf("minValue   = %d\n",minValue);

  return 0;
}

' VB Code
Private Declare Function GetTickCount Lib "kernel32" () As Long
Private Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)
Sub doSleep()
	Dim nStart&, nEnd&, Total&
	Dim correctMs%, maxValue%, minValue%
	For i = 1 To 5
	  nStart = GetTickCount
	  Sleep 3000
	  nEnd = GetTickCount
	  Total = nEnd - nStart
	  Select Case Total
		 Case 3000: correctMs = correctMs + 1
		 Case Is > 3000: maxValue = maxValue + 1
		 Case Is < 3000: minValue = minValue + 1
	  End Select
	  Debug.Print "Total : "; Total
	  DoEvents
	Next
	Debug.Print "correctMs : "; correctMs
	Debug.Print "maxValue  : "; maxValue
	Debug.Print "minValue  : "; minValue
End Sub

تم تعديل هذه المشاركة بواسطة Mo7eb_Alrasool في 12 أغسطس 2006 في 03:24

سبحانك اللهم وبحمدك أشهد ان لا اله الا أنت

أستغفرك وأتوب اليك

الهم صلي وسلم وبارك على سيدنا وحبيبنا محمد

#18

الاخ مجدي الظاهر انك مش مركز معانا في الموضوع من فضلك انا بحاجة الى اجابة لاني فعلا يجب ان اجد اجابة والا يجب ....

الاخ محب رسول الله انا لا اظن المشكل فيsleep الفارق مش 1 ا2 ميلي ثانية بل هو 20 الى 30 ميلي ثانية .

مش عارفة مشكلتك مع العربية او مع العرب على العموم اكتب باللغة اللي انت تحسها اكثر عملية و انا الحمد لله افهم عربي/ فرنسي/ انجليزي و ان كنت تفهم الفرنسي اعطيلك عنوان موقع المنتدى الفروكوفوني الي ناقشت معلهم الموضوع وانهيناه على ان المشكل يكمن في الدالة.

كلما ادبني الدهر اراني نقص عقلي و كلما زادني علما اراني علما بجهلي

#19

السلام عليكم

اقتباس
الظاهر انك مش مركز معانا في الموضوع
اخي الكريم عدم فهم المقصود بيحدث دائما

انا بصير معي كثير من المرات بفهم السؤال غلط

اقتباس
مش عارفة مشكلتك مع العربية او مع العرب
مشكلتي مع الكتابة بالعربي على الكمبيوتر

totla = 2970

هل طلع الناتج هيك معك

هل جربت sleep_mills و sleep_nanos

وحسبت الفرق بناتهم بلملي ثانية وبالنانو

عشان تشوف اذا كان الغلط من currentTimeMillis او من sleep

او انه كانت المشكله الفرق بين وحدات الحساب

المشكلة ان الكمبيوتر تاعي بعطيني 3000 او اكثر

اقتباس
فعلا يجب ان اجد اجابة والا يجب ....
مجرد سؤال هل هذا سؤال عندكو في الكلية

او وانت بتجرب طلعت معك هذه المشكلة

تم تعديل هذه المشاركة بواسطة Mo7eb_Alrasool في 12 أغسطس 2006 في 20:39

سبحانك اللهم وبحمدك أشهد ان لا اله الا أنت

أستغفرك وأتوب اليك

الهم صلي وسلم وبارك على سيدنا وحبيبنا محمد

#20

سلام

تقريبا وجدت السبب بتجريب الكود السفلي وجدت انه الدالة المتعبة currentTimeMillis() لا تنتقل من وقت لآخر ب 1 ميلي ثانية فمثلا في الميلينيوم تنتقل ب 50 ثانية و في وينداوز 2000 تنتقل ب 10 ثواني و لهذا السبب يكون الوقت ناقص ب 20 الى 30 ميلي ثانية

و لكن مازال البحث عن الحل لهذا الكود ليحسب وقت الانتظار الصحيح .ساعدوني ارجوكم .اما عن فضولية الاخ محب الرسول فلا باس فانا احضر لرسالة الماجستير وتعتمد على هذا الكود agent approach for load balancing in heterogenious network.

على فكرة انا لست ادري ان كان اسم العلياء اسم ولد عندكم.

public class test1{

public static void main (String [] args) throws InterruptedException{

// JIT/hotspot warmup:

long time = System.currentTimeMillis (), time_prev = time;

for (int i = 0; i < 10; ++ i)

{

// Busy wait until system time changes:

while (time == time_prev)

time = System.currentTimeMillis ();

System.out.println ("delta = " + (time - time_prev) + " ms");

time_prev = time;

}

}}

كلما ادبني الدهر اراني نقص عقلي و كلما زادني علما اراني علما بجهلي

#21

ولكن عند تجريب الكود بالنانوثانية وجدت انه تنتقل باجزاء من الميليسكند :

ublic static void main (String [] args) throws InterruptedException{

// JIT/hotspot warmup:

long time = System.nanoTime(), time_prev = time;

for (int i = 0; i < 10; ++ i)

{

// Busy wait until system time changes:

while (time == time_prev)

time = System.nanoTime ();

System.out.println ("delta = " + (time - time_prev)/1000000+ " ms");

time_prev = time;

}

}}

ووقت لانتظار يكون 0 في الملنيوم و 3 في الونداوز 2000

كلما ادبني الدهر اراني نقص عقلي و كلما زادني علما اراني علما بجهلي

#22

السلام عليكم

اقتباس
على فكرة انا لست ادري ان كان اسم العلياء اسم ولد عندكم
اهلا وسهلا اختي الكريمة اسف لم انتبه الى الاسم جيدا

العلياء = elalia

كنت افكره اليليا او اشي زي هيك

اسف على التاخير انشغلت شوية

اقتباس
فانا احضر لرسالة الماجستير
بالتوفيق ان شاء الله

الملينيوم والوندوز 20000 موجودين علي نفس الجهاز ولا كل واحد على جهاز

والله اعلم اظن ان التايمر يؤخذ من المعالج

على اية حال اذا كان هناك خلل في قيمة ال currentTimeMillis

شو الي بضمن انه ال sleep ميثود دقيقة او ال nanoTime

طبعا مجرد سؤال انا ما عندي خبرة بالمعالجات او التوقيت . اول مرة بتعامل مع التوقيت بهذه الطريقة

sleep_nanos او ال Thread.sleep اي وحدة ادق

على فرض انه النانو دقيق او غير دقيق

جربي استخدام الperformance وشوفي شو النتيجه

ان شاء الله يزبط معك

اقتباس
System.out.println ("delta = " + (time - time_prev)/1000000+ " ms");

لازم تضعي (double)

طلب بسيط لما تضعي كود ضعيه بين

[ code][ /code]

class test1
{ 
public static void main(String[] args)throws Exception 
{ 
	long start = 0; 
	long stop = 0; 
	int correctMs = 0; 
	long maxValue = 0; 
	long minValue = 0; 
	double total = 0; 
	boolean use_thread=true;
	for (int i = 0; i < 50; i++) { 
	  start = System.nanoTime();
	  if(use_thread)
		 Thread.sleep(3000);
	  else 
	  {sleep_nanos(3000);
	   //stop=sleep_with_return(3000,start);
	  }
	  stop = System.nanoTime();
	  total = (stop -start)/1000000; 
	  if	 (total == 3000){correctMs++;} 
	  else if(total >3000){maxValue++;} 
	  else   {minValue ++;} 
	  System.out.println((use_thread?"thread ":"nanos  ")+"total : " + total); 
	  use_thread=!use_thread;
	} 

	System.out.println("Correct ms : " + correctMs); 
	System.out.println("min : " + minValue); 
	System.out.println("max : " + maxValue); 
	System.out.println("total : " + total); 
} 

public static void sleep_nanos(long millsecound)
  {if(millsecound<=0)return;
   millsecound*=1000000;
   long currnanos=System.nanoTime();
   while(System.nanoTime()<currnanos+millsecound){}
  }

/**
 * prevnano : send the nanoTime you had
 *   so it will avoid counting extra nanosecounds
 *   like {if(millsecound<=0)return prevnano;
 *		 millsecound*=1000000;}
 *   and also its will return the exact stop time
 *   use:
 *   start=System.nanoTime
 *   stop=sleep_with_return(3000,start)
 */
  public static long sleep_with_return(long millsecound,long prevnano)
  {if(millsecound<=0)return prevnano;
   millsecound*=1000000;
   long currnanos=prevnano;
   long retValue=0;
   while((retValue=System.nanoTime())<currnanos+millsecound){}
   return retValue;
  }

}

 
public class performance {
	public static void main(String[] args)throws Exception 
	{
	 sun.misc.Perf objPerf=sun.misc.Perf.getPerf();
	 long frequency,start,stop;
	 frequency = objPerf.highResFrequency();
	 for(int i=0;i<10;i++)
		{
		 start = objPerf.highResCounter() * 1000 / frequency;
		 Thread.sleep(3000);
		 stop = objPerf.highResCounter() * 1000 / frequency;
		 System.out.println(stop-start);
		}
	}   
}

public class test{
public static void main (String [] args) throws InterruptedException{
// JIT/hotspot warmup: 
double aver_step=nano_step_aver();
java.text.DecimalFormat decFormater=new java.text.DecimalFormat("#.########");
for (int i = 0; i < 10; ++i) 
{ 
   // Busy wait until system time changes:
	long time = System.nanoTime(), time_prev = time; 
	while((time=System.nanoTime()) == time_prev){}
	double delta=((double)(time - time_prev)/1000000);
	delta=delta>aver_step?delta-aver_step:delta;
	String del=decFormater.format(delta);
	del+="   :   " +((double)(time - time_prev)/1000000);
	System.out.println ("delta = " + del + " ms"); 

} 
}
static double  nano_step_aver()
{
	System.nanoTime ();System.nanoTime ();
	System.nanoTime ();System.nanoTime ();
	double aver=0;
	//long prv=System.nanoTime ();
	for(int av=0;av<100;av++)
		{aver-=System.nanoTime()-System.nanoTime ();
		 //aver+=System.nanoTime()-prv;prv= System.nanoTime ();
		}
	aver=(aver/100)/1000000;
	System.out.println(aver);
	return aver;
}
}

تم تعديل هذه المشاركة بواسطة Mo7eb_Alrasool في 14 أغسطس 2006 في 02:03

سبحانك اللهم وبحمدك أشهد ان لا اله الا أنت

أستغفرك وأتوب اليك

الهم صلي وسلم وبارك على سيدنا وحبيبنا محمد

#23

سلام شكرا لك.

الملنيوم و الونداز2000 على نفس الجهاز و انا الان اجرب الكود نتاعك على جهاز اخر على الاكس بي و هذي هي النتائج

على فكرة ما دور Performance

resultat.zip

كلما ادبني الدهر اراني نقص عقلي و كلما زادني علما اراني علما بجهلي

#24

سلام اخي محب الرسول

اليك النتائج الان على نظامي الملنيوم و 2000 تقريبا نفس النتائج فبالفعل المشكل يكمن فيهما للاثنان

سؤال اخر هل لديك فكرة عن الوقت الذي خصصه الونداوز للاجراءات

اليك هته المعلومة بخصوص الدالة المتعبة التي وجدتها اثناء بحثي في النات

What resolution can I expect from System.currentTimeMillis()?

The following table is based on measurements by YIP Chi Lap [beta] (raw data):

operating system timer resolution

Linux (2.2, x86) 1 ms

Mac OS X 1 ms

Windows 2000 10 ms

Windows 98 60 ms

Solaris (2.8, i386) 1 ms

Solaris (2.7, sun4u) 1 ms

(

New_Folder.rar

كلما ادبني الدهر اراني نقص عقلي و كلما زادني علما اراني علما بجهلي

#25

السلام عليكم

اقتباس
بخصوص الدالة المتعبة
فعلا متعبة

بس الظاهر انه متعبة في الوندز بس

اعتمادا على الجدول

في منتدى لليونكس و لينكس شو رأيك وضع الكود عندهم للتأكد من القيم في اللينكس

لأني جربت دالات كثيرة في الوندوز وكلها مش دقيقة

في لجدول Windows 2000 10 ms

في ال xp عندي 15 او 16 وبعض الاحيان 31 :blink:

بالنسبة لل Thread.sleep sleep_nanos

شو رايك اية وحدة فيهم الصح? ولا الثنتين غلط?خليها تكمل :D

اقتباس
سؤال اخر هل لديك فكرة عن الوقت الذي خصصه الونداوز للاجراءات

ما عندي علم والله

اقتباس
على فكرة ما دور Performance

public class performance {
	static sun.misc.Perf perf=sun.misc.Perf.getPerf();
	static double frequency = perf.highResFrequency();
	public static void main(String[] args)throws Exception 
	{  printTicks(1);
		System.out.println("\n---\n");  
		printTicks(3000);
	}

	static void printTicks(long millis)throws Exception 
	{
	 double start=0,stop=0;
	 double nstart=0,nstop=0;
	 for(int i=0;i<10;i++)
		{
		 start = perf.highResCounter() * 1000 / frequency;
		 nstart= System.nanoTime();

		 Thread.sleep(millis);

		 stop = perf.highResCounter() * 1000 / frequency;
		 nstop= System.nanoTime();  

		 System.out.println(stop-start);
		 System.out.println((nstop-nstart)/1000000);
		 System.out.println("");  
	 }
	}
}

سبحانك اللهم وبحمدك أشهد ان لا اله الا أنت

أستغفرك وأتوب اليك

الهم صلي وسلم وبارك على سيدنا وحبيبنا محمد

هذا الموضوع مغلق.

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