2011-09-07 12 views
9

दो दिन पहले, जब मुझे jsperf.com मिला, जिसमें कई जावास्क्रिप्ट प्रदर्शन परीक्षणों का संग्रह है, तो मैंने कई परीक्षणों को ब्राउज़ किया।फ़ायरफ़ॉक्स और अन्य ब्राउज़र क्यों गणना करते हैं कि कौन सा नंबर बड़ा है?

परीक्षणों में से एक this था, जो Math.min(a,b) बनाम a<b?a:b की तुलना करता है। जब मैंने Google क्रोम पर यह परीक्षण चलाया, तो यह पता चला कि a<b?a:bMath.min(a,b) से अधिक तेज़ है (क्रोम 14 पर, पहला एक 53,661,381 ops/s है और दूसरा एक 419,830,711 ops/s है)। अन्य वेब ब्राउज़र के समान परिणाम हैं।

हालांकि, फ़ायरफ़ॉक्स पर, परिणाम विपरीत है। Math.min(a,b)a<b?a:b से बहुत तेज है! सबसे पहले एक 374,219,869 ops/s है और दूसरा एक 79,490,749 ops/s फ़ायरफ़ॉक्स 6.

enter image description here

पर है जब मैं फेसबुक पर पोस्ट किया, किसी ने कि "जब से फ़ायरफ़ॉक्स ओपन सोर्स प्रोजेक्ट है, डेवलपर्स अनुकूलित Math.min कहा, लेकिन गूगल क्रोम नहीं था चूंकि Google क्रोम क्रोमियम का सिर्फ एक संशोधन है ", लेकिन (उपर्युक्त कथन के बगल में यह बिल्कुल सही नहीं है) जिसका कोई मतलब नहीं है, क्योंकि यह कारण बताता नहीं है कि Google क्रोम का a<b?a:b और फ़ायरफ़ॉक्स का Math.min(a,b) समान गति में प्रदर्शन करता है, और Google क्रोम का Math.min(a,b) और फ़ायरफ़ॉक्स का a<b?a:b एक ही गति में प्रदर्शन करता है, क्योंकि अगर फ़ायरफ़ॉक्स Google क्रोम से तेज़ है, तो गूगल ई क्रोम का Math.min(a,b) फ़ायरफ़ॉक्स के a<b?a:b से बहुत धीमा होना चाहिए।

सारांश:

  1. अन्य ब्राउज़र पर, a<b?a:bMath.min(a,b) से तेज है।
  2. हालांकि, फ़ायरफ़ॉक्स पर Math.min(a,b)a<b?a:b से तेज़ है।
  3. Math.min(a,b) Firefox पर की गति के बाद से फ़ायरफ़ॉक्स गूगल क्रोम पर Math.min(a,b) की गति ≒ पर गूगल क्रोम पर a<b?a:b की गति और a<b?a:b की गति ≒, "फ़ायरफ़ॉक्स धीमी है" या "Firefox तेज है" एक कारण नहीं हो सकता ।

क्या कोई कारण है कि यह कैसे होता है?

+4

कारण? इसके अलावा नामित ब्राउज़रों में से प्रत्येक के पास जावास्क्रिप्ट का अपना कार्यान्वयन है और इसलिए उन्हें अनुकूलित करने के लिए स्वतंत्र हैं। – Jamiec

+0

@ जैमिक लेकिन मुझे लगता है कि 'ए <बी? ए: बी'' Math.min (ए, बी) 'से तेज है, क्योंकि 1.' Math.min (a, b) 'में 'a JiminP

+0

@Jiminip' Math.min' पर कॉल संकलित किया जाएगा और विधि शायद इनलाइन हो जाएगी। शायद फ़ायरफ़ॉक्स में यह सुपर-फास्ट कोड के साथ रेखांकित है जबकि 'if'' if' बनी हुई है। – xanatos

उत्तर

8

यहां कुछ चीजें चल रही हैं।

सबसे पहले, फ़ायरफ़ॉक्स 6 में दो अलग-अलग जेआईटी कंपाइलर्स हैं: TraceMonkey और JaegerMonkey। किसी दिए गए कोड के लिए कौन सा उपयोग किया जाता है कुछ ह्यूरिस्टिक्स पर निर्भर करता है; इन हेरिस्टिक्स फ़ंक्शन कॉल के साथ कोड के लिए TraceMonkey का पक्ष लेते हैं। ऐसा इसलिए होता है कि सरल पर्याप्त कोड के लिए TraceMonkey JaegerMonkey से लगभग हमेशा तेज है; विशेष रूप से यहां प्रस्तुत कोड के दोनों स्निपेट के लिए यह मामला है।

इस विशेष बेंचमार्क में, Math.min कोडपैथ Tracemonkey के साथ संकलित हो जाता है, क्योंकि यह एक फ़ंक्शन कॉल है। ट्रिनरी ऑपरेटर कोडपैथ जेगर मॉन्की के साथ संकलित हो जाता है।

आप फ़िल्टर क्षेत्र में jit डालकर jit पर जाकर और एक या दोनों TraceMonkey (सूची में tracejit) और JaegerMonkey (methodjit) को अक्षम करने के साथ प्रयोग कर सकते हैं।यदि आप ऐसा करते हैं, तो आप देखेंगे कि इस विशेष बेंचमार्क पर ट्रिनरी ऑपरेटर व्यक्तिगत रूप से प्रत्येक कंपाइलर के लिए Math.min से तेज़ है, इसलिए अन्य ब्राउज़रों की तुलना में आप जो उलटा देख रहे हैं वह अलग-अलग कंपाइलरों के उपयोग का एक कार्य है।

अब Math.min क्यों ट्रिनरी ऑपरेटर से धीमा है ... सबसे पहले इसे और अधिक काम करना है; यदि आप सावधानीपूर्वक परीक्षण करते हैं तो इसका जवाब ट्राइनरी ऑपरेटर के समान नहीं होता है। दूसरा, इसे आम तौर पर फ़ंक्शन कॉल के रूप में कार्यान्वित किया जाता है, जहां वह ओवरहेड से अधिक होता है (हालांकि TraceMonkey वास्तव में जेनरेट कोड में स्पष्ट रूप से इनलाइन करता है, यही कारण है कि दो स्निपेट का प्रदर्शन TraceMonkey में भिन्न नहीं है)।

1

मैं पढ़ने के बाद यह प्रश्न था, Efficient Javascript Dev.Opera पर, और कुछ अलग मानक चला रहा है। मुझे लगता है कि अनुभाग थोड़ा भ्रामक है। Math.min को धीमा करने वाली कई चीजें हैं लेकिन इनमें से कोई भी वास्तव में फ़ायरफ़ॉक्स या आईई 9 बनाम Google क्रोम पर प्रदर्शन की व्याख्या नहीं करता है।

चीजें मुझे लगता है कि Math.min धीमा

  • तर्क के उपयोग पर आपत्ति
  • यदि कोई मूल्य NaN
  • है की जाँच करने के है बनाता है इन्फिनिटी लौटने कोई आर्ग दिया जाता है और अगर की तरह
  • अन्य बातों + 0> -0

गहराई से जानकारी के लिए नमूना कार्यान्वयन के लिए http://qfox.nl/ecma/366 पर एक नज़र डालें।

पीएस मुझे पता है कि यह सवाल पुराना है, लेकिन मुझे लगता है कि अगर मैं कभी अतीत की यात्रा करता हूं तो यह मुझे थोडा समय बचा सकता है।

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