![]() |
![]() |
![]()
Post
#1
|
|
Grupa: Zarejestrowani Postów: 3 Pomógł: 0 Dołączył: 31.12.2011 Ostrzeżenie: (0%) ![]() ![]() |
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
|
|
|
![]() |
![]()
Post
#2
|
|
Grupa: Zarejestrowani Postów: 4 655 Pomógł: 556 Dołączył: 17.03.2009 Skąd: Katowice Ostrzeżenie: (0%) ![]() ![]() |
Skoro chcesz taki dokładny czas to nie mierz z poziomu php ;] użyj c, c++ czy c#
|
|
|
![]()
Post
#3
|
|
Grupa: Zarejestrowani Postów: 590 Pomógł: 107 Dołączył: 25.10.2011 Ostrzeżenie: (0%) ![]() ![]() |
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ć. |
|
|
![]()
Post
#4
|
|
Grupa: Zarejestrowani Postów: 3 Pomógł: 0 Dołączył: 31.12.2011 Ostrzeżenie: (0%) ![]() ![]() |
dzieki za odpowiedz (IMG:style_emoticons/default/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? |
|
|
![]()
Post
#5
|
|
Grupa: Zarejestrowani Postów: 307 Pomógł: 37 Dołączył: 9.11.2010 Skąd: Zielona Góra Ostrzeżenie: (0%) ![]() ![]() |
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. Ten post edytował Uriziel01 3.01.2012, 12:56:57 |
|
|
![]()
Post
#6
|
|
Grupa: Zarejestrowani Postów: 3 Pomógł: 0 Dołączył: 31.12.2011 Ostrzeżenie: (0%) ![]() ![]() |
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. |
|
|
![]()
Post
#7
|
|
Grupa: Zarejestrowani Postów: 307 Pomógł: 37 Dołączył: 9.11.2010 Skąd: Zielona Góra Ostrzeżenie: (0%) ![]() ![]() |
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.
|
|
|
![]()
Post
#8
|
|
Grupa: Zarejestrowani Postów: 590 Pomógł: 107 Dołączył: 25.10.2011 Ostrzeżenie: (0%) ![]() ![]() |
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ą (IMG:style_emoticons/default/smile.gif) |
|
|
![]() ![]() |
![]() |
Aktualny czas: 2.10.2025 - 19:02 |