Исключения во время выполнения при запуске теста F # на Mono - PullRequest
2 голосов
/ 07 июня 2011

Я пытаюсь сравнить производительность конкретного теста F #, работающего в .NET и Mono 2.10.2 (Windows 7, 64-разрядная версия). Я взял тест Spectral-Norm из Benchmarks Game, следуя традиционному совету SO по использованию System.Diagnostics.StopWatch для тестирования C #, и добавил строки 4, 89-90 и 93-95 в . эта ссылка . Я скомпилировал этот код в Visual Studio 2010 (для среды выполнения 4.0, не для профиля клиента, для любого процессора, с включенным оптимизирующим кодом и хвостовыми вызовами). Скомпилированный код прекрасно работает в .NET (в том числе внутри VS), но когда я запускаю .exe в Mono с «mono shootout_spectralnorm.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 ]

3 голосов
/ 07 июня 2011

Ссылочные сборки (часто) не имеют кода - они являются только сигнатурами API (достаточно информации, чтобы компилятор мог ссылаться на них во время разработки / компиляции).Вам нужно скопировать сборки времени выполнения, а не эталонные сборки, чтобы запустить его.(Вы часто найдете сборки времени выполнения в GAC.)

0 голосов
/ 07 июня 2011

Здесь приведены измерения для FSharp-2.0.0.0 Спектральная норма # 2 (четырехъядерный процессор Intel Q6600, 32-разрядная версия MS Vista)

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

Теперь эталонные тестыСпектральная норма игры на демоверсии MS Vista, включает F # на Mono .

...