2010-01-15 20 views
6

Próbowałem dowiedzieć się, co te świnki są w jakimś kodzie R napisałem, więc używam Rprof. Wyjście nie jest jeszcze bardzo pomocne choć:Uzyskiwanie więcej informacji z Rprof()

> summaryRprof() 
$by.self 
         self.time self.pct total.time total.pct 
"$<-.data.frame"   2.38  23.2  2.38  23.2 
"FUN"      2.04  19.9  10.20  99.6 
"[.data.frame"    1.74  17.0  5.54  54.1 
"[.factor"     1.42  13.9  2.90  28.3 
... 

Czy istnieje jakiś sposób, aby kopać głębiej i dowiedzieć się, jakie konkretne wywołania z $<-.data.frame i FUN (co jest zapewne z by()), itd. Są rzeczywiście winni? Czy też będę musiał zmienić kod i utworzyć mniejsze porcje funkcjonalne, aby uzyskać bardziej szczegółowe wyniki?

Jedynym powodem, dla którego opieram się refaktoryzacji jest to, że musiałbym przekazać struktury danych do funkcji, a wszystkie przekazywanie jest według wartości, więc wydaje się, że krok w niewłaściwym kierunku.

Dzięki.

Odpowiedz

4

Istniejące pakiety profr i proftools są przydatne do tego. Ten drugi może używać Rgraphviz, który nie zawsze jest instalowalny.

ma dodatkowe informacje i przyjemny scenariusz autorstwa Romain, który może również wizualizować (ale wymaga grafviz).

+0

url zepsuty, być może to jest teraz [tutaj] (http://rwiki.sciviews.org/doku.php?id=tips:misc:profiling). – hhh

0

Analizowanie wyniku, który generuje Rprof, nie jest zbyt trudne, a następnie uzyskuje się dostęp do absolutnie wszystkiego.

2

Rprof pobiera próbki stosu wywołań w określonych odstępach czasu - to dobra wiadomość.

Co mogę zrobić, to uzyskać dostęp do próbek surowego stosu (stackshots), które zbiera, i wybrać kilka losowo i zbadać je. Czego szukam to strony wywołania (nie tylko funkcje, ale miejsca, w których jedna funkcja wywołuje inne), które pojawiają się na wielu próbkach. Na przykład, jeśli strona połączenia pojawi się na 50% próbek, to właśnie to kosztuje, ponieważ jej ewentualne usunięcie zaoszczędziłoby około 50% całkowitego czasu. (Wydaje się oczywiste, prawda? Ale to nie jest dobrze znana.)

Nie każda rozmowa jest kosztowne strona podlegających optymalizacji, ale niektóre są chyba program jest już tak szybko, jak to możliwe.

(Nie rozpraszaj się takimi kwestiami, jak liczba próbek, na które musisz zwrócić uwagę. Jeśli coś ma zaoszczędzić rozsądny ułamek czasu, pojawia się na podobnej części próbek. Ważne jest, aby je znaleźć, a także nie rozpraszać się za pomocą wykresów, rekurencji, pomiaru czasu i liczenia problemów. Dla każdej strony z połączeniem jest to ułamek próbek stosu, które ją pokazują.)

Powiązane problemy