Интерактивные и рабочие профилировщики F # - PullRequest
12 голосов
/ 12 июля 2010

F # Interactive (и в целом инструменты в стиле REPL) - идеальный вход для профилирования производительности. Что может быть проще, чем выбрать блок кода и отправить его прямо в профилировщик, который вернется с отчетом об анализе производительности. К сожалению, похоже, что существующие профилировщики не поддерживают REPL: вам нужно либо прикрепить профилировщик к процессу, либо указать исполняемый файл или веб-приложение для профиля.

Затем я оборачиваю блок кода в профиль в модульном тесте, а затем выполняю профиль для сеанса командной строки NUnit. Но это лучшее, что мы можем сделать прямо сейчас с F #?

Ответы [ 3 ]

9 голосов
/ 12 июля 2010

В чем вопрос?

Знаете ли вы о команде #time? Э.Г.

#time "on"
for i in 1..1000000 do
    let r = f(i)
    ignore r

, который дает F # интерактивный вывод, такой как

--> Timing now on
Real: 00:00:00.000, CPU: 00:00:00.000, GC gen0: 0, gen1: 0, gen2: 0

В любом случае, я думаю, что просто поместить код в приложение и запустить профиль для приложения лучше, чем тест NUnit. В любом случае, да, возможно, вам понадобится дополнительно 30 секунд времени, чтобы вставить код в новое приложение и скомпилировать его в режиме выпуска. Но это цена, которую я рад заплатить, чтобы получить богатую информацию о профилировании, которую предоставляет Visual Studio. В идеале опыт мог бы быть лучше, но я сомневаюсь, что вы найдете подходящие для REPL инструменты профилирования сегодня (или завтра).

4 голосов
/ 13 июля 2010

Вы можете попробовать использовать программный API профилировщика для достижения этой цели.Я не пробовал это, но вот инструкция для профилировщика ANTS: http://help.red -gate.com / help / ANTSProfiler3 / 0 / en / Topics / AP_UsingTheAPI.html

Я думаюможет произойти следующее:

  1. Запустите профилировщик ANTS и подключите его к fsi.exe
  2. r "RedGate.Profiler.Api.dll" в файле fsi

  3. Опрысните код, который вы хотите профилировать с помощью RedGate.Profiler.Api.Reset () / RedGate.Profiler.Api.TakeSnapshot ()

DotTrace имеет (имел?) Похожий API (CPUProfiler).Start () /. StopAndTakeSnapshot ()), но я не смог найти ссылки на последние версии.

1 голос
/ 13 июля 2010

Но это лучшее, что мы можем сделать прямо сейчас с F #?

AFAIK, да. Это отличная идея для функции в следующей версии F # или стороннего продукта!

...