2009-12-31 12 views
9

के साथ जावास्क्रिप्ट मल्टीथ्रेडिंग संभव है, मैं वर्तमान में एक बहुत ही सरल मल्टीथ्रेडिंग इंजन को लागू करने के लिए IFRAMEs का उपयोग करने के विचार के साथ खेल रहा हूं। हालांकि मेरे प्रारंभिक परिणाम मुझे दिखा रहे हैं कि धागे में चलना सिर्फ एक धागे में चलने से धीमा है।IFRAMEs

मेरा परीक्षण है:

एकल थ्रेड

var start = new Date().getTime(); 
for (var i = 0; i < 300; i++) { /* Do costly processor operations */ } 
debug('Took: ' + new Date().getTime() - start); 

एकाधिक धागे

var start = new Date().getTime(); 
// In thread 1 
for (var i = 0; i < 100; i++) { /* Do costly processor operations */ } 
// In thread 2 
for (var i = 100; i < 200; i++) { /* Do costly processor operations */ } 
// In thread 3 
for (var i = 200; i < 300; i++) { /* Do costly processor operations */ } 
// In a callback in the original FRAME (thread) 
debug('Took: ' + new Date().getTime() - start); 

तो के रूप में देखा जा सकता है, मैं तो बस iframes के बीच कार्यभार बंटवारे कर रहा हूँ (उपरोक्त नोट कोड केवल मैं जो कर रहा हूं उसकी एक बेहतर तस्वीर देने के लिए है, यह कोड काम नहीं कर रहा है)।

तो मैं सोच रहा हूं कि FRAMEs फ़ायरफ़ॉक्स का उपयोग करने के बावजूद अभी भी केवल एक जेएस इंजन है? क्या यह धारणा सही है? (मेरे शोध बेवकूफ प्रतिपादन), क्या अन्य ब्राउज़र अलग हैं?

एक त्वरित Googles मैं इस लेख मिला कर: http://codediaries.blogspot.com/2009/12/real-javascript-multithreading-using.html

हालांकि प्रदर्शन में सुधार यहाँ हासिल होने की संभावना सिर्फ समानांतर HTTP अनुरोध कर के बजाय संसाधन क्षमता से अधिक हैं।

आपकी अंतर्दृष्टि के लिए धन्यवाद।

गुइडो

+0

आप लूप काउंटर में कुछ शून्य जोड़ते हैं?इसे क्रमश: 10000, 20000 और 30000 बनाएं और देखें कि क्या होता है। – chakrit

+0

चक्रित: मेरे वास्तविक परीक्षण पुनरावृत्तियों के 1000s का उपयोग कर रहे हैं, उपरोक्त उदाहरण सादगी के लिए छोटा है। – gatapia

+0

यह सुनिश्चित करने के लिए एक बात यह है कि आप भी ध्यान में रखते हैं जावास्क्रिप्ट टाइमर रिज़ॉल्यूशन है, जो अक्सर 15ms होता है: http://ejohn.org/blog/accuracy-of-javascript-time/ – Annie

उत्तर

0

नहीं है, जावास्क्रिप्ट आम तौर पर बहु ​​सूत्रण का समर्थन नहीं करता। अधिकांश दुभाषियों में पोर्टेबिलिटी कारणों के लिए शायद अंतर्निहित कोई बहु-थ्रेडिंग क्षमता नहीं है (जैसे PHP की तरह)।

हालांकि, Rhino इंजन जावा में पूरी तरह से लिखा गया है, तो आप may be able to tap into the Thread class, लेकिन यह केवल तभी संभव होगा जब आप सर्वर-पक्ष जावास्क्रिप्ट कर रहे हों।

+0

हाँ, मुझे सेटटाइमआउट दृष्टिकोणों से अवगत है, हालांकि कतार केवल एक ही धागे में काम करती है, इसलिए नहीं अच्छा। मैं बस उम्मीद कर रहा था कि iframes अपने स्वयं के दुभाषिया (इंजन) का उपयोग करेगा। – gatapia

+0

नहीं, यह इस तरह से काम नहीं करता है। यह अभी भी एक ब्राउज़र उदाहरण है। आपको एक नई विंडो लॉन्च करनी होगी, और मुझे यह भी यकीन नहीं है कि यह काम करेगा या नहीं। –

+0

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

-1

आप अपने ऑपरेशन को सेटटाइमआउट कॉल में लपेटने का प्रयास कर सकते हैं।

+1

'window.setTimeout' एक नया धागा नहीं बनाता है। –

3

HTML5 Web Workers मानक देखें कि जावास्क्रिप्ट थ्रेडिंग कैसा दिखना चाहिए। यह फ़ायरफ़ॉक्स 3.5, सफारी 4, और क्रोम 3 में लागू किया गया है, लेकिन आईई नहीं। यदि आप IE उपयोगकर्ताओं और पुराने ब्राउज़र के लिए प्लगइन की आवश्यकता के लिए तैयार हैं, तो Google Gears WorkerPool देखें।

+0

यह आज उपलब्ध है, 4 सबसे लोकप्रिय ब्राउज़रों में से 3 (फ़ायरफ़ॉक्स, सफारी, क्रोम) – Breton

+0

धन्यवाद ब्रेटन! मैंने अपनी पोस्ट अपडेट की। वेब श्रमिकों को पेश करने के लिए – Annie

+0

+1! यह मुझे कुछ गंभीर समय बचाने जा रहा है :) thx एनी – Mike

0

मैंने ब्राउज़र निर्भर समाधान पर निर्णय लिया है। मूल रूप से यदि उपलब्ध हो तो मैं Workers का उपयोग करूंगा, फिर उपलब्ध होने पर Gears। अंत में सिर्फ एक धागा।

धन्यवाद सभी

गुइडो

+0

आपको शायद एनी के जवाब को "स्वीकृत" के रूप में चुनना चाहिए (वोटिंग बटन के तहत उसके उत्तर के दाईं ओर बड़े चेकमार्क पर क्लिक करें)। इससे लोगों को पता चलेगा कि उनका जवाब आपकी आवश्यकताओं को पूरा करता है। –

0

setTimeout कॉल कुछ परिस्थितियों में एक अच्छा समाधान हो सकता है।

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

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