2016-09-26 8 views
7

की तुलना में तेजी मैं वेबकिट पर इस कोड को चलाने की आवश्यकता चलता है, यह एंड्रॉयड के लिए एक संकर एप्लिकेशन का एक हिस्सा है: https://jsbin.com/boduputebu/edit?js,consoleक्यों फ़ायरफ़ॉक्स इस कोड को 10x क्रोम

:

for(var x = 0; x < width; x++) { 
    for(var y = 0; y < height; y++) { 
     var i = (y * width + x) * 3; 
     var r = data[i]; 
     var g = data[i + 1]; 
     var b = data[i + 2]; 
     var green = is_green(r, g, b); 
     x_histogram[x] += green; 
     y_histogram[y] += green; 
    } 
} 

यहां परीक्षण का पूरा कोड है मैंने सोचा कि वी 8 फ़ायरफ़ॉक्स (स्पाइडरमोन्की) से तेज है, लेकिन यहां इस सरल कोड के लिए स्पाइडरमोन्की काफी तेज है। मेरे लैपटॉप पर प्रदर्शन है:

Chrome: 30 ms 
Node: 30 ms 
Firefox: 3 ms 
Java (same code with Java): 3 ms 

क्या आपके पास V8 पर तेज़ बनाने के लिए कोड बदलने का कोई विचार है। वर्तमान प्रदर्शन के साथ मुझे इसे जावा पक्ष पर मूल लिखना पड़ा, लेकिन यह मेरे लिए एक अच्छा विकल्प नहीं है। या यदि इसे तेज़ी से बनाने का कोई तरीका नहीं है तो क्या आप जानते हैं कि वी 8 इस कोड को बहुत धीमा क्यों चलाता है?

संस्करण:

Chrome: "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/51.0.2704.106 Safari/537.36" 
FireFox: "Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:49.0) Gecko/20100101 Firefox/49.0" 
+0

जबकि अंतर छोटे (8-9 बनाम 2.5-3 एमएस) है, मैं [पुन: पेश] कर सकते हैं (https://jsbin.com/nexocopuka/1/edit?js,console) इस। दिलचस्प। – Cerbrus

+1

एफएफ आपके मेटा डेटा को जितना ज्यादा क्रोम इकट्ठा करने में व्यस्त नहीं है? – Teemu

+0

क्या आप जावास्क्रिप्ट इंजन आंतरिक के बारे में तकनीकी स्पष्टीकरण चाहते हैं या बस अपने कोड में एक फिक्स चाहते हैं? –

उत्तर

4

यह त्वरित n गंदा कोड पहले से ही काफी तेजी v8 में है। (~ 1000x1000 डेटासेट के लिए 24ms)

var calc_histogram = function() { 
    for(var x = 0; x < width|0; x++) { 
     for(var y = 0; y < height|0; y++) { 
      var i = ((y * width + x) * 3)|0; 
      var r = data[i]|0; 
      var g = data[i + 1]|0; 
      var b = data[i + 2]|0; 
      var green = ((g > 80) && (g > (r + 35)|0) && (g > (b + 35)|0))|0; 
      x_histogram[x] += green|0; 
      y_histogram[y] += green|0; 
     } 
    } 
}; 

| 0 सुनिश्चित करना है कि संख्या एक पूर्णांक है, यह asm js तकनीक है। एक संख्या के साथ एक सरणी को कॉल करने के लिए यह सुनिश्चित करने के लिए आवश्यक है कि यह एक पूर्णांक है, 0 का उपयोग करके इसे स्पष्ट करता है।

संपादित करें: और यह सबसे तेज़ है जिसे मैं अनावश्यक के बिना प्राप्त करने का प्रबंधन करता हूं। 0। 500x500 के लिए ~ 4ms और 1000x1000 के लिए ~ 11। ध्यान दें कि मैंने लूप को उलटा कर दिया है, इसलिए यह प्रीफेच का लाभ लेने के लिए अनुक्रम में डेटा पढ़ता है, और मैंने सुधार को ध्यान में रखने के लिए एक बड़ा डेटासेट भी उपयोग किया।

var calc_histogram = function() { 
    var i=0; 
    for(var y = 0; y < height; y++) { 
     for(var x = 0; x < width; x++) { 
      var r = (data[i|0]+35)|0; 
      var g = data[(i+1)|0]; 
      var b = (data[(i+2)|0]+35)|0; 

      if((g > 80) && (g > r) && (g > b)){ 
       x_histogram[x]++; 
       y_histogram[y]++; 
      } 
      i=(i+3)|0; 
     } 
    } 
} 
+0

आपको केवल 'var green = ((g> 80) && (g> (r + 35) | 0) && (g> (b + 35) | 0)) | 0; 'का उपयोग करने की आवश्यकता है। शेष '0' महत्वहीन है। हालांकि, अच्छा लगता है। – Cerbrus

+0

@Cerbrus क्या आपने इसे बेंचमार्क किया था? मैंने पहले इसे आजमाया तो मैंने दूसरों के साथ और भी सुधार देखा। 0। – bokan

+0

हाँ, [मैंने किया] (https://jsbin.com/sowohefile/2/edit?js,console)। केवल उस पंक्ति में '0' के बीच का अंतर, और जब यह स्वागत के रूप में दूसरी पंक्तियों पर है, तो यह बहुत महत्वहीन है। – Cerbrus

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