我最近發現一個演示約F# for Python programmers,並觀看後,決定實施一個解決方案,我自己的「蟻族之謎」。F#VS OCaml的:堆棧溢出
沒有可走動在平面網格的螞蟻。螞蟻可以一次向左,向右,向上或向下移動一個空間。也就是說,從細胞(x,y),螞蟻可以進入細胞(x + 1,y),(x-1,y),(x,y + 1)和(x,y-1)。螞蟻無法進入x和y座標的數字總和大於25的點。例如,點(59,79)是不可訪問的,因爲5 + 9 + 7 + 9 = 30,這是大於25的問題是:多少分可以的,如果它開始於(1000,1000)的螞蟻訪問,包括(1000,1000)本身?
我實現了我的解決方案中的OCaml first 30日線,並嘗試過了:
$ ocamlopt -unsafe -rectypes -inline 1000 -o puzzle ant.ml
$ time ./puzzle
Points: 148848
real 0m0.143s
user 0m0.127s
sys 0m0.013s
整潔,我的結果是一樣的,即leonardo's implementation, in D and C++。與leonardo的C++實現相比,OCaml版本的運行速度比C++慢大約2倍。這是可以的,因爲萊昂納多使用隊列來消除遞歸。
然後我translated the code to F# ...這是我得到了什麼:
[email protected] /g/Tmp/ant.fsharp
$ /g/Program\ Files/FSharp-2.0.0.0/bin/fsc.exe ant.fs
Microsoft (R) F# 2.0 Compiler build 2.0.0.0
Copyright (c) Microsoft Corporation. All Rights Reserved.
[email protected] /g/Tmp/ant.fsharp
$ ./ant.exe
Process is terminated due to StackOverflowException.
Quit
[email protected] /g/Tmp/ant.fsharp
$ /g/Program\ Files/Microsoft\ F#/v4.0/Fsc.exe ant.fs
Microsoft (R) F# 2.0 Compiler build 4.0.30319.1
Copyright (c) Microsoft Corporation. All Rights Reserved.
[email protected] /g/Tmp/ant.fsharp
$ ./ant.exe
Process is terminated due to StackOverflowException
堆棧溢出......與F#的兩個版本我已經在我的機器... 出於好奇,我取了產生的二進制(ant.exe)和下的Arch Linux /單色運行:
$ mono -V | head -1
Mono JIT compiler version 2.10.5 (tarball Fri Sep 9 06:34:36 UTC 2011)
$ time mono ./ant.exe
Points: 148848
real 1m24.298s
user 0m0.567s
sys 0m0.027s
令人驚訝地,它運行單聲道2.10.5(即沒有堆棧上溢)下 - 但它需要84秒,即慢於587倍OCaml - 哎呀。
所以這個程序...
- 運行OCaml的
- 下罰款不工作在所有的.NET下/ F#
- 作品,但速度很慢,下單聲道/ F#。
爲什麼?
編輯:怪誕繼續 - 使用 「--optimize + --checked-」 使問題消失,但只下的ArchLinux /單聲道;在Windows XP和Windows 7/64bit下,即使是二進制堆棧的優化版本也會溢出。
最終剪輯:我找到了自己的答案 - 見下文。
我eigher看到沒有問題,或者我只是重讀它。似乎只是一個咆哮和一個壞的那個。你可能會考慮用正確的優化設置來設置(想到產生尾遞歸調用) - 但是沒有代碼將在FAQ站點上講述? – Carsten
代碼在那裏,在指向pastebin的鏈接中。 – ttsiodras
但沒有問題,這是整個stackoverflow的點。我正在投票結束這一決定。 – talonmies