我试图比较在.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上?如果是这样,或者你认为你知道如何解决这个问题,我希望你能帮助我解决它。
答案 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.