Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Realny czas wykonywania skryptu
Forum PHP.pl > Forum > PHP
pohlaniacz
Witam, potrzebuje zmierzyc czas wykonywania komend exec/system, ale w sposob, zeby np. mierzac 3 czasy, byly by one jak najbardziej dokladne. W jakis sposob mozna dac najwyzszy priorytet dla danego kodu? Opcja z microtime wydaje sie byc za bardzo rozbiezna, czy jest bardziej optymalne wyjscie? Serwer stoi na apache'u
Fifi209
Skoro chcesz taki dokładny czas to nie mierz z poziomu php ;] użyj c, c++ czy c#
abort
Generalnie do zwiększenia priorytetu procesu stosuje się polecenie "nice". Szczegóły w manualu.
Możesz też pobawić się (z linii komend linuksa) instrukcją "time", która podaje trzy czasy:
Kod
[user@host ~] $ time ls -la > /dev/null

real    0m0.038s
user    0m0.004s
sys     0m0.008s

Jaki czas czemu odpowiada - też odsyłam do manuala.
Moim zdaniem, jeśli chcesz testować szybkość swojego kodu (np. do celów benchmarków), wykonaj ten kod w pętli N razy i wybierz najmniejszą wartość (najszybciej wykonany kod). Jeśli chcesz oszacować przeciętny czas wykonania się kodu, wybierz średnią (lub medianę) z N pomiarów.

I pamiętaj, że Linux to system wielozadaniowy (to zapewne wiesz), i przyjmij do wiadomości, że nie jesteś (i nie będziesz) w stanie wykonać swojego procesu z takim priorytetem, by inne procesy nie uszczknęły czegoś z mocy procesora. A to, jak się domyślasz, zafałszuje te wyniki, które chcesz uzyskać.

Przy okazji: nie wiem, do jakich rzeczy potrzebujesz takich danych - jeśli napiszesz coś więcej, postaram się coś doradzić.
pohlaniacz
dzieki za odpowiedz smile.gif

Serwer bedzie na windowsie, wiec opcja z nice odpada. Potrzebuje to do nastepujacej rzeczy, uzytkownik wysyla kod swojego programu w cpp (obslugujacy wej/wyj), skrypt go kompiluje i wykonuje ( z wej i wyj) i potrzebny mi jest czas, w jakim sie on wykonal.

Jedyne co mi narazie przychodzi do glowy to napisanie skryptu dodajacego do programu cpp kod
Kod
#include <time.h>
...

int main (){
clock_t tStart = clock();
...
printf("Time taken: %.2fs\n", (double)(clock() - tStart)/CLOCKS_PER_SEC);
}

i wtedy w pliku txt wyjsciowym ostatnia linijka byloby wykonanie programu, nie wiem czy to troche nie na okolo, ale w tym przypadku moze bylyby dokladniejsze wyniki?
Uriziel01
Ale ty chcesz mierzyć czas samego wykonania czy łącznie z linkowaniem i kompilacją ? Jeżeli czas samego wykonania to co stoi na przeszkodzie porównanie czasu odpalania procesu do czasu zwrócenia return'a przez ten 'kod cpp' ? Co prawda dokładność nie jest powalająca bo nie wiesz ile czasu minęło od chwili w której odpaliłeś dany proces do momentu ew którym jego kod zacznie się wykonywać. Ale bez ingerencji w wewnętrzny kod tych programów.

EDIT:
Może niezbyt jasno się wyraziłem, innymi słowy. Dlaczego potrzebujesz aż takiej dokładności tych pomiarów ? Co zmieni te kilkadziesiąt ms różnicy.
pohlaniacz
Czas samego wykonania.

Siedzialem nad tym troche probujac ingerowac w kod - bez sensu wyjscie. Po testach przykladowego programu, w php z obsluga microtime wychodzi ~0,055sec, z kodem ktory wkleilem powyzej w cpp wychodzi 0,02s, nie wiem jak bedzie z "grubszymi" programi, no ale trudno.
Uriziel01
Najprościej będzie jeżeli napiszesz mały program w C+'a z poziomu którego będziesz odpalał skompilowany projekt. Zaczniesz liczyć czas dopiero gdy system zwróci ci poprawny PID zamiast już od momentu wydania polecenia uruchomienia procesu. Odbierzesz jego odpowiedź i zatrzymasz timer. Powinno dać dużo lepszy wynik niż PHP.
abort
Z jednej strony masz 55ms zmierzone za pomocą microtime w php. Z drugiej strony masz 20us przy pomiarze w C. Niby jest to "tylko" 35us. Ale z drugiej strony jest to aż 175% różnicy - a taka różnica to nie w kij dmuchał.

Powiem tak: nie lubię ciągnąć za język, bo rozumiem, że nie każdy lubi dzielić się tym, co robi (i po co). Ale niezmiennie nurtuje mnie pytanie "PO CO"? Bo jeśli jest to np. jakiś konkurs informatyczny na najszybszy algorytm wykonania "czegoś-tam", to rozwiązanie wydaje mi się proste: wykonać program N razy w pętli: znaczy się, wszystko ma być robione w C, PHP będzie tylko "uploaderem" i swego rodzaju frontendem do kompilatora - np. gwarantując stałe parametry wywołania kompilatora (a bywa, że na tym można naprawdę dużo zyskać). Inne pomysły nie przychodzą mi na myśl, co nie znaczy, że nie istnieją smile.gif






To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.