在Mono上运行F#基准测试时的运行时异常

时间:2011-06-07 03:04:22

标签: f# mono benchmarking

我试图比较在.NET和Mono 2.10.2(Windows 7,64位)上运行的特定F#基准测试的性能。我从Benchmarks Game中获取了Spectral-Norm benchmark,遵循传统的SO建议,使用System.Diagnostics.StopWatch对C#进行基准测试,并在this link添加了第8,89-90和93-95行。我在Visual Studio 2010中编译了此代码(对于运行时4.0,不是客户端配置文件,任何CPU,启用了优化代码和尾部调用)。编译后的代码在.NET上运行得很好(包括VS内部),但是当我使用“mono shootout_spectralnorm.exe”在Mono上运行.exe时出现以下错误(在fssnip.net链接中重复):

Unhandled Exception: System.TypeInitializationException: An exception was thrown
by the type initializer for System.Diagnostics.Stopwatch ---> System.InvalidPro
gramException: Invalid IL code in System.Diagnostics.Stopwatch:.cctor (): method
body is empty.

--- End of inner exception stack trace ---
at Program.main (System.String[] args) [0x00000] in <filename unknown>:0

奇怪的是,当我删除我添加的行(第4,89-90和93-95行,它们与基准的时间部分相关)时,错误在Mono上消失了,它起作用了就像它在MS .NET上一样。这让我感到困惑。我将VS中的所有引用程序集都设置为本地复制,因此它们应该对Mono可见,但GAC中的不同程序集可能存在一些优先级问题,这些程序集与本地文件夹中的程序集具有相同的名称。有没有人遇到过这个问题或类似问题,特别是在Windows Mono上?如果是这样,或者你认为你知道如何解决这个问题,我希望你能帮助我解决它。

2 个答案:

答案 0 :(得分:3)

参考装配体(通常)没有代​​码 - 它们只是API签名(编译器在设计时/编译时引用它们的足够信息)。您需要复制运行时程序集而不是引用程序集才能运行它。 (您经常会在GAC中找到运行时程序集。)

答案 1 :(得分:0)

以下是FSharp-2.0.0.0的测量频谱规范#2 (英特尔Q6600四核,MS Vista 32位)

fsc     CPU s   Elapsed s
500     0.281   0.337
3000    4.883   1.453
5500    15.85   4.212

2.10.2  CPU s   Elapsed s
500     0.343   2.222
3000    4.836   3.361
5500    15.912  6.153

C:/Mono-2.10.2/bin/mono.exe C:/FSharp-2.0.0.0/bin/fsc.exe --platform:x86 
    --optimize+ --out:spectralnorm.exe spectralnorm.fsharpmono-2.fs

C:/Mono-2.10.2/bin/mono.exe --gc=sgen spectralnorm.exe 5500

Now the benchmarks game spectral-norm on MS Vista demo, includes F# on Mono.