F#交互式和性能分析器

12

F# Interactive(以及REPL样式的工具)是性能分析的理想入口。选择一个代码块并将其直接发送到性能分析器,以获取性能分析报告,这比什么都容易。不幸的是,现有的性能分析器似乎没有REPL支持:您必须将性能分析器附加到进程或指定要进行性能分析的可执行文件或Web应用程序。

因此,我最终做的是将要进行性能分析的代码块包装在单元测试中,并对NUnit命令行会话执行性能分析。但是,这是否是我们目前在F#中可以做的最好方法呢?


1
我在RedGate ANTS Profiler论坛上发布了一个问题,他们回复说他们喜欢这个想法并会考虑它。 - Vagif Abilov
有另一种思考性能分析的方式 - 不是测量时间和计算调用次数,而是问“它到底在做什么?”- https://dev59.com/xHI-5IYBdhLWcg3wlpeW#1779343 - Mike Dunlavey
3个回答

9

这是什么问题?

你知道 #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友好的性能分析工具。


是的,但这仅在简单情况下有用。它不能为您提供调用堆栈中操作之间执行时间分配的图像。 - Vagif Abilov
回答你的问题“什么是问题?”:问题不在于外部调用的时间执行。问题在于性能分析,它远不止于此:它是基于收集的性能数据的广泛性能分析。像dotTrace和ANTS这样的现代性能分析器可以通过附加到进程或运行应用程序来完成,但如果它们可以对发送到F# Interactive的代码进行分析,那将非常高效。因此,问题是是否可以实现这一点。 - Vagif Abilov

4
您可以尝试使用分析器编程API来实现此目的。我没有尝试过这个,但是以下是ANTS分析器的说明:http://help.red-gate.com/help/ANTSProfiler3/0/en/Topics/AP_UsingTheAPI.html 我认为以下方法可能会成功:
1.启动ANTS分析器并附加到fsi.exe 2.在fsi中输入“#r "RedGate.Profiler.Api.dll"” 3.在您要分析的代码中添加RedGate.Profiler.Api.Reset()/RedGate.Profiler.Api.TakeSnapshot()
DotTrace也有(曾经有过?)类似的API(CPUProfiler.Start()/.StopAndTakeSnapshot()),但我找不到最新版本的参考资料。

这是一个有趣的选项!谢谢你让我知道。我会试一下。 - Vagif Abilov

1
但是现在我们用 F# 做到了最好的水平吗? 据我所知,是的。不过这确实是下一个版本的 F# 或第三方产品中出现的好主意!

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接