নোডজেএস - সেটটাইমআউট (fn, 0) বনাম সেটআইমিডিয়েট (এফএন)


উত্তর:


72

সেটটাইমআউট হ'ল বিলম্ব শেষ হওয়ার পরে ফাংশনটি কল করার মতো। যখনই কোনও ফাংশন বলা হয় এটি তাত্ক্ষণিকভাবে কার্যকর করা হয় না, তবে সারিবদ্ধ করা হয় যাতে এটি কার্যকর করা হয় এবং বর্তমানে সারিবদ্ধ ইভেন্টহ্যান্ডাররা প্রথমে শেষ হওয়ার পরে এটি কার্যকর করা হয়। সেটটাইমআউট (, 0) এর অর্থ বর্তমান কাতারে উপস্থিত সমস্ত কার্য সম্পাদনের পরে কার্যকর করা হয়। এটি কতটা সময় নিতে পারে সে সম্পর্কে কোনও গ্যারান্টি দেওয়া যায় না।

সেটআইমিডিয়েট এটি ফাংশনের সারি ব্যবহার না করে ব্যতীত এই ক্ষেত্রে অনুরূপ। এটি I / O ইভেন্টহ্যান্ডলারের সারি পরীক্ষা করে। যদি বর্তমান স্ন্যাপশটের সমস্ত আই / ও ইভেন্টগুলি প্রক্রিয়া করা হয় তবে এটি কলব্যাকটি কার্যকর করে। এটি শেষ আই / ও হ্যান্ডলারের কিছুক্ষণের মতো প্রক্রিয়া.এনেক্সটটিকের সাথে সাথেই তাদের সারি করে। সুতরাং এটি দ্রুত।

এছাড়াও (সেটটাইমআউট, 0) ধীর হবে কারণ এটি নির্বাহের আগে কমপক্ষে একবার টাইমারটি পরীক্ষা করবে। অনেক সময় এটি দ্বিগুণ হয়ে যেতে পারে। এখানে একটি মানদণ্ড দেওয়া হল।

var Suite = require('benchmark').Suite
var fs = require('fs')

var suite = new Suite

suite.add('deffered.resolve()', function(deferred) {
  deferred.resolve()
}, {defer: true})

suite.add('setImmediate()', function(deferred) {
  setImmediate(function() {
    deferred.resolve()
  })
}, {defer: true})

suite.add('setTimeout(,0)', function(deferred) {
  setTimeout(function() {
    deferred.resolve()
  },0)
}, {defer: true})

suite
.on('cycle', function(event) {
  console.log(String(event.target));
})
.on('complete', function() {
  console.log('Fastest is ' + this.filter('fastest').pluck('name'));
})
.run({async: true})

আউটপুট

deffered.resolve() x 993 ops/sec ±0.67% (22 runs sampled)
setImmediate() x 914 ops/sec ±2.48% (57 runs sampled)
setTimeout(,0) x 445 ops/sec ±2.79% (82 runs sampled)

প্রথমটি দ্রুততম কলগুলির ধারণা দেয়। সেটটাইমআউটটিকে অন্যান্য হিসাবে যতবার অর্ধেক কল করা হয় আপনি তা পরীক্ষা করে দেখতে পারেন। এছাড়াও মনে রাখবেন সেটইমিডিয়েট আপনার ফাইল সিস্টেম কলগুলিতে সামঞ্জস্য করবে। সুতরাং লোড অধীনে এটি কম সঞ্চালন করবে। আমি মনে করি না সেটটাইমআউট আরও ভাল করতে পারে।

সেটটাইমআউট কিছু সময়ের পরে ফাংশনগুলি কল করার একটি অনাহু উপায়। এটি ব্রাউজারের মতোই। এটি সার্ভার-সাইডের জন্য উপযুক্ত নাও হতে পারে (ভাবুন কেন আমি বেঞ্চমার্ক.জেএসটি সেটটাইমআউট ব্যবহার করে না)।


4
এটি লক্ষ্য করা গুরুত্বপূর্ণ যে সেটটাইমআউটটি পাঁচবার নেস্ট করে থাকলে কমপক্ষে চার মিলিসেকেন্ডের জন্য বাধ্যতামূলক বিলম্বের সাপেক্ষে। এইচটিএমএল স্পেস দেখুন
জ্যাক অ্যালান

এই উত্সটি (অন্য উত্তর থেকে) এখানে কিছু বক্তব্য খণ্ডন করেছে বলে মনে হচ্ছে: voidcanvas.com/setimedia-vs-nexttick-vs-settimeout
দিমিত্রি

17

ইভেন্ট লুপ কীভাবে কাজ করে এবং কিছু ভুল ধারণা পরিষ্কার করে দেয় সে সম্পর্কে একটি দুর্দান্ত নিবন্ধ। http://voidcanvas.com/setimedia-vs-nexttick-vs-settimeout/

নিবন্ধটি উদ্ধৃত:

setImmediateআই / ও ক্যু কলব্যাকস সমাপ্ত বা সময়সীমা শেষ হওয়ার পরে কলব্যাকগুলি কল করা হয়। সেটআইমিডিয়েট কলব্যাকগুলি চেক কাতারে স্থাপন করা হয়, যা I / O সারি পরে প্রক্রিয়া করা হয়।

setTimeout(fn, 0)কলব্যাকগুলি টাইমার কাতারে স্থাপন করা হয় এবং I / O কলব্যাকের পাশাপাশি কুইউ কলব্যাকগুলি চেক করা হবে। ইভেন্ট লুপ হিসাবে, প্রতিটি পুনরাবৃত্তির মধ্যে টাইমার কাতারে প্রথমে প্রক্রিয়া করুন, যার ফলে প্রথমে কোনটি কার্যকর করা হবে তা কোন ফেজ ইভেন্ট লুপটির উপর নির্ভর করে।


আইটেম / ও কলব্যাক্সের আগে সেটটাইমআউট সারিতে প্রক্রিয়া করা হয়। রেফ: নোডজস.আর.এন.ইন
মানব

4

সেটআইমিডিয়েট () হ'ল আই / ও ইভেন্ট কলব্যাকের পরে এবং সেটটাইমআউট এবং সেটইন্টারভাল এর আগে কলব্যাকের তাত্ক্ষণিক সম্পাদনের সময়সূচী।

সেটটাইমআউট () হ'ল বিলম্ব মিলিসেকেন্ডের পরে ওয়ান-টাইম কলব্যাকের সম্পাদনের সময়সূচী।

দলিলগুলি এটাই বলে।

setTimeout(function() {
  console.log('setTimeout')
}, 0)

setImmediate(function() {
  console.log('setImmediate')
})

আপনি যদি উপরের কোডটি চালান, ফলাফলটি এরকম হবে ... যদিও বর্তমান ডকটি বলেছে যে "I / O ইভেন্ট কলব্যাকের পরে এবং সেটটাইমআউট এবং সেটইন্টারভাল এর আগে কলব্যাকের" তাত্ক্ষণিক "সম্পাদনের সময়সূচী করার জন্য"। ..

ফলাফল..

সেটটাইমআউট

সেটআইমিডিয়েট

আপনি যদি নিজের উদাহরণটি অন্য টাইমারে মুড়ে রাখেন তবে এটি সর্বদা সেটটাইমেট সেটআপ টাইমআউট দ্বারা প্রিন্ট করে।

setTimeout(function() {
  setTimeout(function() {
    console.log('setTimeout')
  }, 0);
  setImmediate(function() {
    console.log('setImmediate')
  });
}, 10);

তাহলে আপনি কখন অন্যটির চেয়ে বেশি পছন্দ করবেন?
Shlomi শোয়ার্জ

23
আপনি যা দেখিয়েছেন তা কেন ঘটে তা আপনি ব্যাখ্যা করেন নি। এই উত্তরটি আমার কাজে লাগেনি।
ক্লিন্ট ইস্টউড

4
@ সাভান্নাহ আপনার প্রথম ফলাফলের মধ্যে দয়া করে ব্যাখ্যা করুন কেন সেটটাইমআউট সেটইমিডিয়েটের আগে প্রথমে কার্যকর করা হয়েছিল
আগুস

4
@ আগুসসায়পুত্র এটি পরীক্ষা করে দেখুন: github.com/nodejs/node-v0.x-archive/issues/25788
রদ্রিগো

4
সেটটাইমিয়েট সব সময় সেটটাইমআউট এবং সেটইন্টারভাল এর আগে এক্সিকিউট করে না
মিডহুন জিএস

2

সর্বদা ব্যবহার করুন setImmediate, যদি না আপনার সত্যিই নিশ্চিত যে আপনার প্রয়োজন setTimeout(,0)(তবে আমি কল্পনাও করতে পারি না, কীসের জন্য)। প্রথম টিক এবং কলব্যাকে কল করা ব্যতীত setImmediateকলব্যাক প্রায়শই আগে কার্যকর করা হবে willsetTimeout(,0)setImmediate


4
আমি বলব সেটটাইমেটের পরিবর্তে সেটটাইমআউট ব্যবহারের মূল কারণটি হল আপনার কোডটি ব্রাউজারগুলির দ্বারা কার্যকর করা দরকার যা সেটআইমিডিয়েট বাস্তবায়ন করেনি। তারপরেও, আপনি কেবল শিম তৈরি করতে পারেন।
গ্রেগরি মাগারশাক

9
এটি নিরবচ্ছিন্ন পরামর্শ। যদি সবকিছু প্রথমে যেতে বলে, শেষের দিকে সারি-আইংয়ের সাথে তুলনা করে অ্যাসিঙ্ক্রোনাস এক্সিকিউশনের উদীয়মান পারফরম্যান্স বৈশিষ্ট্যগুলি আবর্জনা হতে চলেছে। setTimeoutযেতে যেতে হবে, setImmediateযখন প্রয়োজনীয় দেখানো হবে তখনই এটি ব্যবহার করা উচিত।
ধনী রিমার

1

সরবরাহকৃত উত্তরের সাথে সম্পূর্ণ অসন্তুষ্ট। আমি যা মনে করি সেগুলি এখানে আরও ভাল উত্তর পোস্ট করেছি: https://stackoverflow.com/a/56724489/5992714

প্রশ্নগুলি একটি মূল নকল যা মূল মডিউলে ব্যবহৃত হয় সেটটাইমআউট (0) এবং সেটআইমিডিয়েট () অপরিবর্তিত কেন?


4
দয়া করে দুটি প্রশ্নের ঠিক একই উত্তর পোস্ট করবেন না। যদি প্রশ্নগুলি আলাদা হয় তবে প্রত্যেকের উত্তরটি শিখুন। যদি সেগুলি একই হয় তবে পতাকাটিকে একটি নকল হিসাবে বন্ধ করতে ভোট দিন বা ভোট দিন।
টম জিচ

@ টমজাইচ উল্লেখ করেছেন।
মানব

0

আমি মনে করি নব্যা এস এর উত্তর সঠিক নয়, এখানে আমার পরীক্ষার কোডটি রয়েছে:

let set = new Set();

function orderTest() {
  let seq = [];
  let add = () => set.add(seq.join());
  setTimeout(function () {
    setTimeout(function () {
      seq.push('setTimeout');
      if (seq.length === 2) add();
    }, 0);

    setImmediate(function () {
      seq.push('setImmediate');
      if (seq.length === 2) add();
    });
  }, 10);
}

// loop 100 times
for (let i = 0; i < 100; i++) {
  orderTest();
}

setTimeout(() => {
  // will print one or two items, it's random
  for (item of set) {
    console.log(item);
  }
}, 100);

ব্যাখ্যা এখানে


0

সেটটাইমআউট (এফএন, 0) বিপুল আপডেটে ব্রাউজারকে হিমাঙ্ক থেকে রোধ করতে ব্যবহার করা যেতে পারে। উদাহরণস্বরূপ ওয়েবসকেট.অনমেজেজে আপনার এইচটিএমএল পরিবর্তন হতে পারে এবং বার্তা যদি আসতে থাকে তবে সেটআইমিডিয়েট ব্যবহার করার সময় ব্রাউজার হিমশীতল হতে পারে


0

এগুলি গভীরভাবে বুঝতে দয়া করে ইভেন্টের লুপ পর্যায়ক্রমে একবার যান।

সেটআইমিডিয়েট: এটি "চেক" পর্যায়ে কার্যকর হয়। চেক ফেজ ইনপুট / আউটপুট পর্যায়ের পর বলা হয়।

সেটটাইমআউট: এটি "টাইমার" পর্যায়ে কার্যকর হয়। টাইমার ফেজ প্রথম দফায় কিন্তু পরে বলা হয় , I / O ফেজ সেইসাথে চেক ফেজ।

নির্ধারিত পদ্ধতিতে আউটপুট পেতে, ইভেন্ট-লুপটি কোন ধাপের উপর নির্ভর করবে; তদনুসারে, আমরা দুটি মধ্যে ফাংশন ব্যবহার করতে পারেন।


-5

ইভেন্ট লুপটি অবরুদ্ধ না করার জন্য সেটআইমিডিয়েট () ব্যবহার করুন। কলব্যাকটি বর্তমান ইভেন্টটি শেষ হওয়ার সাথে সাথে পরবর্তী ইভেন্ট লুপে চলবে।

নিয়ন্ত্রিত বিলম্বের জন্য সেটটাইমআউট () ব্যবহার করুন। ফাংশনটি নির্দিষ্ট বিলম্বের পরে চলবে। সর্বনিম্ন বিলম্বটি 1 মিলিসেকেন্ড।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.