अद्यतनक्लोजर हैलो वर्ल्ड प्रोग्राम जावा और पायथन की तुलना में इतना धीमा क्यों है?
कई लोगों ने सुझाव दिया है, यह इस तरह है क्योंकि तथ्य यह है कि clojure कोड पहले संकलित किया गया था और उसके बाद मार डाला गया था लग रहा है। एओटी संकलन को ऑफसेट करने में मदद करनी चाहिए। यह देखते हुए कि मैंने व्यावहारिक क्लोजर एओटी संकलन प्रक्रिया को हल करने के लिए थोड़ा मुश्किल (क्लासपाथ मुद्दों, निर्देशिका मुद्दों और अन्य) को पाया है, मैंने किसी भी स्थिति में रुचि रखने के चरण here द्वारा एक छोटा कदम लिखा है।
हाय सब,
मैं पढ़ रहा हूँ "प्रोग्रामिंग Clojure" और मैं कुछ भाषाओं मैं कुछ सरल कोड के लिए उपयोग की तुलना की गई थी। मैंने देखा कि क्लोजर कार्यान्वयन प्रत्येक मामले में सबसे धीमे थे। उदाहरण के लिए,
अजगर - hello.py
def hello_world(name):
print "Hello, %s" % name
hello_world("world")
और परिणाम,
$ time python hello.py
Hello, world
real 0m0.027s
user 0m0.013s
sys 0m0.014s
जावा - hello.java
import java.io.*;
public class hello {
public static void hello_world(String name) {
System.out.println("Hello, " + name);
}
public static void main(String[] args) {
hello_world("world");
}
}
और परिणाम,
+०१२३५१६४१०$ time java hello
Hello, world
real 0m0.324s
user 0m0.296s
sys 0m0.065s
और अंत में,
Clojure - hellofun.clj
(defn hello-world [username]
(println (format "Hello, %s" username)))
(hello-world "world")
और परिणाम,
$ time clj hellofun.clj
Hello, world
real 0m1.418s
user 0m1.649s
sys 0m0.154s
एक पूरी, garangutan 1.4 सेकंड Thats!
क्या किसी के पास इस बात का संकेत है कि इसका क्या कारण हो सकता है? क्लोजर वास्तव में धीमा है, या क्या JVM चालें हैं और निष्पादन को तेज करने के लिए उपयोग करने की आवश्यकता है?
अधिक महत्वपूर्ण बात यह है कि किसी बिंदु पर प्रदर्शन में यह बड़ा अंतर नहीं है? (मेरा मतलब है, मान लीजिए कि मैं एक उत्पादन प्रणाली के लिए क्लोजर का उपयोग कर रहा था - लिस्प का उपयोग करने में मुझे जो लाभ मिलता है वह प्रदर्शन के मुद्दों से पूरी तरह ऑफसेट लगता है जो मैं यहां देख सकता हूं)।
यहां इस्तेमाल किया मशीन एक 2007 मैकबुक प्रो चल हिम तेंदुआ, एक 2.16GHz इंटेल C2D और 2 जी डीडीआर 2 SDRAM है।
Btw, CLJ स्क्रिप्ट मैं उपयोग कर रहा हूँ here से है और तरह लग रहा है,
#!/bin/bash
JAVA=/System/Library/Frameworks/JavaVM.framework/Versions/1.6/Home/bin/java
CLJ_DIR=/opt/jars
CLOJURE=$CLJ_DIR/clojure.jar
CONTRIB=$CLJ_DIR/clojure-contrib.jar
JLINE=$CLJ_DIR/jline-0.9.94.jar
CP=$PWD:$CLOJURE:$JLINE:$CONTRIB
# Add extra jars as specified by `.clojure` file
if [ -f .clojure ]
then
CP=$CP:`cat .clojure`
fi
if [ -z "$1" ]; then
$JAVA -server -cp $CP \
jline.ConsoleRunner clojure.lang.Repl
else
scriptname=$1
$JAVA -server -cp $CP clojure.main $scriptname -- $*
fi
हर बार जब आप क्लोजर उदाहरण चलाते हैं तो इसे संकलित किया जाता है। यदि आप रन प्रदर्शन को मापना चाहते हैं तो एओटी इसे संकलित करें। – fogus
एक बहुत अच्छा कारण है कि हर कोई बेंचमार्क कोड के लिए पर्याप्त बहादुर नहीं है। यह आसान नहीं है। आप सिर्फ रन को हिट नहीं कर सकते हैं और स्टॉपवॉच देख सकते हैं। – Rayne
@fogus - धन्यवाद, मैं एओटी संकलन देख रहा हूं। @ रेयने - मैं किसी भी शाब्दिक अर्थ में कोड को "बेंचमार्किंग" नहीं कर रहा हूं। मैं एक स्पष्टीकरण चाहता था कि यह धीमी गति से अन्य भाषाओं क्यों चला गया, और मांग बनाम एओटी स्पष्टीकरण पर संकलन ने मुझे समझने में मदद की! – viksit