ಮುಂಬರುವ ಜಾವಾಸ್ಕ್ರಿಪ್ಟ್ ಇಟರೇಟರ್ ಹೆಲ್ಪರ್ಸ್ ಪ್ರಸ್ತಾಪವು ಸ್ಟ್ರೀಮ್ ಫ್ಯೂಷನ್ನೊಂದಿಗೆ ಡೇಟಾ ಸಂಸ್ಕರಣೆಯನ್ನು ಹೇಗೆ ಕ್ರಾಂತಿಗೊಳಿಸುತ್ತದೆ, ಮಧ್ಯಂತರ ಅರೇಗಳನ್ನು ತೆಗೆದುಹಾಕುತ್ತದೆ ಮತ್ತು ಲೇಜಿ ಇವ್ಯಾಲ್ಯುಯೇಷನ್ ಮೂಲಕ ಭಾರಿ ಕಾರ್ಯಕ್ಷಮತೆಯ ಲಾಭವನ್ನು ನೀಡುತ್ತದೆ ಎಂಬುದನ್ನು ಅನ್ವೇಷಿಸಿ.
ಜಾವಾಸ್ಕ್ರಿಪ್ಟ್ನ ಕಾರ್ಯಕ್ಷಮತೆಯ ಮುಂದಿನ ಜಿಗಿತ: ಇಟರೇಟರ್ ಹೆಲ್ಪರ್ ಸ್ಟ್ರೀಮ್ ಫ್ಯೂಷನ್ನ ಆಳವಾದ ನೋಟ
ಸಾಫ್ಟ್ವೇರ್ ಅಭಿವೃದ್ಧಿಯ ಜಗತ್ತಿನಲ್ಲಿ, ಕಾರ್ಯಕ್ಷಮತೆಗಾಗಿನ ಅನ್ವೇಷಣೆ ಒಂದು ನಿರಂತರ ಪ್ರಯಾಣ. ಜಾವಾಸ್ಕ್ರಿಪ್ಟ್ ಡೆವಲಪರ್ಗಳಿಗೆ, ಡೇಟಾ ಮ್ಯಾನಿಪ್ಯುಲೇಷನ್ಗಾಗಿ .map(), .filter(), ಮತ್ತು .reduce() ನಂತಹ ಅರೇ ಮೆಥಡ್ಗಳನ್ನು ಚೈನ್ ಮಾಡುವುದು ಒಂದು ಸಾಮಾನ್ಯ ಮತ್ತು ಸೊಗಸಾದ ಮಾದರಿಯಾಗಿದೆ. ಈ ಫ್ಲೂಯೆಂಟ್ API ಓದಲು ಸುಲಭ ಮತ್ತು ಅಭಿವ್ಯಕ್ತವಾಗಿದೆ, ಆದರೆ ಇದು ಒಂದು ಗಮನಾರ್ಹ ಕಾರ್ಯಕ್ಷಮತೆಯ ಅಡಚಣೆಯನ್ನು ಮರೆಮಾಡುತ್ತದೆ: ಮಧ್ಯಂತರ ಅರೇಗಳ ರಚನೆ. ಚೈನ್ನಲ್ಲಿನ ಪ್ರತಿ ಹಂತವು ಹೊಸ ಅರೇಯನ್ನು ರಚಿಸುತ್ತದೆ, ಇದು ಮೆಮೊರಿ ಮತ್ತು CPU ಸೈಕಲ್ಗಳನ್ನು ಬಳಸುತ್ತದೆ. ದೊಡ್ಡ ಡೇಟಾಸೆಟ್ಗಳಿಗೆ, ಇದು ಕಾರ್ಯಕ್ಷಮತೆಯ ದುರಂತವಾಗಬಹುದು.
TC39 ಇಟರೇಟರ್ ಹೆಲ್ಪರ್ಸ್ ಪ್ರಸ್ತಾಪವನ್ನು ಪರಿಚಯಿಸಲಾಗುತ್ತಿದೆ, ಇದು ECMAScript ಸ್ಟ್ಯಾಂಡರ್ಡ್ಗೆ ಒಂದು ಕ್ರಾಂತಿಕಾರಕ ಸೇರ್ಪಡೆಯಾಗಿದ್ದು, ಜಾವಾಸ್ಕ್ರಿಪ್ಟ್ನಲ್ಲಿ ನಾವು ಡೇಟಾ ಸಂಗ್ರಹಣೆಗಳನ್ನು ಸಂಸ್ಕರಿಸುವ ವಿಧಾನವನ್ನು ಮರು ವ್ಯಾಖ್ಯಾನಿಸಲು ಸಿದ್ಧವಾಗಿದೆ. ಇದರ ಹೃದಯಭಾಗದಲ್ಲಿ ಸ್ಟ್ರೀಮ್ ಫ್ಯೂಷನ್ (ಅಥವಾ ಆಪರೇಷನ್ ಫ್ಯೂಷನ್) ಎಂದು ಕರೆಯಲ್ಪಡುವ ಪ್ರಬಲ ಆಪ್ಟಿಮೈಸೇಶನ್ ತಂತ್ರವಿದೆ. ಈ ಲೇಖನವು ಈ ಹೊಸ ಮಾದರಿಯ ಸಮಗ್ರ ಪರಿಶೋಧನೆಯನ್ನು ಒದಗಿಸುತ್ತದೆ, ಅದು ಹೇಗೆ ಕಾರ್ಯನಿರ್ವಹಿಸುತ್ತದೆ, ಅದು ಏಕೆ ಮುಖ್ಯ, ಮತ್ತು ಅದು ಡೆವಲಪರ್ಗಳಿಗೆ ಹೆಚ್ಚು ದಕ್ಷ, ಮೆಮೊರಿ-ಸ್ನೇಹಿ, ಮತ್ತು ಶಕ್ತಿಯುತ ಕೋಡ್ ಬರೆಯಲು ಹೇಗೆ ಅಧಿಕಾರ ನೀಡುತ್ತದೆ ಎಂಬುದನ್ನು ವಿವರಿಸುತ್ತದೆ.
ಸಾಂಪ್ರದಾಯಿಕ ಚೈನಿಂಗ್ನೊಂದಿಗಿನ ಸಮಸ್ಯೆ: ಮಧ್ಯಂತರ ಅರೇಗಳ ಕಥೆ
ಇಟರೇಟರ್ ಹೆಲ್ಪರ್ಗಳ ಆವಿಷ್ಕಾರವನ್ನು ಸಂಪೂರ್ಣವಾಗಿ ಪ್ರಶಂಸಿಸಲು, ನಾವು ಮೊದಲು ಪ್ರಸ್ತುತ, ಅರೇ-ಆಧಾರಿತ ವಿಧಾನದ ಮಿತಿಗಳನ್ನು ಅರ್ಥಮಾಡಿಕೊಳ್ಳಬೇಕು. ಒಂದು ಸರಳ, ದೈನಂದಿನ ಕಾರ್ಯವನ್ನು ಪರಿಗಣಿಸೋಣ: ಸಂಖ್ಯೆಗಳ ಪಟ್ಟಿಯಿಂದ, ನಾವು ಮೊದಲ ಐದು ಸಮ ಸಂಖ್ಯೆಗಳನ್ನು ಕಂಡುಹಿಡಿದು, ಅವುಗಳನ್ನು ದ್ವಿಗುಣಗೊಳಿಸಿ, ಮತ್ತು ಫಲಿತಾಂಶಗಳನ್ನು ಸಂಗ್ರಹಿಸಲು ಬಯಸುತ್ತೇವೆ.
ಸಾಂಪ್ರದಾಯಿಕ ವಿಧಾನ
ಸ್ಟ್ಯಾಂಡರ್ಡ್ ಅರೇ ಮೆಥಡ್ಗಳನ್ನು ಬಳಸಿ, ಕೋಡ್ ಸ್ವಚ್ಛ ಮತ್ತು ಅರ್ಥಗರ್ಭಿತವಾಗಿದೆ:
const numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, ...]; // ಒಂದು ಅತಿ ದೊಡ್ಡ ಅರೇಯನ್ನು ಕಲ್ಪಿಸಿಕೊಳ್ಳಿ
const result = numbers
.filter(n => n % 2 === 0) // ಹಂತ 1: ಸಮ ಸಂಖ್ಯೆಗಳಿಗಾಗಿ ಫಿಲ್ಟರ್ ಮಾಡಿ
.map(n => n * 2) // ಹಂತ 2: ಅವುಗಳನ್ನು ದ್ವಿಗುಣಗೊಳಿಸಿ
.slice(0, 5); // ಹಂತ 3: ಮೊದಲ ಐದನ್ನು ತೆಗೆದುಕೊಳ್ಳಿ
ಈ ಕೋಡ್ ಸಂಪೂರ್ಣವಾಗಿ ಓದಬಲ್ಲದು, ಆದರೆ ಜಾವಾಸ್ಕ್ರಿಪ್ಟ್ ಇಂಜಿನ್ ತೆರೆಮರೆಯಲ್ಲಿ ಏನು ಮಾಡುತ್ತದೆ ಎಂಬುದನ್ನು ವಿಭಜಿಸೋಣ, ವಿಶೇಷವಾಗಿ numbers ಲಕ್ಷಾಂತರ ಎಲಿಮೆಂಟ್ಗಳನ್ನು ಹೊಂದಿದ್ದರೆ.
- ಇಟರೇಷನ್ 1 (
.filter()): ಇಂಜಿನ್ ಸಂಪೂರ್ಣnumbersಅರೇಯ ಮೂಲಕ ಇಟರೇಟ್ ಮಾಡುತ್ತದೆ. ಇದು ಮೆಮೊರಿಯಲ್ಲಿ ಒಂದು ಹೊಸ ಮಧ್ಯಂತರ ಅರೇಯನ್ನು ರಚಿಸುತ್ತದೆ, ಅದನ್ನುevenNumbersಎಂದು ಕರೆಯೋಣ, ಇದು ಪರೀಕ್ಷೆಯಲ್ಲಿ ಉತ್ತೀರ್ಣರಾದ ಎಲ್ಲಾ ಸಂಖ್ಯೆಗಳನ್ನು ಹಿಡಿದಿಡುತ್ತದೆ.numbersಒಂದು ಮಿಲಿಯನ್ ಎಲಿಮೆಂಟ್ಗಳನ್ನು ಹೊಂದಿದ್ದರೆ, ಇದು ಸರಿಸುಮಾರು 500,000 ಎಲಿಮೆಂಟ್ಗಳ ಅರೇ ಆಗಿರಬಹುದು. - ಇಟರೇಷನ್ 2 (
.map()): ಇಂಜಿನ್ ಈಗ ಸಂಪೂರ್ಣevenNumbersಅರೇಯ ಮೂಲಕ ಇಟರೇಟ್ ಮಾಡುತ್ತದೆ. ಇದು ಮ್ಯಾಪಿಂಗ್ ಕಾರ್ಯಾಚರಣೆಯ ಫಲಿತಾಂಶವನ್ನು ಸಂಗ್ರಹಿಸಲು ಎರಡನೇ ಮಧ್ಯಂತರ ಅರೇಯನ್ನು ರಚಿಸುತ್ತದೆ, ಅದನ್ನುdoubledNumbersಎಂದು ಕರೆಯೋಣ. ಇದು ಮತ್ತೊಂದು 500,000 ಎಲಿಮೆಂಟ್ಗಳ ಅರೇ ಆಗಿದೆ. - ಇಟರೇಷನ್ 3 (
.slice()): ಅಂತಿಮವಾಗಿ, ಇಂಜಿನ್doubledNumbersನಿಂದ ಮೊದಲ ಐದು ಎಲಿಮೆಂಟ್ಗಳನ್ನು ತೆಗೆದುಕೊಂಡು ಮೂರನೇ, ಅಂತಿಮ ಅರೇಯನ್ನು ರಚಿಸುತ್ತದೆ.
ಅದೃಶ್ಯ ವೆಚ್ಚಗಳು
ಈ ಪ್ರಕ್ರಿಯೆಯು ಹಲವಾರು ನಿರ್ಣಾಯಕ ಕಾರ್ಯಕ್ಷಮತೆಯ ಸಮಸ್ಯೆಗಳನ್ನು ಬಹಿರಂಗಪಡಿಸುತ್ತದೆ:
- ಹೆಚ್ಚಿನ ಮೆಮೊರಿ ಹಂಚಿಕೆ: ನಾವು ತಕ್ಷಣವೇ ಬಿಸಾಡಲ್ಪಟ್ಟ ಎರಡು ದೊಡ್ಡ ತಾತ್ಕಾಲಿಕ ಅರೇಗಳನ್ನು ರಚಿಸಿದ್ದೇವೆ. ಅತಿ ದೊಡ್ಡ ಡೇಟಾಸೆಟ್ಗಳಿಗೆ, ಇದು ಗಮನಾರ್ಹ ಮೆಮೊರಿ ಒತ್ತಡಕ್ಕೆ ಕಾರಣವಾಗಬಹುದು, ಸಂಭಾವ್ಯವಾಗಿ ಅಪ್ಲಿಕೇಶನ್ ನಿಧಾನವಾಗಲು ಅಥವಾ ಕ್ರ್ಯಾಶ್ ಆಗಲು ಕಾರಣವಾಗಬಹುದು.
- ಗಾರ್ಬೇಜ್ ಕಲೆಕ್ಷನ್ ಓವರ್ಹೆಡ್: ನೀವು ಹೆಚ್ಚು ತಾತ್ಕಾಲಿಕ ಆಬ್ಜೆಕ್ಟ್ಗಳನ್ನು ರಚಿಸಿದಂತೆ, ಗಾರ್ಬೇಜ್ ಕಲೆಕ್ಟರ್ ಅವುಗಳನ್ನು ಸ್ವಚ್ಛಗೊಳಿಸಲು ಹೆಚ್ಚು ಶ್ರಮಿಸಬೇಕಾಗುತ್ತದೆ, ಇದು ವಿರಾಮಗಳು ಮತ್ತು ಕಾರ್ಯಕ್ಷಮತೆಯ ತೊದಲುವಿಕೆಗೆ ಕಾರಣವಾಗುತ್ತದೆ.
- ವ್ಯರ್ಥವಾದ ಗಣನೆ: ನಾವು ಲಕ್ಷಾಂತರ ಎಲಿಮೆಂಟ್ಗಳ ಮೇಲೆ ಅನೇಕ ಬಾರಿ ಇಟರೇಟ್ ಮಾಡಿದ್ದೇವೆ. ಇನ್ನೂ ಕೆಟ್ಟದಾಗಿ, ನಮ್ಮ ಅಂತಿಮ ಗುರಿ ಕೇವಲ ಐದು ಫಲಿತಾಂಶಗಳನ್ನು ಪಡೆಯುವುದಾಗಿತ್ತು. ಆದರೂ,
.filter()ಮತ್ತು.map()ಮೆಥಡ್ಗಳು ಸಂಪೂರ್ಣ ಡೇಟಾಸೆಟ್ ಅನ್ನು ಸಂಸ್ಕರಿಸಿದವು,.slice()ಹೆಚ್ಚಿನ ಕೆಲಸವನ್ನು ತಿರಸ್ಕರಿಸುವ ಮೊದಲು ಲಕ್ಷಾಂತರ ಅನಗತ್ಯ ಲೆಕ್ಕಾಚಾರಗಳನ್ನು ನಿರ್ವಹಿಸಿದವು.
ಇಟರೇಟರ್ ಹೆಲ್ಪರ್ಸ್ ಮತ್ತು ಸ್ಟ್ರೀಮ್ ಫ್ಯೂಷನ್ ಪರಿಹರಿಸಲು ವಿನ್ಯಾಸಗೊಳಿಸಲಾದ ಮೂಲಭೂತ ಸಮಸ್ಯೆ ಇದಾಗಿದೆ.
ಇಟರೇಟರ್ ಹೆಲ್ಪರ್ಸ್ ಪರಿಚಯ: ಡೇಟಾ ಸಂಸ್ಕರಣೆಗಾಗಿ ಒಂದು ಹೊಸ ಮಾದರಿ
ಇಟರೇಟರ್ ಹೆಲ್ಪರ್ಸ್ ಪ್ರಸ್ತಾಪವು Iterator.prototype ಗೆ ನೇರವಾಗಿ ಪರಿಚಿತ ಮೆಥಡ್ಗಳ ಸೂಟ್ ಅನ್ನು ಸೇರಿಸುತ್ತದೆ. ಇದರರ್ಥ ಇಟರೇಟರ್ ಆಗಿರುವ ಯಾವುದೇ ಆಬ್ಜೆಕ್ಟ್ (ಜನರೇಟರ್ಗಳು, ಮತ್ತು Array.prototype.values() ನಂತಹ ಮೆಥಡ್ಗಳ ಫಲಿತಾಂಶ ಸೇರಿದಂತೆ) ಈ ಶಕ್ತಿಯುತ ಹೊಸ ಉಪಕರಣಗಳಿಗೆ ಪ್ರವೇಶವನ್ನು ಪಡೆಯುತ್ತದೆ.
ಕೆಲವು ಪ್ರಮುಖ ಮೆಥಡ್ಗಳು ಸೇರಿವೆ:
.map(mapperFn).filter(filterFn).take(limit).drop(limit).flatMap(mapperFn).reduce(reducerFn, initialValue).toArray().forEach(fn).some(fn).every(fn).find(fn)
ಈ ಹೊಸ ಹೆಲ್ಪರ್ಗಳನ್ನು ಬಳಸಿ ನಮ್ಮ ಹಿಂದಿನ ಉದಾಹರಣೆಯನ್ನು ಪುನಃ ಬರೆಯೋಣ:
const numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, ...];
const result = numbers.values() // 1. ಅರೇಯಿಂದ ಇಟರೇಟರ್ ಪಡೆಯಿರಿ
.filter(n => n % 2 === 0) // 2. ಫಿಲ್ಟರ್ ಇಟರೇಟರ್ ರಚಿಸಿ
.map(n => n * 2) // 3. ಮ್ಯಾಪ್ ಇಟರೇಟರ್ ರಚಿಸಿ
.take(5) // 4. ಟೇಕ್ ಇಟರೇಟರ್ ರಚಿಸಿ
.toArray(); // 5. ಚೈನ್ ಅನ್ನು ಕಾರ್ಯಗತಗೊಳಿಸಿ ಮತ್ತು ಫಲಿತಾಂಶಗಳನ್ನು ಸಂಗ್ರಹಿಸಿ
ಮೊದಲ ನೋಟದಲ್ಲಿ, ಕೋಡ್ ಗಮನಾರ್ಹವಾಗಿ ಹೋಲುತ್ತದೆ. ಪ್ರಮುಖ ವ್ಯತ್ಯಾಸವೆಂದರೆ ಆರಂಭದ ಬಿಂದು—numbers.values()—ಇದು ಅರೇಯ ಬದಲು ಇಟರೇಟರ್ ಅನ್ನು ಹಿಂದಿರುಗಿಸುತ್ತದೆ, ಮತ್ತು ಟರ್ಮಿನಲ್ ಕಾರ್ಯಾಚರಣೆ—.toArray()—ಇದು ಅಂತಿಮ ಫಲಿತಾಂಶವನ್ನು ಉತ್ಪಾದಿಸಲು ಇಟರೇಟರ್ ಅನ್ನು ಬಳಸುತ್ತದೆ. ನಿಜವಾದ ಮ್ಯಾಜಿಕ್, ಆದಾಗ್ಯೂ, ಈ ಎರಡು ಬಿಂದುಗಳ ನಡುವೆ ಏನು ನಡೆಯುತ್ತದೆ ಎಂಬುದರಲ್ಲಿದೆ.
ಈ ಚೈನ್ ಯಾವುದೇ ಮಧ್ಯಂತರ ಅರೇಗಳನ್ನು ರಚಿಸುವುದಿಲ್ಲ. ಬದಲಾಗಿ, ಇದು ಹಿಂದಿನದನ್ನು ಸುತ್ತುವರೆದಿರುವ ಹೊಸ, ಹೆಚ್ಚು ಸಂಕೀರ್ಣವಾದ ಇಟರೇಟರ್ ಅನ್ನು ನಿರ್ಮಿಸುತ್ತದೆ. ಗಣನೆಯನ್ನು ಮುಂದೂಡಲಾಗುತ್ತದೆ. .toArray() ಅಥವಾ .reduce() ನಂತಹ ಟರ್ಮಿನಲ್ ಮೆಥಡ್ ಅನ್ನು ಮೌಲ್ಯಗಳನ್ನು ಬಳಸಲು ಕರೆಯುವವರೆಗೂ ಏನೂ ಆಗುವುದಿಲ್ಲ. ಈ ತತ್ವವನ್ನು ಲೇಜಿ ಇವ್ಯಾಲ್ಯುಯೇಷನ್ ಎಂದು ಕರೆಯಲಾಗುತ್ತದೆ.
ಸ್ಟ್ರೀಮ್ ಫ್ಯೂಷನ್ನ ಮ್ಯಾಜಿಕ್: ಒಂದು ಸಮಯದಲ್ಲಿ ಒಂದು ಎಲಿಮೆಂಟ್ ಅನ್ನು ಸಂಸ್ಕರಿಸುವುದು
ಸ್ಟ್ರೀಮ್ ಫ್ಯೂಷನ್ ಲೇಜಿ ಇವ್ಯಾಲ್ಯುಯೇಷನ್ ಅನ್ನು ಅಷ್ಟು ದಕ್ಷವಾಗಿಸುವ ಕಾರ್ಯವಿಧಾನವಾಗಿದೆ. ಸಂಪೂರ್ಣ ಸಂಗ್ರಹಣೆಯನ್ನು ಪ್ರತ್ಯೇಕ ಹಂತಗಳಲ್ಲಿ ಸಂಸ್ಕರಿಸುವ ಬದಲು, ಇದು ಪ್ರತಿ ಎಲಿಮೆಂಟ್ ಅನ್ನು ಕಾರ್ಯಾಚರಣೆಗಳ ಸಂಪೂರ್ಣ ಚೈನ್ ಮೂಲಕ ಪ್ರತ್ಯೇಕವಾಗಿ ಸಂಸ್ಕರಿಸುತ್ತದೆ.
ಅಸೆಂಬ್ಲಿ ಲೈನ್ ಸಾದೃಶ್ಯ
ಒಂದು ಉತ್ಪಾದನಾ ಘಟಕವನ್ನು ಕಲ್ಪಿಸಿಕೊಳ್ಳಿ. ಸಾಂಪ್ರದಾಯಿಕ ಅರೇ ವಿಧಾನವು ಪ್ರತಿ ಹಂತಕ್ಕೂ ಪ್ರತ್ಯೇಕ ಕೊಠಡಿಗಳನ್ನು ಹೊಂದುವಂತಿದೆ:
- ಕೊಠಡಿ 1 (ಫಿಲ್ಟರಿಂಗ್): ಎಲ್ಲಾ ಕಚ್ಚಾ ವಸ್ತುಗಳನ್ನು (ಸಂಪೂರ್ಣ ಅರೇ) ತರಲಾಗುತ್ತದೆ. ಕೆಲಸಗಾರರು ಕೆಟ್ಟದ್ದನ್ನು ಫಿಲ್ಟರ್ ಮಾಡುತ್ತಾರೆ. ಒಳ್ಳೆಯವುಗಳನ್ನು ಒಂದು ದೊಡ್ಡ ತೊಟ್ಟಿಯಲ್ಲಿ ಇರಿಸಲಾಗುತ್ತದೆ (ಮೊದಲ ಮಧ್ಯಂತರ ಅರೇ).
- ಕೊಠಡಿ 2 (ಮ್ಯಾಪಿಂಗ್): ಒಳ್ಳೆಯ ವಸ್ತುಗಳ ಸಂಪೂರ್ಣ ತೊಟ್ಟಿಯನ್ನು ಮುಂದಿನ ಕೊಠಡಿಗೆ ಸಾಗಿಸಲಾಗುತ್ತದೆ. ಇಲ್ಲಿ, ಕೆಲಸಗಾರರು ಪ್ರತಿ ಐಟಂ ಅನ್ನು ಮಾರ್ಪಡಿಸುತ್ತಾರೆ. ಮಾರ್ಪಡಿಸಿದ ಐಟಂಗಳನ್ನು ಮತ್ತೊಂದು ದೊಡ್ಡ ತೊಟ್ಟಿಯಲ್ಲಿ ಇರಿಸಲಾಗುತ್ತದೆ (ಎರಡನೇ ಮಧ್ಯಂತರ ಅರೇ).
- ಕೊಠಡಿ 3 (ಟೇಕಿಂಗ್): ಎರಡನೇ ತೊಟ್ಟಿಯನ್ನು ಅಂತಿಮ ಕೊಠಡಿಗೆ ಸಾಗಿಸಲಾಗುತ್ತದೆ, ಅಲ್ಲಿ ಒಬ್ಬ ಕೆಲಸಗಾರನು ಮೇಲಿನಿಂದ ಮೊದಲ ಐದು ಐಟಂಗಳನ್ನು ತೆಗೆದುಕೊಂಡು ಉಳಿದದ್ದನ್ನು ಬಿಸಾಡುತ್ತಾನೆ.
ಈ ಪ್ರಕ್ರಿಯೆಯು ಸಾರಿಗೆ (ಮೆಮೊರಿ ಹಂಚಿಕೆ) ಮತ್ತು ಶ್ರಮ (ಗಣನೆ) ದೃಷ್ಟಿಯಿಂದ ವ್ಯರ್ಥವಾಗಿದೆ.
ಇಟರೇಟರ್ ಹೆಲ್ಪರ್ಗಳಿಂದ ಚಾಲಿತ ಸ್ಟ್ರೀಮ್ ಫ್ಯೂಷನ್, ಆಧುನಿಕ ಅಸೆಂಬ್ಲಿ ಲೈನ್ನಂತಿದೆ:
- ಒಂದು ಏಕ ಕನ್ವೇಯರ್ ಬೆಲ್ಟ್ ಎಲ್ಲಾ ನಿಲ್ದಾಣಗಳ ಮೂಲಕ ಹಾದುಹೋಗುತ್ತದೆ.
- ಒಂದು ಐಟಂ ಅನ್ನು ಬೆಲ್ಟ್ ಮೇಲೆ ಇರಿಸಲಾಗುತ್ತದೆ. ಅದು ಫಿಲ್ಟರಿಂಗ್ ನಿಲ್ದಾಣಕ್ಕೆ ಚಲಿಸುತ್ತದೆ. ಅದು ವಿಫಲವಾದರೆ, ಅದನ್ನು ತೆಗೆದುಹಾಕಲಾಗುತ್ತದೆ. ಅದು ಉತ್ತೀರ್ಣರಾದರೆ, ಅದು ಮುಂದುವರಿಯುತ್ತದೆ.
- ಅದು ತಕ್ಷಣವೇ ಮ್ಯಾಪಿಂಗ್ ನಿಲ್ದಾಣಕ್ಕೆ ಚಲಿಸುತ್ತದೆ, ಅಲ್ಲಿ ಅದನ್ನು ಮಾರ್ಪಡಿಸಲಾಗುತ್ತದೆ.
- ನಂತರ ಅದು ಎಣಿಕೆ ನಿಲ್ದಾಣಕ್ಕೆ (ಟೇಕ್) ಚಲಿಸುತ್ತದೆ. ಒಬ್ಬ ಮೇಲ್ವಿಚಾರಕ ಅದನ್ನು ಎಣಿಸುತ್ತಾನೆ.
- ಮೇಲ್ವಿಚಾರಕನು ಐದು ಯಶಸ್ವಿ ಐಟಂಗಳನ್ನು ಎಣಿಸುವವರೆಗೆ ಇದು ಒಂದು ಸಮಯದಲ್ಲಿ ಒಂದು ಐಟಂ ಮುಂದುವರಿಯುತ್ತದೆ. ಆ ಹಂತದಲ್ಲಿ, ಮೇಲ್ವಿಚಾರಕ "ನಿಲ್ಲಿಸಿ!" ಎಂದು ಕೂಗುತ್ತಾನೆ ಮತ್ತು ಇಡೀ ಅಸೆಂಬ್ಲಿ ಲೈನ್ ಸ್ಥಗಿತಗೊಳ್ಳುತ್ತದೆ.
ಈ ಮಾದರಿಯಲ್ಲಿ, ಮಧ್ಯಂತರ ಉತ್ಪನ್ನಗಳ ದೊಡ್ಡ ತೊಟ್ಟಿಗಳಿಲ್ಲ, ಮತ್ತು ಕೆಲಸ ಮುಗಿದ ಕ್ಷಣದಲ್ಲಿ ಲೈನ್ ನಿಲ್ಲುತ್ತದೆ. ಇಟರೇಟರ್ ಹೆಲ್ಪರ್ ಸ್ಟ್ರೀಮ್ ಫ್ಯೂಷನ್ ನಿಖರವಾಗಿ ಹೀಗೆ ಕಾರ್ಯನಿರ್ವಹಿಸುತ್ತದೆ.
ಹಂತ-ಹಂತದ ವಿಶ್ಲೇಷಣೆ
ನಮ್ಮ ಇಟರೇಟರ್ ಉದಾಹರಣೆಯ ಕಾರ್ಯಗತಗೊಳಿಸುವಿಕೆಯನ್ನು ಪತ್ತೆಹಚ್ಚೋಣ:numbers.values().filter(...).map(...).take(5).toArray().
.toArray()ಅನ್ನು ಕರೆಯಲಾಗುತ್ತದೆ. ಅದಕ್ಕೆ ಒಂದು ಮೌಲ್ಯ ಬೇಕು. ಅದು ತನ್ನ ಮೂಲ,take(5)ಇಟರೇಟರ್ ಅನ್ನು, ಅದರ ಮೊದಲ ಐಟಂಗೆ ಕೇಳುತ್ತದೆ.take(5)ಇಟರೇಟರ್ಗೆ ಎಣಿಸಲು ಒಂದು ಐಟಂ ಬೇಕು. ಅದು ತನ್ನ ಮೂಲ,mapಇಟರೇಟರ್ ಅನ್ನು, ಒಂದು ಐಟಂಗೆ ಕೇಳುತ್ತದೆ.mapಇಟರೇಟರ್ಗೆ ಪರಿವರ್ತಿಸಲು ಒಂದು ಐಟಂ ಬೇಕು. ಅದು ತನ್ನ ಮೂಲ,filterಇಟರೇಟರ್ ಅನ್ನು, ಒಂದು ಐಟಂಗೆ ಕೇಳುತ್ತದೆ.filterಇಟರೇಟರ್ಗೆ ಪರೀಕ್ಷಿಸಲು ಒಂದು ಐಟಂ ಬೇಕು. ಅದು ಮೂಲ ಅರೇ ಇಟರೇಟರ್ನಿಂದ ಮೊದಲ ಮೌಲ್ಯವನ್ನು ಎಳೆಯುತ್ತದೆ:1.- '1' ರ ಪಯಣ: ಫಿಲ್ಟರ್
1 % 2 === 0ಎಂದು ಪರಿಶೀಲಿಸುತ್ತದೆ. ಇದು ಸುಳ್ಳು. ಫಿಲ್ಟರ್ ಇಟರೇಟರ್1ಅನ್ನು ತಿರಸ್ಕರಿಸುತ್ತದೆ ಮತ್ತು ಮೂಲದಿಂದ ಮುಂದಿನ ಮೌಲ್ಯವನ್ನು ಎಳೆಯುತ್ತದೆ:2. - '2' ರ ಪಯಣ:
- ಫಿಲ್ಟರ್
2 % 2 === 0ಎಂದು ಪರಿಶೀಲಿಸುತ್ತದೆ. ಇದು ಸತ್ಯ. ಅದು2ಅನ್ನುmapಇಟರೇಟರ್ಗೆ ರವಾನಿಸುತ್ತದೆ. mapಇಟರೇಟರ್2ಅನ್ನು ಸ್ವೀಕರಿಸುತ್ತದೆ,2 * 2ಎಂದು ಲೆಕ್ಕಾಚಾರ ಮಾಡುತ್ತದೆ, ಮತ್ತು ಫಲಿತಾಂಶ,4ಅನ್ನು,takeಇಟರೇಟರ್ಗೆ ರವಾನಿಸುತ್ತದೆ.takeಇಟರೇಟರ್4ಅನ್ನು ಸ್ವೀಕರಿಸುತ್ತದೆ. ಅದು ತನ್ನ ಆಂತರಿಕ ಕೌಂಟರ್ ಅನ್ನು ಕಡಿಮೆ ಮಾಡುತ್ತದೆ (5 ರಿಂದ 4 ಕ್ಕೆ) ಮತ್ತು4ಅನ್ನುtoArray()ಗ್ರಾಹಕನಿಗೆ ನೀಡುತ್ತದೆ. ಮೊದಲ ಫಲಿತಾಂಶವು ಕಂಡುಬಂದಿದೆ.
- ಫಿಲ್ಟರ್
toArray()ಒಂದು ಮೌಲ್ಯವನ್ನು ಹೊಂದಿದೆ. ಅದುtake(5)ಅನ್ನು ಮುಂದಿನದಕ್ಕೆ ಕೇಳುತ್ತದೆ. ಸಂಪೂರ್ಣ ಪ್ರಕ್ರಿಯೆಯು ಪುನರಾವರ್ತನೆಯಾಗುತ್ತದೆ.- ಫಿಲ್ಟರ್
3ಅನ್ನು ಎಳೆಯುತ್ತದೆ (ವಿಫಲ), ನಂತರ4(ಉತ್ತೀರ್ಣ).4ಅನ್ನು8ಕ್ಕೆ ಮ್ಯಾಪ್ ಮಾಡಲಾಗುತ್ತದೆ, ಅದನ್ನು ತೆಗೆದುಕೊಳ್ಳಲಾಗುತ್ತದೆ. take(5)ಐದು ಮೌಲ್ಯಗಳನ್ನು ನೀಡುವವರೆಗೆ ಇದು ಮುಂದುವರಿಯುತ್ತದೆ. ಐದನೇ ಮೌಲ್ಯವು ಮೂಲ ಸಂಖ್ಯೆ10ರಿಂದ ಇರುತ್ತದೆ, ಅದನ್ನು20ಕ್ಕೆ ಮ್ಯಾಪ್ ಮಾಡಲಾಗುತ್ತದೆ.take(5)ಇಟರೇಟರ್ ತನ್ನ ಐದನೇ ಮೌಲ್ಯವನ್ನು ನೀಡಿದ ತಕ್ಷಣ, ಅದರ ಕೆಲಸ ಮುಗಿದಿದೆ ಎಂದು ಅದಕ್ಕೆ ತಿಳಿದಿರುತ್ತದೆ. ಮುಂದಿನ ಬಾರಿ ಅದಕ್ಕೆ ಮೌಲ್ಯವನ್ನು ಕೇಳಿದಾಗ, ಅದು ಮುಗಿದಿದೆ ಎಂದು ಸಂಕೇತಿಸುತ್ತದೆ. ಸಂಪೂರ್ಣ ಚೈನ್ ನಿಲ್ಲುತ್ತದೆ.11,12, ಮತ್ತು ಮೂಲ ಅರೇಯಲ್ಲಿರುವ ಲಕ್ಷಾಂತರ ಇತರ ಸಂಖ್ಯೆಗಳನ್ನು ಎಂದಿಗೂ ನೋಡಲಾಗುವುದಿಲ್ಲ.
ಪ್ರಯೋಜನಗಳು ಅಪಾರವಾಗಿವೆ: ಯಾವುದೇ ಮಧ್ಯಂತರ ಅರೇಗಳಿಲ್ಲ, ಕನಿಷ್ಠ ಮೆಮೊರಿ ಬಳಕೆ, ಮತ್ತು ಗಣನೆಯು ಸಾಧ್ಯವಾದಷ್ಟು ಬೇಗ ನಿಲ್ಲುತ್ತದೆ. ಇದು ದಕ್ಷತೆಯಲ್ಲಿ ಒಂದು ಸ್ಮಾರಕದ ಬದಲಾವಣೆಯಾಗಿದೆ.
ಪ್ರಾಯೋಗಿಕ ಅನ್ವಯಗಳು ಮತ್ತು ಕಾರ್ಯಕ್ಷಮತೆಯ ಲಾಭಗಳು
ಇಟರೇಟರ್ ಹೆಲ್ಪರ್ಗಳ ಶಕ್ತಿಯು ಸರಳ ಅರೇ ಮ್ಯಾನಿಪ್ಯುಲೇಷನ್ಗಿಂತಲೂ ವಿಸ್ತಾರವಾಗಿದೆ. ಇದು ಸಂಕೀರ್ಣ ಡೇಟಾ ಸಂಸ್ಕರಣಾ ಕಾರ್ಯಗಳನ್ನು ದಕ್ಷತೆಯಿಂದ ನಿರ್ವಹಿಸಲು ಹೊಸ ಸಾಧ್ಯತೆಗಳನ್ನು ತೆರೆಯುತ್ತದೆ.
ಸನ್ನಿವೇಶ 1: ದೊಡ್ಡ ಡೇಟಾಸೆಟ್ಗಳು ಮತ್ತು ಸ್ಟ್ರೀಮ್ಗಳನ್ನು ಸಂಸ್ಕರಿಸುವುದು
ನೀವು ಮಲ್ಟಿ-ಗಿಗಾಬೈಟ್ ಲಾಗ್ ಫೈಲ್ ಅಥವಾ ನೆಟ್ವರ್ಕ್ ಸಾಕೆಟ್ನಿಂದ ಡೇಟಾ ಸ್ಟ್ರೀಮ್ ಅನ್ನು ಸಂಸ್ಕರಿಸಬೇಕಾಗಿದೆ ಎಂದು ಕಲ್ಪಿಸಿಕೊಳ್ಳಿ. ಸಂಪೂರ್ಣ ಫೈಲ್ ಅನ್ನು ಮೆಮೊರಿಯಲ್ಲಿ ಅರೇಗೆ ಲೋಡ್ ಮಾಡುವುದು ಸಾಮಾನ್ಯವಾಗಿ ಅಸಾಧ್ಯ.
ಇಟರೇಟರ್ಗಳೊಂದಿಗೆ (ಮತ್ತು ವಿಶೇಷವಾಗಿ ಅಸಿಂಕ್ ಇಟರೇಟರ್ಗಳು, ನಾವು ನಂತರ ಚರ್ಚಿಸುತ್ತೇವೆ), ನೀವು ಡೇಟಾವನ್ನು ತುಂಡು ತುಂಡಾಗಿ ಸಂಸ್ಕರಿಸಬಹುದು.
// ದೊಡ್ಡ ಫೈಲ್ನಿಂದ ಲೈನ್ಗಳನ್ನು ನೀಡುವ ಜನರೇಟರ್ನೊಂದಿಗೆ ಕಾನ್ಸೆಪ್ಚುವಲ್ ಉದಾಹರಣೆ
function* readLines(filePath) {
// ಎಲ್ಲವನ್ನೂ ಲೋಡ್ ಮಾಡದೆ ಫೈಲ್ ಅನ್ನು ಲೈನ್-ಬೈ-ಲೈನ್ ಓದುವ ಅನುಷ್ಠಾನ
// yield line;
}
const errorCount = readLines('huge_app.log').values()
.map(line => JSON.parse(line))
.filter(logEntry => logEntry.level === 'error')
.take(100) // ಮೊದಲ 100 ದೋಷಗಳನ್ನು ಹುಡುಕಿ
.reduce((count) => count + 1, 0);
ಈ ಉದಾಹರಣೆಯಲ್ಲಿ, ಪೈಪ್ಲೈನ್ ಮೂಲಕ ಹಾದುಹೋಗುವಾಗ ಫೈಲ್ನ ಕೇವಲ ಒಂದು ಲೈನ್ ಮಾತ್ರ ಮೆಮೊರಿಯಲ್ಲಿ ಇರುತ್ತದೆ. ಪ್ರೋಗ್ರಾಂ ಕನಿಷ್ಠ ಮೆಮೊರಿ ಫುಟ್ಪ್ರಿಂಟ್ನೊಂದಿಗೆ ಟೆರಾಬೈಟ್ಗಳಷ್ಟು ಡೇಟಾವನ್ನು ಸಂಸ್ಕರಿಸಬಹುದು.
ಸನ್ನಿವೇಶ 2: ಶೀಘ್ರ ಮುಕ್ತಾಯ ಮತ್ತು ಶಾರ್ಟ್-ಸರ್ಕ್ಯೂಟಿಂಗ್
ನಾವು ಈಗಾಗಲೇ ಇದನ್ನು .take() ನೊಂದಿಗೆ ನೋಡಿದ್ದೇವೆ, ಆದರೆ ಇದು .find(), .some(), ಮತ್ತು .every() ನಂತಹ ಮೆಥಡ್ಗಳಿಗೂ ಅನ್ವಯಿಸುತ್ತದೆ. ದೊಡ್ಡ ಡೇಟಾಬೇಸ್ನಲ್ಲಿ ನಿರ್ವಾಹಕರಾಗಿರುವ ಮೊದಲ ಬಳಕೆದಾರರನ್ನು ಹುಡುಕುವುದನ್ನು ಪರಿಗಣಿಸಿ.
ಅರೇ-ಆಧಾರಿತ (ಅದಕ್ಷ):
const firstAdmin = users.filter(u => u.isAdmin)[0];
ಇಲ್ಲಿ, .filter() ಸಂಪೂರ್ಣ users ಅರೇಯ ಮೇಲೆ ಇಟರೇಟ್ ಮಾಡುತ್ತದೆ, ಮೊದಲ ಬಳಕೆದಾರನೇ ನಿರ್ವಾಹಕರಾಗಿದ್ದರೂ ಸಹ.
ಇಟರೇಟರ್-ಆಧಾರಿತ (ದಕ್ಷ):
const firstAdmin = users.values().find(u => u.isAdmin);
.find() ಹೆಲ್ಪರ್ ಪ್ರತಿ ಬಳಕೆದಾರರನ್ನು ಒಂದೊಂದಾಗಿ ಪರೀಕ್ಷಿಸುತ್ತದೆ ಮತ್ತು ಮೊದಲ ಹೊಂದಾಣಿಕೆಯನ್ನು ಕಂಡುಕೊಂಡ ತಕ್ಷಣ ಸಂಪೂರ್ಣ ಪ್ರಕ್ರಿಯೆಯನ್ನು ನಿಲ್ಲಿಸುತ್ತದೆ.
ಸನ್ನಿವೇಶ 3: ಅನಂತ ಸರಣಿಗಳೊಂದಿಗೆ ಕೆಲಸ ಮಾಡುವುದು
ಲೇಜಿ ಇವ್ಯಾಲ್ಯುಯೇಷನ್ ಸಂಭಾವ್ಯ ಅನಂತ ಡೇಟಾ ಮೂಲಗಳೊಂದಿಗೆ ಕೆಲಸ ಮಾಡಲು ಸಾಧ್ಯವಾಗಿಸುತ್ತದೆ, ಇದು ಅರೇಗಳೊಂದಿಗೆ ಅಸಾಧ್ಯ. ಜನರೇಟರ್ಗಳು ಅಂತಹ ಸರಣಿಗಳನ್ನು ರಚಿಸಲು ಪರಿಪೂರ್ಣವಾಗಿವೆ.
function* fibonacci() {
let a = 0, b = 1;
while (true) {
yield a;
[a, b] = [b, a + b];
}
}
// 1000 ಕ್ಕಿಂತ ಹೆಚ್ಚಿನ ಮೊದಲ 10 ಫೈಬೊನಾಕಿ ಸಂಖ್ಯೆಗಳನ್ನು ಹುಡುಕಿ
const result = fibonacci()
.filter(n => n > 1000)
.take(10)
.toArray();
// result will be [1597, 2584, 4181, 6765, 10946, 17711, 28657, 46368, 75025, 121393]
ಈ ಕೋಡ್ ಸಂಪೂರ್ಣವಾಗಿ ಕಾರ್ಯನಿರ್ವಹಿಸುತ್ತದೆ. fibonacci() ಜನರೇಟರ್ ಶಾಶ್ವತವಾಗಿ ಚಲಿಸಬಹುದು, ಆದರೆ ಕಾರ್ಯಾಚರಣೆಗಳು ಲೇಜಿ ಆಗಿರುವುದರಿಂದ ಮತ್ತು .take(10) ನಿಲುಗಡೆ ಸ್ಥಿತಿಯನ್ನು ಒದಗಿಸುವುದರಿಂದ, ಪ್ರೋಗ್ರಾಂ ವಿನಂತಿಯನ್ನು ಪೂರೈಸಲು ಅಗತ್ಯವಿರುವಷ್ಟು ಫೈಬೊನಾಕಿ ಸಂಖ್ಯೆಗಳನ್ನು ಮಾತ್ರ ಲೆಕ್ಕಾಚಾರ ಮಾಡುತ್ತದೆ.
ವಿಸ್ತೃತ ಪರಿಸರ ವ್ಯವಸ್ಥೆಯ ಒಂದು ನೋಟ: ಅಸಿಂಕ್ ಇಟರೇಟರ್ಗಳು
ಈ ಪ್ರಸ್ತಾಪದ ಸೌಂದರ್ಯವೆಂದರೆ ಅದು ಸಿಂಕ್ರೊನಸ್ ಇಟರೇಟರ್ಗಳಿಗೆ ಮಾತ್ರ ಅನ್ವಯಿಸುವುದಿಲ್ಲ. ಇದು AsyncIterator.prototype ನಲ್ಲಿ ಅಸಿಂಕ್ ಇಟರೇಟರ್ಗಳಿಗೆ ಸಮಾನಾಂತರವಾದ ಹೆಲ್ಪರ್ಗಳ ಸೆಟ್ ಅನ್ನು ಸಹ ವ್ಯಾಖ್ಯಾನಿಸುತ್ತದೆ. ಇದು ಆಧುನಿಕ ಜಾವಾಸ್ಕ್ರಿಪ್ಟ್ಗೆ ಒಂದು ಗೇಮ್-ಚೇಂಜರ್ ಆಗಿದೆ, ಅಲ್ಲಿ ಅಸಿಂಕ್ರೊನಸ್ ಡೇಟಾ ಸ್ಟ್ರೀಮ್ಗಳು ಸರ್ವತ್ರವಾಗಿವೆ.
ಪೇಜಿನೇಟೆಡ್ API ಅನ್ನು ಪ್ರೊಸೆಸ್ ಮಾಡುವುದು, Node.js ನಿಂದ ಫೈಲ್ ಸ್ಟ್ರೀಮ್ ಓದುವುದು, ಅಥವಾ WebSocket ನಿಂದ ಡೇಟಾವನ್ನು ನಿರ್ವಹಿಸುವುದನ್ನು ಕಲ್ಪಿಸಿಕೊಳ್ಳಿ. ಇವೆಲ್ಲವೂ ಸ್ವಾಭಾವಿಕವಾಗಿ ಅಸಿಂಕ್ ಸ್ಟ್ರೀಮ್ಗಳಾಗಿ ಪ್ರತಿನಿಧಿಸಲ್ಪಡುತ್ತವೆ. ಅಸಿಂಕ್ ಇಟರೇಟರ್ ಹೆಲ್ಪರ್ಗಳೊಂದಿಗೆ, ನೀವು ಅವುಗಳ ಮೇಲೆ ಅದೇ ಡಿಕ್ಲರೇಟಿವ್ .map() ಮತ್ತು .filter() ಸಿಂಟ್ಯಾಕ್ಸ್ ಅನ್ನು ಬಳಸಬಹುದು.
// ಪೇಜಿನೇಟೆಡ್ API ಅನ್ನು ಪ್ರೊಸೆಸ್ ಮಾಡುವ ಕಾನ್ಸೆಪ್ಚುವಲ್ ಉದಾಹರಣೆ
async function* fetchAllUsers() {
let url = '/api/users?page=1';
while (url) {
const response = await fetch(url);
const data = await response.json();
for (const user of data.users) {
yield user;
}
url = data.nextPageUrl;
}
}
// ಒಂದು ನಿರ್ದಿಷ್ಟ ದೇಶದ ಮೊದಲ 5 ಸಕ್ರಿಯ ಬಳಕೆದಾರರನ್ನು ಹುಡುಕಿ
const activeUsers = await fetchAllUsers()
.filter(user => user.isActive)
.filter(user => user.country === 'DE')
.take(5)
.toArray();
ಇದು ಜಾವಾಸ್ಕ್ರಿಪ್ಟ್ನಲ್ಲಿ ಡೇಟಾ ಪ್ರೊಸೆಸಿಂಗ್ಗಾಗಿ ಪ್ರೋಗ್ರಾಮಿಂಗ್ ಮಾದರಿಯನ್ನು ಏಕೀಕರಿಸುತ್ತದೆ. ನಿಮ್ಮ ಡೇಟಾ ಸರಳ ಇನ್-ಮೆಮೊರಿ ಅರೇಯಲ್ಲಿರಲಿ ಅಥವಾ ರಿಮೋಟ್ ಸರ್ವರ್ನಿಂದ ಅಸಿಂಕ್ರೊನಸ್ ಸ್ಟ್ರೀಮ್ನಲ್ಲಿರಲಿ, ನೀವು ಅದೇ ಶಕ್ತಿಯುತ, ದಕ್ಷ, ಮತ್ತು ಓದಬಲ್ಲ ಮಾದರಿಗಳನ್ನು ಬಳಸಬಹುದು.
ಪ್ರಾರಂಭಿಸುವುದು ಮತ್ತು ಪ್ರಸ್ತುತ ಸ್ಥಿತಿ
2024 ರ ಆರಂಭದ ವೇಳೆಗೆ, ಇಟರೇಟರ್ ಹೆಲ್ಪರ್ಸ್ ಪ್ರಸ್ತಾಪವು TC39 ಪ್ರಕ್ರಿಯೆಯ ಹಂತ 3 ರಲ್ಲಿದೆ. ಇದರರ್ಥ ವಿನ್ಯಾಸವು ಪೂರ್ಣಗೊಂಡಿದೆ, ಮತ್ತು ಸಮಿತಿಯು ಇದನ್ನು ಭವಿಷ್ಯದ ECMAScript ಸ್ಟ್ಯಾಂಡರ್ಡ್ನಲ್ಲಿ ಸೇರಿಸಲಾಗುವುದು ಎಂದು ನಿರೀಕ್ಷಿಸುತ್ತದೆ. ಇದು ಈಗ ಪ್ರಮುಖ ಜಾವಾಸ್ಕ್ರಿಪ್ಟ್ ಇಂಜಿನ್ಗಳಲ್ಲಿ ಅನುಷ್ಠಾನಗೊಳ್ಳಲು ಮತ್ತು ಆ ಅನುಷ್ಠಾನಗಳಿಂದ ಪ್ರತಿಕ್ರಿಯೆಗಾಗಿ ಕಾಯುತ್ತಿದೆ.
ಇಂದು ಇಟರೇಟರ್ ಹೆಲ್ಪರ್ಸ್ ಬಳಸುವುದು ಹೇಗೆ
- ಬ್ರೌಸರ್ ಮತ್ತು Node.js ರನ್ಟೈಮ್ಗಳು: ಪ್ರಮುಖ ಬ್ರೌಸರ್ಗಳ (Chrome/V8 ನಂತಹ) ಮತ್ತು Node.js ನ ಇತ್ತೀಚಿನ ಆವೃತ್ತಿಗಳು ಈ ವೈಶಿಷ್ಟ್ಯಗಳನ್ನು ಅನುಷ್ಠಾನಗೊಳಿಸಲು ಪ್ರಾರಂಭಿಸುತ್ತಿವೆ. ನೀವು ಅವುಗಳನ್ನು ನೇರವಾಗಿ ಪ್ರವೇಶಿಸಲು ನಿರ್ದಿಷ್ಟ ಫ್ಲ್ಯಾಗ್ ಅನ್ನು ಸಕ್ರಿಯಗೊಳಿಸಬೇಕಾಗಬಹುದು ಅಥವಾ ಅತ್ಯಂತ ಇತ್ತೀಚಿನ ಆವೃತ್ತಿಯನ್ನು ಬಳಸಬೇಕಾಗಬಹುದು. ಯಾವಾಗಲೂ ಇತ್ತೀಚಿನ ಹೊಂದಾಣಿಕೆ ಕೋಷ್ಟಕಗಳನ್ನು ಪರಿಶೀಲಿಸಿ (ಉದಾಹರಣೆಗೆ, MDN ಅಥವಾ caniuse.com ನಲ್ಲಿ).
- ಪಾಲಿಫಿಲ್ಗಳು: ಹಳೆಯ ರನ್ಟೈಮ್ಗಳನ್ನು ಬೆಂಬಲಿಸಬೇಕಾದ ಪ್ರೊಡಕ್ಷನ್ ಪರಿಸರಗಳಿಗಾಗಿ, ನೀವು ಪಾಲಿಫಿಲ್ ಅನ್ನು ಬಳಸಬಹುದು. ಅತ್ಯಂತ ಸಾಮಾನ್ಯವಾದ ಮಾರ್ಗವೆಂದರೆ
core-jsಲೈಬ್ರರಿ ಮೂಲಕ, ಇದನ್ನು ಸಾಮಾನ್ಯವಾಗಿ Babel ನಂತಹ ಟ್ರಾನ್ಸ್ಪೈಲರ್ಗಳು ಸೇರಿಸುತ್ತಾರೆ. Babel ಮತ್ತುcore-jsಅನ್ನು ಕಾನ್ಫಿಗರ್ ಮಾಡುವ ಮೂಲಕ, ನೀವು ಇಟರೇಟರ್ ಹೆಲ್ಪರ್ಗಳನ್ನು ಬಳಸಿಕೊಂಡು ಕೋಡ್ ಬರೆಯಬಹುದು ಮತ್ತು ಅದನ್ನು ಹಳೆಯ ಪರಿಸರಗಳಲ್ಲಿ ಕಾರ್ಯನಿರ್ವಹಿಸುವ ಸಮಾನವಾದ ಕೋಡ್ಗೆ ಪರಿವರ್ತಿಸಬಹುದು.
ತೀರ್ಮಾನ: ಜಾವಾಸ್ಕ್ರಿಪ್ಟ್ನಲ್ಲಿ ದಕ್ಷ ಡೇಟಾ ಸಂಸ್ಕರಣೆಯ ಭವಿಷ್ಯ
ಇಟರೇಟರ್ ಹೆಲ್ಪರ್ಸ್ ಪ್ರಸ್ತಾಪವು ಕೇವಲ ಹೊಸ ಮೆಥಡ್ಗಳ ಒಂದು ಸೆಟ್ ಗಿಂತ ಹೆಚ್ಚಾಗಿದೆ; ಇದು ಜಾವಾಸ್ಕ್ರಿಪ್ಟ್ನಲ್ಲಿ ಹೆಚ್ಚು ದಕ್ಷ, ಸ್ಕೇಲೆಬಲ್, ಮತ್ತು ಅಭಿವ್ಯಕ್ತ ಡೇಟಾ ಸಂಸ್ಕರಣೆಯ ಕಡೆಗೆ ಒಂದು ಮೂಲಭೂತ ಬದಲಾವಣೆಯನ್ನು ಪ್ರತಿನಿಧಿಸುತ್ತದೆ. ಲೇಜಿ ಇವ್ಯಾಲ್ಯುಯೇಷನ್ ಮತ್ತು ಸ್ಟ್ರೀಮ್ ಫ್ಯೂಷನ್ ಅನ್ನು ಅಳವಡಿಸಿಕೊಳ್ಳುವ ಮೂಲಕ, ಇದು ದೊಡ್ಡ ಡೇಟಾಸೆಟ್ಗಳಲ್ಲಿ ಅರೇ ಮೆಥಡ್ಗಳನ್ನು ಚೈನ್ ಮಾಡುವುದರೊಂದಿಗೆ ಸಂಬಂಧಿಸಿದ ದೀರ್ಘಕಾಲದ ಕಾರ್ಯಕ್ಷಮತೆಯ ಸಮಸ್ಯೆಗಳನ್ನು ಪರಿಹರಿಸುತ್ತದೆ.
ಪ್ರತಿ ಡೆವಲಪರ್ಗೆ ಪ್ರಮುಖ ಅಂಶಗಳು:
- ಡೀಫಾಲ್ಟ್ ಆಗಿ ಕಾರ್ಯಕ್ಷಮತೆ: ಇಟರೇಟರ್ ಮೆಥಡ್ಗಳನ್ನು ಚೈನ್ ಮಾಡುವುದು ಮಧ್ಯಂತರ ಸಂಗ್ರಹಣೆಗಳನ್ನು ತಪ್ಪಿಸುತ್ತದೆ, ಮೆಮೊರಿ ಬಳಕೆ ಮತ್ತು ಗಾರ್ಬೇಜ್ ಕಲೆಕ್ಟರ್ ಲೋಡ್ ಅನ್ನು ತೀವ್ರವಾಗಿ ಕಡಿಮೆ ಮಾಡುತ್ತದೆ.
- ಲೇಜಿನೆಸ್ನೊಂದಿಗೆ ವರ್ಧಿತ ನಿಯಂತ್ರಣ: ಗಣನೆಗಳನ್ನು ಅಗತ್ಯವಿದ್ದಾಗ ಮಾತ್ರ ನಿರ್ವಹಿಸಲಾಗುತ್ತದೆ, ಇದು ಶೀಘ್ರ ಮುಕ್ತಾಯ ಮತ್ತು ಅನಂತ ಡೇಟಾ ಮೂಲಗಳ ಸೊಗಸಾದ ನಿರ್ವಹಣೆಯನ್ನು ಸಕ್ರಿಯಗೊಳಿಸುತ್ತದೆ.
- ಒಂದು ಏಕೀಕೃತ ಮಾದರಿ: ಅದೇ ಶಕ್ತಿಯುತ ಮಾದರಿಗಳು ಸಿಂಕ್ರೊನಸ್ ಮತ್ತು ಅಸಿಂಕ್ರೊನಸ್ ಡೇಟಾ ಎರಡಕ್ಕೂ ಅನ್ವಯಿಸುತ್ತವೆ, ಕೋಡ್ ಅನ್ನು ಸರಳಗೊಳಿಸುತ್ತದೆ ಮತ್ತು ಸಂಕೀರ್ಣ ಡೇಟಾ ಫ್ಲೋಗಳ ಬಗ್ಗೆ ತರ್ಕಿಸಲು ಸುಲಭವಾಗಿಸುತ್ತದೆ.
ಈ ವೈಶಿಷ್ಟ್ಯವು ಜಾವಾಸ್ಕ್ರಿಪ್ಟ್ ಭಾಷೆಯ ಒಂದು ಪ್ರಮಾಣಿತ ಭಾಗವಾಗುತ್ತಿದ್ದಂತೆ, ಇದು ಹೊಸ ಮಟ್ಟದ ಕಾರ್ಯಕ್ಷಮತೆಯನ್ನು ಅನ್ಲಾಕ್ ಮಾಡುತ್ತದೆ ಮತ್ತು ಡೆವಲಪರ್ಗಳಿಗೆ ಹೆಚ್ಚು ದೃಢವಾದ ಮತ್ತು ಸ್ಕೇಲೆಬಲ್ ಅಪ್ಲಿಕೇಶನ್ಗಳನ್ನು ನಿರ್ಮಿಸಲು ಅಧಿಕಾರ ನೀಡುತ್ತದೆ. ಸ್ಟ್ರೀಮ್ಗಳಲ್ಲಿ ಯೋಚಿಸಲು ಪ್ರಾರಂಭಿಸುವ ಮತ್ತು ನಿಮ್ಮ ವೃತ್ತಿಜೀವನದ ಅತ್ಯಂತ ದಕ್ಷ ಡೇಟಾ-ಸಂಸ್ಕರಣಾ ಕೋಡ್ ಬರೆಯಲು ಸಿದ್ಧರಾಗುವ ಸಮಯ ಬಂದಿದೆ.