2010-03-28 19 views
11

अद्यतनक्लोजर हैलो वर्ल्ड प्रोग्राम जावा और पायथन की तुलना में इतना धीमा क्यों है?

कई लोगों ने सुझाव दिया है, यह इस तरह है क्योंकि तथ्य यह है कि 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 
+2

हर बार जब आप क्लोजर उदाहरण चलाते हैं तो इसे संकलित किया जाता है। यदि आप रन प्रदर्शन को मापना चाहते हैं तो एओटी इसे संकलित करें। – fogus

+1

एक बहुत अच्छा कारण है कि हर कोई बेंचमार्क कोड के लिए पर्याप्त बहादुर नहीं है। यह आसान नहीं है। आप सिर्फ रन को हिट नहीं कर सकते हैं और स्टॉपवॉच देख सकते हैं। – Rayne

+1

@fogus - धन्यवाद, मैं एओटी संकलन देख रहा हूं। @ रेयने - मैं किसी भी शाब्दिक अर्थ में कोड को "बेंचमार्किंग" नहीं कर रहा हूं। मैं एक स्पष्टीकरण चाहता था कि यह धीमी गति से अन्य भाषाओं क्यों चला गया, और मांग बनाम एओटी स्पष्टीकरण पर संकलन ने मुझे समझने में मदद की! – viksit

उत्तर

27

तुम बहुत यहाँ Clojure बूट समय को छोड़कर मापने नहीं कर रहे हैं। आप अपने प्रोग्राम को इस तरह से भी चला रहे हैं कि आप संकलन समय को भी माप रहे हैं। यदि आप तेज़ लोड समय देखना चाहते हैं तो आपको अपने कोड को संकलित करने की आवश्यकता होगी।

पायथन में थोड़ी सी कोडिंग करने के बाद, मैंने पाया है कि क्लोजर सामान्य नियम के रूप में बहुत अधिक है, जो कि पाइथन से बहुत तेज है और आप आमतौर पर शुद्ध जावा की गति के 2X-4X के भीतर क्लोजर प्रोग्राम प्राप्त कर सकते हैं ।

+0

पीपीपी की तुलना में क्लोजर के बारे में आप क्या सोचते हैं? मुझे हाल ही में आश्चर्य हुआ कि मैंने कुछ ग्राफ सिद्धांत कंप्यूटेशंस को क्लोजर की तुलना में पीईपीई में काफी तेजी से किया था (और क्लोजर सीपीथॉन की तुलना में काफी तेज़ था)। दोनों मामलों में कोड अधिक कार्यात्मक है, सरणी (पायथन में सूचियां, क्लोजर में वैक्टर), सेट, और आलसी अनुक्रम (पायथन में जेनरेटर) का उपयोग करता है। –

+2

यदि आप वेक्टरों में म्यूटेबल सूचियों की तुलना कर रहे हैं तो आप एक परफ अंतर देखने जा रहे हैं। क्लोजर में जब perf वास्तव में मायने रखता है मैं जावा सरणी का उपयोग करता हूं, या उन पर एक हल्का अमूर्तता का उपयोग करता हूं। उस ने कहा, पीपीपी का पेर्फ वास्तव में अच्छा लगता है। हालांकि, अब मैं क्लोजर से बाहर निकलने के लिए परिचित/आरामदायक हूं, मुझे लगता है कि पीपीपी जेवीएम के साथ प्रतिस्पर्धा करने से पहले कुछ तरीके हैं। – dnolen

2

के dnolen का जवाब जोड़ने के लिए, जब अजगर बनाम Clojure समय सामग्री कर रही है, आप एक समारोह के रूप में अपने "काम की बुनियादी इकाई" पैकेज करने और उसके बाद का उपयोग time (Clojure में) मैक्रो या timeit.timeit समारोह (में अजगर चाहते हो सकता है ; या, बेहतर अभी तक, आईपीथन की समय सुविधाओं का उपयोग करें) आरईपीएल पर। परिणाम मोटे तौर पर तुलनीय होना चाहिए। (ध्यान दें कि क्लोजर कोड को पूर्ण प्रदर्शन प्राप्त करने के लिए इसे कुछ बार चलाकर "गर्म" किया जाना चाहिए।)

क्लोजर के लिए कुछ बेंचमार्किंग स्वीट भी हैं, उदाहरण के लिए Criterium; आप उनमें से एक का उपयोग करने पर विचार करना चाह सकते हैं।

+0

जानकारी के लिए धन्यवाद। मैं पहले से ही पाई बेंचमार्किंग और परफ विश्लेषण के लिए पाइथन टाइमिट का उपयोग करता हूं। यह सवाल लाइनों पर अधिक था - शायद जेवीएम सेटिंग्स आदि के साथ कोई समस्या थी जो इसका कारण बन रही थी। तथ्य यह है कि यह एओटी संकलित हो जाता है इसे काफी हद तक बताता है। – viksit

+0

@viksit: Yup, JVM स्टार्टअप अन्य बड़ा कारक है। (स्पष्ट रूप से यह अब एक बड़ा कारक नहीं है यदि आपकी प्रक्रिया में काम करने की एक बड़ी मात्रा है, लेकिन यह "हैलो वर्ल्ड" उदाहरण के मामले में नहीं है - या माइक्रोबेंचमार्क के विशाल बहुमत के माध्यम से एक ही रन के साथ मैं ' देखा है।) –

+0

@downvoter: जिज्ञासा से, इस उत्तर का कौन सा हिस्सा आप से असहमत हैं? (यदि ऐसा कुछ है जैसे "क्लोजर का समय बिल्कुल पाइथन के समय की तरह नहीं है", तो उत्तर के "मोटे तौर पर तुलनीय" भाग (साथ ही गर्मजोशी पर टिप्पणी) पर ध्यान दें और खुद से पूछें कि क्या यह वास्तव में पर्याप्त है-हम- इन-द-बॉलपार्क तुलनाओं की तरह ... यदि यह कुछ और है, तो मैं ईमानदारी से जानना चाहूंगा।) –

2

साथ ही, ध्यान दें कि आपकी क्लोज स्क्रिप्ट में 'सर्वर' विकल्प 'सर्वर जेवीएम' का उपयोग करेगा जो धीमी स्टार्टअप समय की लागत पर लंबी चल रही प्रक्रियाओं के लिए अनुकूलित है।

आपके जावा उदाहरण में यह विकल्प शामिल नहीं था, इसलिए शायद यह 'क्लाइंट जेवीएम' का उपयोग कर रहा है, जिसे तेज स्टार्टअप समय के लिए अनुकूलित किया गया है।

एक स्पष्ट तुलना के लिए जावा -jar clojure.jar -i hellofun.clj चलाने का प्रयास करें।

1

सामान्य रूप से जेवीएम में मूल या व्याख्या की गई भाषाओं के विपरीत कुछ हद तक धीमा स्टार्टअप समय होता है। उस के शीर्ष पर, क्लोजर स्टार्टअप समय पर काफी ओवरहेड जोड़ता है, क्योंकि यह स्टार्टअप पर बहुत अधिक कोड संकलित करता है और लोड करता है। एओटी के साथ भी, क्लोजर को चलाने से पहले कई चीजें सेट अप करने की ज़रूरत है।

नीचे की रेखा, छोटी अवधि की प्रक्रियाओं के लिए क्लोजर पर निर्भर न करें। ज्यादातर समय उन उपयोग मामलों के लिए जावा पर भरोसा न करें। कुछ मूल या नोड.जेएस, पायथन, लुआ इत्यादि की तरह व्याख्या की गई है।

मध्यम से लंबे समय तक चलने वाली प्रक्रियाओं के लिए, हालांकि क्लोजर औसतन लगभग सभी अन्य गतिशील भाषाओं में तेज होगा, जो पाइथन और रूबी को मार रहा है। क्लोजर को जावा के जितना तेज़ बनाया जा सकता है यदि बहुत प्रयास किए बिना जरूरी हो, और इसका जावा इंटर-ऑप इतना आसान है कि कुछ जावा को शुद्ध जावा में बदलकर आप ज्यादातर मामलों में जावा के बराबर गति प्राप्त कर सकते हैं।

अब, यदि आप वास्तव में क्लोजर के लिए कुछ जल्दी चाहते थे, तो मैं lumo में देखने की अनुशंसा करता हूं। यह एक क्लोजरस्क्रिप्ट आरईपीएल है जो स्वयं निहित है और बूटस्ट्रैप क्लोजरस्क्रिप्ट पर चल रहा है, इसलिए कोई JVM देखने के लिए नहीं है।

time python -c "print(\"Hello World\")" 
Hello World 

real 0m0.266s 
user 0m0.015s 
sys  0m0.202s 

time lumo -e "\"Hello World\"" 
"Hello World" 

real 0m0.438s 
user 0m0.000s 
sys  0m0.203s 

जैसा कि आप देख सकते हैं, लुमो Cpy3k की स्टार्टअप गति के बहुत करीब हो जाता है।

एक विकल्प, जो वास्तव में क्लोजर होने वाला नहीं है, लेकिन यह अभी भी क्लोजर प्रेरित लिस्प होगा, Hy है। पायथन पर चल रहे क्लोजर सिंटैक्स के साथ इसका एक लिस्प।

time hy -c "(print \"Hello World\")" 
Hello World 

real 0m0.902s 
user 0m0.000s 
sys  0m0.171s 

इसका स्टार्टअप समय थोड़ी धीमी तो दोनों Cpy3k और Lumo है, लेकिन यह आप Clojure की वाक्य रचना और मैक्रो के अपने निपटान में अजगर के सभी देता है।

+0

इसके लिए धन्यवाद! मैं कुछ समय के लिए लुमो का अनुसरण कर रहा हूं, साथ ही साथ एक परियोजना के लिए एक गंभीर विचार दिया है। क्या आपने कुछ भी उत्पादन स्तर के लिए हाई का उपयोग किया है? संपादित करें: इसके अलावा, 6 साल के बाद एक नया जवाब। अरे, समय उड़ता है। – viksit

+0

@viksit मैंने वास्तव में प्रोड में हाई का उपयोग नहीं किया है, बस अपने समय पर इसके साथ खिलवाड़ किया है। –

संबंधित मुद्दे