मैं हमेशा जीएचसीजेएस पर विश्वास करता हूं, स्पष्ट कारणों से, मैन्युअल रूप से लिखित और अनुकूलित कोड की तुलना में बहुत धीमे जावास्क्रिप्ट प्रोग्राम उत्पन्न करता है। इसके साथ प्रयोग करते समय, मैंने देखा कि यह उतना बुरा नहीं था जितना कि मुझे उम्मीद थी। मैंने सही प्रदर्शन पर समझ पाने के लिए छोटे मानकों की एक श्रृंखला चलाने का फैसला किया, और यह विशेष रूप से मुझे आश्चर्यचकित कर दिया। कार्यक्रम बस "1" के साथ एक सरणी भरता है और उन्हें जोड़ता है।जावास्क्रिप्ट से संकलित यह हास्केल प्रोग्राम जावास्क्रिप्ट से तेज़ी से कैसे हो सकता है?
हास्केल:
import Data.Array.Repa
len = 1024*1024*64
arr = fromFunction (Z :. len) (const 1) :: Array D DIM1 Float
main = sumAllP arr >>= print
जावास्क्रिप्ट:
var len = 1024*1024*64
var arr = [];
var sum = 0;
for (var i=0; i<len; ++i)
arr[i] = 1;
for (var i=0; i<len; ++i)
sum += arr[i];
console.log(sum);
और एक कच्चे बेंचमार्क:
apple1$ ghcjs -O2 bench_fill.hs -funfolding-use-threshold10000 -funfolding-keeness-factor1000 -o bench_fill.js; time node bench_fill.js/all.js
Linking bench_fill.js (Main)
6.7108864e7
real 0m1.543s
user 0m1.512s
sys 0m0.033s
apple1$ time node benchfill.js
67108864
real 0m1.764s
user 0m1.173s
sys 0m0.583s
कैसे GHCJS के लिए लूप एक स्लिम, स्वच्छ देशी की तुलना में तेजी से चला सकते हैं? जेनरेट किए गए कोड के संपर्क में आने वाले बॉक्सिंग की मात्रा पर विचार करना संभव नहीं होना चाहिए।
क्या आप सुनिश्चित हैं कि हास्केल कंपाइलर केवल अंतिम परिणाम मुद्रित करने के लिए कोड को अनुकूलित नहीं करता है? किसी भी मामले में हमें शायद यह पता लगाने के लिए जेनरेट किया गया कोड देखना होगा कि यह तेज़ क्यों है। – JJJ
कृपया ghcjs से आउटपुट .js प्रदान करें। इस सवाल का जवाब कैसे दिया जाए। –
[यह] (https://gist.github.com/viclib/3023b1c44daf7f33ede4) आउटपुट जेएस है। [यह] (https://gist.github.com/viclib/9108f02fb1655cdc0787) इसके अलावा, यह सुनिश्चित करने के लिए कि यह भर गया था, राशि को प्रिंट करने के बाद पूरे सरणी को प्रिंट करता है। – MaiaVictor