मुझे हाल ही में F# for Python programmers के बारे में एक प्रस्तुति मिली, और इसे देखने के बाद, मैंने "चींटी पहेली" के समाधान को लागू करने का निर्णय लिया।एफ # बनाम ओकैम: स्टैक ओवरफ़्लो
एक चींटी है जो एक प्लानर ग्रिड पर घूम सकती है। चींटी एक स्थान बाईं ओर, दाएं, ऊपर या नीचे एक स्थानांतरित कर सकती है। यही है, सेल (एक्स, वाई) से चींटी कोशिकाओं (x + 1, y), (x-1, y), (x, y + 1), और (x, y-1) पर जा सकती है। अंक जहां एक्स और वाई निर्देशांक के अंकों की संख्या 25 से अधिक है, चींटी के लिए पहुंच योग्य नहीं हैं। उदाहरण के लिए, बिंदु (5 9, 7 9) पहुंच योग्य नहीं है क्योंकि 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++ की तरह ही है। लियोनार्डो के सी ++ कार्यान्वयन की तुलना में, ओकैमल संस्करण सी ++ की तुलना में लगभग 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
ढेर अतिप्रवाह मैं एफ # के दोनों संस्करणों मेरी मशीन में ... जिज्ञासा से बाहर के साथ, मैं तो ले लिया उत्पन्न बाइनरी (ant.exe) और आर्क लिनक्स/मोनो के तहत इसे चलाने:
$ 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
- के तहत ठीक बिल्कुल नेट के तहत काम नहीं करता है/एफ #
- काम करता है, लेकिन के तहत मोनो/एफ # बहुत धीमी है,।
क्यों?
संपादित करें: Weirdness जारी है - लेकिन केवल ArchLinux/मोनो के तहत उपयोग करना "--optimize + --checked-" बनाता समस्या गायब हो जाते हैं,; विंडोज एक्सपी और विंडोज 7/64 बिट के तहत, बाइनरी स्टैक ओवरफ्लो का अनुकूलित संस्करण भी।
अंतिम EDIT: मैंने जवाब स्वयं पाया - नीचे देखें।
मैं कोई प्रश्न नहीं देखता हूं या मैं इसे अभी खत्म कर देता हूं। ऐसा लगता है कि उस पर केवल एक रान और बुरा होना चाहिए। आप सही ऑप्टिमाइज़ेशन सेटिंग्स सेट के साथ इसे करने के बारे में सोच सकते हैं (पूंछ-रिकर्सिव कॉल उत्पन्न करने के लिए दिमाग में आता है) - लेकिन एक कोड के बिना जो एक FAQ साइट पर बताना है? – Carsten
कोड पेस्टबिन के लिंक में है। – ttsiodras
लेकिन कोई सवाल नहीं है, जो स्टैक ओवरफ्लो का पूरा बिंदु है। मैं इसे बंद करने के लिए मतदान कर रहा हूं। – talonmies