Jak zrobić (czy jest to w ogóle możliwe) opóźnienie mniejsze niż 1 ms ?
Może jest możliwe,ale to chyba już w assemblerze trzeba by robić wstawki...
mozna, bylo juz i bez asm sie spokojnie obchodzi
Znalazłem na forum wstawki z asemblera, ale bez asemblera nie ma nic. Może jest jakaś inna komenda <ort>oprucz </ort>sleep(1).
Może wie ktoś jaki jest czas wykonania jednej operacji przez program ?
albo np. ile czasu będzie wykonywała się taka pętla
suma:=0;
for i:=0 to 9 do
suma:=suma+1;
W FAQ szukaj, są dwa fajne sposoby.
Sleep(1 div 2)
Sleep(1 div 10)
...itd
// [rotfl] [rotfl] [rotfl] - Ł
procedure wait(opoznienie: real);
var
Frequency, C1, C2, Dfr: Int64;
czas: extended;
begin
QueryPerformanceFrequency(Frequency);
QueryPerformanceCounter(C1);
repeat
QueryPerformanceCounter(C2);
Dfr:=C2-C1;
czas:= dfr/Frequency;
until czas > opoznienie;
opoznienie(0.0001); daje opoznienie 0,1ms
Opi napisał(a)
Sleep(1 div 2)
Sleep(1 div 10)
// [rotfl] [rotfl] [rotfl] - Ł
Właśnie o to mi chodziło. Wielkie dzięki !!!
Liu_Kang napisał(a)
albo np. ile czasu będzie wykonywała się taka pętla
suma:=0;
for i:=0 to 9 do
suma:=suma+1;
[rotfl] [rotfl] [rotfl] [rotfl] [rotfl] [rotfl]
oj no to predkosc bedzie bardzo zroznicowana
Liu_Kang napisał(a)
Opi napisał(a)
Sleep(1 div 2)
Sleep(1 div 10)
// [rotfl] [rotfl] [rotfl] - Ł
Właśnie o to mi chodziło. Wielkie dzięki !!!
se jaja koles robisz?? 1 div 2 = 1 div 10 = 0 bo ani 2 ani 10 nie miesci sie w 1 ani razu
Liu_Kang napisał(a)
np. ile czasu będzie wykonywała się taka pętla
suma:=0;
for i:=0 to 9 do
suma:=suma+1;
Najszybciej to będzie suma := 10 ;P
Ładny hardkor :D :D :D :D :D :D :D :D :D :D
Liu_Kang i Opi ROOOOX [rotfl] [rotfl]
Sądziłem że to może pomóc.... kiedyś widziałem taką odpowiedź, więc teraz sam się podzieliłem tym co widziałem ;)
Trudno, mój błąd... [sciana]
// po to masz głowę, żeby nie podchodzić bezkrytycznie do cudzych głupot. poza tym pokaż wątek z taka odpowiedzią, to go zaraz wyczyszczę - Ł
// nie pamiętam i też nie znalazłem... - Opi
W asemblerze na cyklach procesora:
mov cx, 3 {Ilość cykli procesora bez 1}
rep mov ax, 1 {Wykonujemy cx razy instrukcję mov ax, 1 która zajmuje 1 cykl procesora}
Możemy sobie napisać procedurę:
procedure pcDelay(cykle: Word);
begin
asm
mov ax, cykle { Załaduj liczbę cykli do rejestru AX }
sub ax, 3 { Odejmij od AX 3 (bo 3 operacje - 3 cykle są wykonywane }
{ przed właściwym delayem }
mov cx, ax { Załaduj AX do CX (CX jest licznikiem) }
rep mov ax, 1 { Powtórz CX razy instrukcję zajmującą 1 cykl procesora }
{ czyli instrukcję mov ax, 1 }
end;
end;
// krócej będzie mov cx,cykle / @@1: loop @@1 - Ł
adiblol napisał(a)
[...]
Nie badz taki dokladny, a call, a ret, a wrzucenie parametrow na stos/rejestrow (delphi domyslnie w rejestrach przekazuje)?
Wolverine napisał(a)
adiblol napisał(a)
[...]
Nie badz taki dokladny, a call, a ret, a wrzucenie parametrow na stos/rejestrow (delphi domyslnie w rejestrach przekazuje)?
Przepraszam, wiem tylko jak w Pascalu ASM działa. Myślałem, że w Delphi też tak samo z tą samą prostotą. Ale jeśli chcesz sprawić przyjemność Liu_Kangowi, to możesz policzyć ile cykli zajmują te dodatkowe operacje ;).
CyberKid napisał(a)
se jaja koles robisz?? 1 div 2 = 1 div 10 = 0 bo ani 2 ani 10 nie miesci sie w 1 ani razu
</quote></quote>
Nie wiem czy jaj se robie, czy ktoś inny, ale u mnie sleep (1 div 2) działa. Nie wiem dlaczego ale działa [green] .
berl napisał(a)
W FAQ szukaj, są dwa fajne sposoby.
Poszukałem i znalazłem kilka programików, które zmodyfikowałem do moich potrzeb i otrzymałem program który liczy czas wykonywania pętli. Okazuje się, że na procesorze P4 3,2GHz czas wykonywania jednego taktu (bez żadnych opóźnień) wynosi 370 - 400 ns. Myślę, że to jest najkrótrzy do osiągnięcia czas przy tej częstotliwości procesora. (jak do moich potrzeb za krótki)
Po wstawieniu opóźnienia sleep(1) czas wykonania petli wynosi od 1,1 ms do 9 ms w zależności od obciążenia proca. (jak do moich potrzeb za długi)
W momencie gdy wstawiam sleep(1 div 2) czas wykonania petli wynosi od 1,1 us do 3,5 us, a jak dla mnie ten czas jest w pełni satysfakcjonujący. Przy sleep(1 div 10) miałem podobne rezultaty, co przy div 2 (około 2us), tak samo zresztą się działo przy div 3, div 4 itd. Także Opi ma rację, może nie do końca ale jest ok.
Jeżeli ktoś nie wierzy, to tu jest programik którym testowałem opóźnienia.
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;
type
TForm1 = class(TForm)
Label1: TLabel;
Button1: TButton;
Label2: TLabel;
Label3: TLabel;
procedure Button1Click(Sender: TObject);
procedure FormCreate(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
Freq, TimeStart, TimeEnd : Int64;
i, a, suma: integer;
implementation
{$R *.dfm}
procedure TForm1.Button1Click(Sender: TObject);
begin
//pobranie częstotliwości zegara
//sprawdzenie czy jest on dostepny (wynik funkcji musi być=True)
if QueryPerformanceFrequency(Freq) then
begin
QueryPerformanceCounter(TimeStart); //start testowania
for i:=1 to 1 do
begin
//sleep(1);
// sleep(1 div 2);
end;
QueryPerformanceCounter(TimeEnd); //koniec testowania
a:=(TimeEnd-TimeStart);
end;
Label2.Caption:='Częstotliwosc procesora '+
FloatToStr(Freq/1000000000)+' GHz';
Label3.Caption := 'Czas wykonania pętli '+
FloatToStr(a/Freq*1000000)+' us';
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
Label1.Caption := 'Program pokazuje częstotliwosc procesora i czas wykonania pętli';
end;
end.
sleep(1) to chyba wiadomo, a pozostałe przypadki to po prostu sleep(0), które też zajmuje pewien czas (trzeba funkcję wywołać i wykonać). 1 div 2 = 1 div 10 = 1 div cokolwiek większe od jedynki = 0. tak więc nie chrzanić mi tu, że 1 div 2 da większe opóźnienie niż 1 div 10, bo bany rozdam. [diabel]
tak poza tym http://www.google.com/url?sa=U&start=6&q=http://www.mkssoftware.com/docs/man3/usleep.3.asp&e=10342 - tylko trochę się zdziwiłem, że na platformie NT też jest funkcja usleep().
ŁF napisał(a)
sleep(0), które też zajmuje pewien czas (trzeba funkcję wywołać i wykonać
Dodatkowo wywołanie Sleep(0) zwiększa element "losowości" - przez to wątek zostanie prawie na pewno wywłaszczony na rzecz wątku o podobnym lub wyższym priorytecie.
Marooned: Co do tego linku - chyba Kojot ma problemy z AutoUrl :)
//a czemu to do mnie piszesz? :) - M