मुझे RxJS में ऑपरेटर पाइपलाइनों की दक्षता के बारे में स्पष्टीकरण की आवश्यकता है।

आरएक्सजेएस में ऑपरेटर पाइपलाइन के बारे में मेरा वर्तमान ज्ञान यह है कि पाइपलाइन के अंदर प्रत्येक ऑपरेटर एक अवलोकन योग्य प्राप्त करता है और एक नया (संभावित रूप से संशोधित) अवलोकन योग्य बनाता है जो इनपुट के रूप में अगले ऑपरेटर को वापस कर दिया जाता है। यह व्यवहार जावास्क्रिप्ट फ़िल्टर, मानचित्र, व्यवहार को कम करने के समान होगा। इस प्रकार मूल अवलोकन योग्य (धारा) या सरणी को अछूता/शुद्ध छोड़ देना।

यह धारणा RxJS दस्तावेज़ीकरण द्वारा समर्थित है: https://rxjs-dev.firebaseapp.com/ गाइड/ऑपरेटर

एक पाइपेबल ऑपरेटर एक ऐसा फ़ंक्शन है जो एक ऑब्जर्वेबल को अपने इनपुट के रूप में लेता है और दूसरा ऑब्जर्वेबल देता है। यह एक शुद्ध ऑपरेशन है: पिछला ऑब्जर्वेबल अपरिवर्तित रहता है।

लंबी ऑपरेटर पाइपलाइनों को ध्यान में रखते हुए मध्यवर्ती वेधशालाओं का निर्माण मुझे महंगा लगता है।

इसके अलावा मैं सर्गी मंसिला द्वारा लिखित पुस्तक 'रिएक्टिव प्रोग्रामिंग विद आरएक्सजेएस 5' पढ़ रहा हूं। मुझे पता है कि आरएक्सजेएस वर्तमान में संस्करण 6.5.3 पर है, लेकिन मुझे उम्मीद है कि तब से मूल तंत्र नहीं बदला है।

पुस्तक में पाइपलाइन की दक्षता के बारे में एक खंड है जो कहता है कि देखने योग्य पाइपलाइन मध्यवर्ती वेधशालाएं नहीं बनाती हैं। इसके बजाय वे एक ही बार में प्रत्येक तत्व पर सभी ऑपरेशन लागू करते हैं। जो समझ में आता है क्योंकि ऑपरेटर टेक(राशि) पहले राशि तत्वों को लेने के बाद अवलोकन योग्य स्ट्रीम को पूरा करता है। यह आलसी मूल्यांकन के बारे में भी बताता है जो स्रोत देखने योग्य स्ट्रीम को अधिकतम पर केवल एक बार या टेक शर्त पूरी होने तक ट्रैवर्स करता है।

import * as rxCore from 'https://dev.jspm.io/rxjs@6/_esm2015/index';
import * as rxOps from 'https://dev.jspm.io/rxjs@6/_esm2015/operators';

const numberStream = rxCore.range(0, 10);
numberStream.pipe(
    rxOps.map(number => number * number),     //creates Observable with [0,1,4,9,16,25,36,49,64,81]
    rxOps.filter(number => number % 2 === 0), //creates Observable with [0,4,16,36,64]
    rxOps.take(3)         //completes after [0,4,16]
).subscribe(console.log); //logs 0, 4, 16

क्या इस ऑपरेटर पाइपलाइन के अंदर कोई मध्यवर्ती वेधशालाएं बनाई जा रही हैं? या केवल पूरी पाइपलाइन एक नया अवलोकन योग्य बना रही है जिससे numberStream अछूता रह गया है? या वास्तव में मामला क्या है?

3
Tarexx 25 फरवरी 2020, 22:43
RxJS 6 एक बड़ा बदलाव था, मुझे विवरण नहीं पता लेकिन आपकी धारणा है कि यह नहीं बदलेगा क्योंकि वह पुस्तक अच्छी नहीं हो सकती है।
 – 
jonrsharpe
25 फरवरी 2020, 22:48
क्रोम में कम से कम V8 फ़ंक्शन इनलाइनिंग का समर्थन करता है। इसका मतलब है कि आंतरिक फ़ंक्शन सामग्री को कॉलर फ़ंक्शन में ले जाया जाता है। इससे प्रदर्शन में बहुत सुधार होता है और यह ठीक उसी तरह होता है जैसे आप उन्हें एक ही फ़ंक्शन में कहते हैं। इसके अलावा यदि आप एक लंबी पाइप लिखते हैं जो मैप्स/फिल्टर/स्विचमैप्स ... और अंत में एक साइड-इफेक्ट है, तो आप क्रोम डीफ टूल्स में देख सकते हैं, कि आपके पास फ़ंक्शन कॉल द्वारा पूर्ण न्यूनतम देरी है। जांचें: mattzeunert.com/2015/ 08/21/…
 – 
Jonathan Stellwag
26 फरवरी 2020, 01:19

2 जवाब

pipe() में पास होने के लिए आप अपना कस्टम ऑपरेटर कैसे बनाते हैं, इस पर गौर करके

source=>source.pipe(...) 

यह जो अपेक्षा करता है वह एक ऐसा फ़ंक्शन है जो वैकल्पिक रूप से संशोधित/संलग्न/स्रोत पर अधिक संचालन लागू करके अवलोकन योग्य देता है। मुझे लगता है कि यह तत्काल देखने योग्य नहीं है क्योंकि पाइप के अंत में आपके पास केवल एक स्रोत होगा।

0
Fan Cheung 26 फरवरी 2020, 08:29

लगभग हर RxJS ऑपरेटर इंटरमीडिएट ऑब्जर्वेबल बनाता है। वास्तव में, मुझे ऐसे ऑपरेटर का उदाहरण नहीं मिला है जो ऐसा नहीं करता है, इसलिए मैं मान सकता हूं कि वे सभी ऐसा करते हैं।

उदाहरण: map() आंतरिक रूप से ऑपरेटर कॉल lift विधि। lift क्या करता है कि यह नया ऑब्जर्वेबल बनाता है और वर्तमान ऑब्जर्वेबल को source ऑब्जर्वेबल घोषित करके इसे लौटाता है।

इसका मतलब है, कि आपके उदाहरण में range एक ऑब्जर्वेबल बनाता है, जबकि map, filter और take तीन नए ऑब्जर्वेबल बनाते हैं, उनमें से प्रत्येक में source ऑब्जर्वेबल है। वर्तमान से पहले बनाए गए से। तो, source, map के लिए ऑब्जर्वेबल, range आदि द्वारा निर्मित एक बन जाता है।

इसलिए, जब आप किसी भी ऑब्जर्वेबल की सदस्यता लें , यह कोशिश करता है source ऑब्जर्वेबल ऑपरेटर। map के मामले में, यह कॉल यह call तरीका है जो स्रोत Observable को सब्सक्राइब करता है। आपके मामले में, यह range द्वारा बनाए गए एक की सदस्यता लेगा। इस तरह, subscribe को स्रोत पर कॉल करना पहले ऑब्जर्वेबल (जिसमें source नहीं है) तक जाता है, जिसका अर्थ है कि कोई ऑपरेटर लागू नहीं किया गया है।

लंबी ऑपरेटर पाइपलाइनों को ध्यान में रखते हुए मध्यवर्ती वेधशालाओं का निर्माण मुझे महंगा लगता है।

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

पुस्तक में पाइपलाइन की दक्षता के बारे में एक खंड है जो कहता है कि देखने योग्य पाइपलाइन मध्यवर्ती वेधशालाएं नहीं बनाती हैं। इसके बजाय वे एक ही बार में प्रत्येक तत्व पर सभी ऑपरेशन लागू करते हैं।

खैर, मेरी राय में, यह आधा सच है। हां, वे प्रत्येक तत्व के लिए लागू ऑपरेटर हैं। , लेकिन सिंगल ऑब्जर्वेबल होने से नहीं, बल्कि कई बनाकर। शायद यह RxJS 5 से पहले का मामला था, लेकिन आज के संस्करणों के साथ नहीं।

0
Mladen 27 फरवरी 2020, 15:47