PDA

View Full Version : سوال: تست سرعت اجرای برنامه



N30TheM4TRIX
پنج شنبه 01 تیر 1391, 10:50 صبح
سلام
من این کدو برای تست سرعت برنامه نوشتم اما در هر بار اجرا یک مقدار برمیگردونه البته در چندبار اجرا تکرای هم میشه
م یخواستم بدونم روشم اشتباهه یا مقدار بازگشتیش بستگی به چیز دیگه ای داره
unit Unit1;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;

type
TForm1 = class(TForm)
Button1: TButton;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
var
t0,t1 :Double;
i,j:Integer;

o:array[0..100000]of Double ;
x:array[0..10000]of Double ;
begin
t0:=GetTickCount;

for i := 0 to 100000 do begin
x[i]:=i*8 div 10+8000-7*2;
Application.ProcessMessages;
for j := 0 to 10000 do o[j]:=i*8 div 10+8000-7*2;
end;

t1:=GetTickCount-t0;
Caption:=FloatToStr(t1 / 1000) ;
end;

end.

Ananas
پنج شنبه 01 تیر 1391, 14:27 عصر
سلام.
چرا باید مقادیر متفاوتی برگردونه؟ هر دفعه داره همون کار رو انجام میده، پس انتظلر میره زمان اجرای کار هم یک مقدار باشه. "زمان پایان کار منهای زمان شروع کار" زمان اجرای کار هست که تغییر نمیکنه مگر اینکه کار رو تغییر بدید مثلا حلقه رو طولانی تر و یا کوتاه تر کنید.

Felony
پنج شنبه 01 تیر 1391, 14:52 عصر
بله زمان متفاوتی بر میگردونه ، شما دارید تو User Mode کد میزنید و وظیفه مدیریت منابع با هسته سیستم عامل هست ، ممکنه بار اولی که برنامه رو اجرا میکنید منابع کمتری توسط برنامه های دیگه یا Servive های ویندوز در حال مصرف باشند یا اینکه پروسه های در حال اجرا درخواست خواصی از سیستم عامل نداشته باشند و سیستم عامل به راحتی به درخواست های برنامه شما رسیدگی کنه و حتی Slice های زمانی بیشتری بهش اختصاص بده تا کارش رو زودتر راه بندازه ، در بار بعد که زمان طولانی تر میشه ممکنه پردازنده در حال سرویس دهی به پروسه ها و سرویس های دیگه هم باشه که شما ازش خبر ندارید .

در هر صورت این تفاوت زمان زیاد محسوس نیست مگیر اینکه پروسه ای سنگین در حال اجرا باشه ، مثلا بار اول که برنامه رو اجرا میکنید هیچ برنامه دیگه ای در حال کار نیست ولی بار دوم مثلا 3dMax داره یک فریم رو رندر میکنه !

در ضمن ممکنه اون Application.ProcessMessages هم خرابکاری هایی بکنه ، قبلا چندین بار گفتم نباید این متد رو بی مهابا هرجایی صدا زد ، الان تو کد شما همین متد میتونه دلیل اصلی تفاوت زمانی باشه ، ممکنه بار اول که مدت کمتری طول میکشه تا دستورات اجرا بشن 300 تا پیغام تو Message Queue برنامه باشه ولی بار بعدی که اجرای دستورات طول میکشه 3000 تا پیغام تو Message Queue باشه و برنامه مجبوره همرو پردازش کنه تا به پایان کارش برسه .

مصطفی ساتکی
جمعه 02 تیر 1391, 10:10 صبح
در مورد شما بایستی از توابع high resolution استفاده نماید


var Frequency ,StartC ,EndC ,DiffC :TLargeInteger;
ms : LongWord;
begin
QueryPerformanceFrequency(Frequency);
QueryPerformanceCounter(StartC);

//your code here
Sleep(1200);

QueryPerformanceCounter(EndC);
DiffC := ((EndC - StartC) * 1000) div Frequency;



ms := (DiffC and $ffffffff);
Caption := format( 'It took %u ms\n', [ms]);
end;

BORHAN TEC
جمعه 02 تیر 1391, 10:53 صبح
دوستان عزیز در حالت کلی از توابعی مثل GetTickCount فقط برای موارد ابتدایی استفاده می شود. اگر برنامه شما کمی بزرگ باشد باید از ابزارهایی که مخصوص این کار هستند استفاده کنید. یکی از این ابزارها AQTime است که نسخه Standard آن به همراه دلفی وجود دارد که برای کسب اطلاعات بیشتر می توانید به آدرس زیر مراجعه کنید:
http://smartbear.com

بهروز عباسی
جمعه 02 تیر 1391, 22:29 عصر
درود به همه
شرمنده شاید سوال بی ربط باشه اما

در ضمن ممکنه اون Application.ProcessMessages هم خرابکاری هایی بکنه
به جای این چه کار کنیم آیا باید از ترد ها استفاده کنیم؟

Felony
شنبه 03 تیر 1391, 06:07 صبح
به جای این چه کار کنیم آیا باید از ترد ها استفاده کنیم؟
بله ، چندین بار تو همین بخش در مورد متد ProcessMessages نکاتی رو گفتم .