Chciałbym zmierzyć czas potrzebny do powtórzenia działania funkcji. Czy
replicate()
używanie pętli for jest równoważne? Na przykład:system.time(replicate(1000, f())); system.time(for(i in 1:1000){f()});
Która jest preferowaną metodą.
Na wyjściu
system.time()
, tosys+user
rzeczywisty czas CPU na uruchomienie programu? Czyelapsed
dobra miara wydajności programu w czasie?
36
Odpowiedzi:
Aby efektywnie mierzyć czas programów, szczególnie gdy chcesz porównać alternatywne rozwiązania, potrzebujesz kontroli! Dobrym sposobem jest umieszczenie procedury, którą mierzysz w funkcji. Wywołaj funkcję w pętli czasowej. Napisz procedurę skrótową, w zasadzie usuwając cały kod z funkcji i po prostu wracając z niego (ale zostaw wszystkie argumenty w środku). Umieść kod pośredniczący w pętli pomiaru czasu i ponownie ustaw czas. Mierzy to cały narzut związany z taktowaniem. Odejmij czas pośredni od czasu procedury, aby uzyskać sieć: powinien to być dokładny pomiar rzeczywistego potrzebnego czasu.
Korzystając z tych podstawowych zasad projektowania eksperymentalnego, zasadniczo kontrolujesz wszelkie różnice wynikające z tego, jak wdrażasz kod (np. Różnica między pętlą for a replicate ()). To sprawia, że twój problem zniknął.
źródło
Jeśli chodzi o twoje dwa punkty:
replicate()
ponieważ jest funkcjonalny.elapsed
, tj. Na trzeciej liczbie.Często to robię
aby uzyskać skróconą średnią wynoszącą 90% N powtórzeń połączeń
f()
.(Edytowane, dzięki dzięki Hadley za złapanie cienkiego).
źródło
mean(replicate(N, system.time(f(...))[3]), trim = 0.05)
?Możesz także skorzystać z czasu zwróconego przez
Sys.time
; to oczywiście mierzy czas ściany, a więc czas obliczeń w czasie rzeczywistym. Przykładowy kod:źródło
Jeśli chodzi o to, którego pomiaru czasu użyć, nie mogę dodać innych respondentów.
Jeśli chodzi o używaną funkcję, lubię używać testu porównawczego? Z pakietu rbenchmark .
źródło
Robią różne rzeczy. Czas, co chcesz zrobić. replicate () zwraca wektor wyników każdego wykonania funkcji. Pętla for nie. Dlatego nie są równoważnymi stwierdzeniami.
Ponadto określ czas, w jaki sposób chcesz coś zrobić. Następnie możesz znaleźć najbardziej wydajną metodę.
źródło