Получение большего количества информации от Rprof ()

Я пытался вырыть, в какой пожиратели ресурсов времени находятся в некотором коде 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()), и т.д. на самом деле преступники? Или я должен буду осуществить рефакторинг код и сделать меньшие функциональные блоки для получения более мелкомодульных результатов?

Единственная причина я сопротивляюсь рефакторингу, состоит в том, что я должен был бы передать структуры данных в функции, и вся передача значением, так, чтобы походил на шаг в неправильном направлении.

Спасибо.

6
задан Ken Williams 15 January 2010 в 23:02
поделиться

3 ответа

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, который также может визуализировать (но требует графики).

4
ответ дан 17 December 2019 в 02:29
поделиться

Разобрать вывод, который генерирует Rprof не так уж и сложно, и тогда Вы получаете доступ абсолютно ко всему.

0
ответ дан 17 December 2019 в 02:29
поделиться

Rprof через определенные промежутки времени берет образцы стека вызовов - это хорошие новости.

Что бы я сделал, так это получить доступ к необработанным образцам стека ( stackshots ), которые он собирает, и выбрать несколько случайным образом и изучить их. Я ищу сайты вызовов (не только функции, но и места, где одна функция вызывает другую), которые появляются в нескольких образцах. Например, если место вызова появляется в 50% выборок, то это того стоит, потому что его возможное удаление сэкономит примерно 50% общего времени. (Кажется очевидным, не так ли? Но это малоизвестно.)

Не каждый дорогостоящий сайт вызова можно оптимизировать, но некоторые из них , если программа уже не работает настолько быстро, насколько это возможно.

(Не отвлекайтесь на такие вопросы, как количество образцов, которые вам нужно просмотреть. Если что-то поможет вам сэкономить разумную долю времени, то оно появится на аналогичной части образцов. Точное число не имеет значение. Важно то, что вы его найдете. Также не отвлекайтесь на проблемы с графиком, рекурсией, измерением и счетом времени. Важно то, что для каждого сайта вызова, который вы видите, доля образцов стека, которые его показывают.)

2
ответ дан 17 December 2019 в 02:29
поделиться
Другие вопросы по тегам:

Похожие вопросы: