Я пытался вырыть, в какой пожиратели ресурсов времени находятся в некотором коде R, который я написал, таким образом, я использую 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
...
Есть ли некоторый способ вырыть глубже и узнать который определенные вызовы $<-.data.frame
, и FUN
(который является, вероятно, от by()
), и т.д. на самом деле преступники? Или я должен буду осуществить рефакторинг код и сделать меньшие функциональные блоки для получения более мелкомодульных результатов?
Единственная причина я сопротивляюсь рефакторингу, состоит в том, что я должен был бы передать структуры данных в функции, и вся передача значением, так, чтобы походил на шаг в неправильном направлении.
Спасибо.
newtype NonNegative a = NonNegative a
toNonNegative :: (Num a, Ord a) => a -> NonNegative a
toNonNegative x
| x < 0 = error "Only non-negative values are allowed."
| otherwise = NonNegative x
fromNonNegative :: NonNegative a -> a
fromNonNegative (NonNegative x) = x
Просто будьте осторожны, чтобы никогда непосредственно использовать неотрицательный конструктор. Это будет легче, если вы поместите это в отдельный модуль и не экспортируете его.
Также теперь вы можете использовать (карта тональности), чтобы лениво преобразовать список чисел.
Это все равно потребует проверки времени выполнения, где бы вы ни находились необработанные числа.
В качестве альтернативы вы можете использовать Data.word.
-121--3632241-Существующие Cran Package PROFR и PROFTools полезны для этого. Последнее может использовать RGraphviz, который не всегда устанавливается.
Страница Wiki R на профилирование имеет дополнительную информацию и хороший сценарий Romain, который также может визуализировать (но требует графики).
Разобрать вывод, который генерирует Rprof
не так уж и сложно, и тогда Вы получаете доступ абсолютно ко всему.
Rprof через определенные промежутки времени берет образцы стека вызовов - это хорошие новости.
Что бы я сделал, так это получить доступ к необработанным образцам стека ( stackshots ), которые он собирает, и выбрать несколько случайным образом и изучить их. Я ищу сайты вызовов (не только функции, но и места, где одна функция вызывает другую), которые появляются в нескольких образцах. Например, если место вызова появляется в 50% выборок, то это того стоит, потому что его возможное удаление сэкономит примерно 50% общего времени. (Кажется очевидным, не так ли? Но это малоизвестно.)
Не каждый дорогостоящий сайт вызова можно оптимизировать, но некоторые из них , если программа уже не работает настолько быстро, насколько это возможно.
(Не отвлекайтесь на такие вопросы, как количество образцов, которые вам нужно просмотреть. Если что-то поможет вам сэкономить разумную долю времени, то оно появится на аналогичной части образцов. Точное число не имеет значение. Важно то, что вы его найдете. Также не отвлекайтесь на проблемы с графиком, рекурсией, измерением и счетом времени. Важно то, что для каждого сайта вызова, который вы видите, доля образцов стека, которые его показывают.)