Подтвердить что ты не робот

F # интерактивные и профильные профили

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

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

4b9b3361

Ответ 1

В чем вопрос?

Знаете ли вы о команде #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 секунд, чтобы вставить код в новое приложение и скомпилировать его в режиме Release. Но это цена, которую я рад заплатить, чтобы получить богатую информацию профилирования, которую предоставляет Visual Studio. В идеале опыт может быть лучше, но я сомневаюсь, что сегодня вы найдете REPL-совместимые инструменты для профилирования. (Или завтра).

Ответ 2

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

Я думаю, что следующее может преуспеть:

  • Запустите профилировщик ANTS и прикрепите файл fsi.exe
  • r "RedGate.Profiler.Api.dll" в fsi

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

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

Ответ 3

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

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