"কঠোর ব্যবহার" কেন এই উদাহরণে 10x এর কার্যকারিতা উন্নত করে?


128

এই প্রশ্নের অনুসরণ করে স্ট্রিং.প্রোটোটাইপ পারফরম্যান্সটি আমি সত্যিই আগ্রহী, কারণ কেবল "use strict"একটি String.prototypeপদ্ধতিতে 10 বার পারফরম্যান্সের উন্নতি করা হয়েছে। ব্যাখ্যা দ্বারা bergi ছোট এবং আমার এটা ব্যাখ্যা করে নি। দুটি প্রায় অভিন্ন পদ্ধতির মধ্যে কেন এমন নাটকীয় পার্থক্য রয়েছে, এটি কেবল "use strict"শীর্ষে পৃথক ? আপনি আরও বিশদ এবং এর পিছনে তত্ত্ব দিয়ে ব্যাখ্যা করতে পারেন?

String.prototype.count = function(char) {
  var n = 0;
  for (var i = 0; i < this.length; i++)
    if (this[i] == char) n++;
  return n;
};

String.prototype.count_strict = function(char) {
  "use strict";
  var n = 0;
  for (var i = 0; i < this.length; i++)
    if (this[i] == char) n++;
  return n;
};
// Here is how I measued speed, using Node.js 6.1.0

var STR = '0110101110010110100111010011101010101111110001010110010101011101101010101010111111000';
var REP = 1e4;

console.time('proto');
for (var i = 0; i < REP; i++) STR.count('1');
console.timeEnd('proto');

console.time('proto-strict');
for (var i = 0; i < REP; i++) STR.count_strict('1');
console.timeEnd('proto-strict');

ফলাফল:

proto: 101 ms
proto-strict: 7.5 ms

1
আপনি কি সাথে একটি পরীক্ষা this[i] === charকরতে পারেন এবং দেখতে পাচ্ছেন যে আপনি একই পার্থক্য পেয়েছেন?
নিট দ্য ডার্ক আবসোল

1
আমি this[i] === charএকটি
ডিওএম

2
বার্গির ব্যাখ্যায় বলা হয়েছে যে আপনি যখন countফাংশনটি কল করবেন তখন thisপ্যারামিটারটি স্ট্রিং আক্ষরিক পরিবর্তে একটি স্ট্রিং অবজেক্টে ফেলে দিতে হবে যখন কড়া মোডে এটি সঠিকভাবে পরিচালনা করতে হয় না। কেন এই ঘটনাটি আমার বাইরে, আমি উত্তরের প্রতি খুব আগ্রহী।
নিক লারসেন

3
@ নিকলারসেন: ভাষাটি কীভাবে নির্দিষ্ট করা হয়েছিল ঠিক এটি। Ditionতিহ্যগতভাবে জেএস নিশ্চিত করবে যে আপনার কাছে সর্বদা কোনও পদার্থ ছিল thisতবে কঠোর মোডে এটি সেই পদক্ষেপটি এড়িয়ে যায়, তাই আপনি আদিম স্ট্রিংটি পাবেন বা যা সরবরাহ করা হয়েছিল তা পান this

6
"use strict";ছেলেদের সর্বত্র রাখার সময় ! গুওল্ড
জোনাথন

উত্তর:


155

কঠোর মোডে, thisপ্রসঙ্গটি কোনও বস্তু হতে বাধ্য হয় না। আপনি যদি কোনও অ-অবজেক্টে কোনও ফাংশন কল করেন thisতবে কেবল সেই অ-অবজেক্ট হবে।

বিপরীতে, অ-কঠোর মোডে, thisপ্রসঙ্গটি সর্বদা প্রথমে কোনও বস্তুতে আবৃত থাকে যদি এটি ইতিমধ্যে কোনও বস্তু না হয়। উদাহরণস্বরূপ, (42).toString()প্রথমে 42কোনও Numberবস্তুতে মোড়ানো এবং তারপরে প্রসঙ্গ হিসাবে বস্তুর Number.prototype.toStringসাথে কল করে। কঠোর মোডে, প্রসঙ্গ অস্পৃষ্ট এবং মাত্র কল ছেড়ে দেওয়া হয় সঙ্গে যেমন প্রসঙ্গ।NumberthisthisNumber.prototype.toString42this

(function() {
  console.log(typeof this);
}).call(42); // 'object'

(function() {
  'use strict';
  console.log(typeof this);
}).call(42); // 'number'

আপনার ক্ষেত্রে, অ-কড়া মোড সংস্করণটি আদিম র‍্যাপস এবং পিছনে আদিম stringগুলি মোড়ানো Stringএবং আন- র্যাপিংয়ে অনেক সময় ব্যয় করে । অন্যদিকে কঠোর মোড সংস্করণ সরাসরি আদিমকে কাজ করে stringযা কর্মক্ষমতা উন্নত করে।


1
এবং মুছে ফেলা withএছাড়াও প্রতিটি পরিবর্তনশীল লুপ iirc জন্য কিছুটা সহায়তা করে।
zzzzBov

2
@ZzzBov- কে ভুল আছে। অপসারণটি অপরিমেয়with সহায়তা করে কারণ এটি ব্রাউজারকে যুক্তি দেয় যে চলক অভিব্যক্তিটি কোন পরিবর্তনশীলকে বোঝায়।
জন ডিভোরাক

2
আমার কাছে অপ্রচলিত মনে হয় যে অ-অবজেক্টটি thisসর্বদা-অবজেক্টের চেয়ে "কঠোর" this
ইলিডানএস 4 মনিকাকে

2
@ ইলিডিএসএস 4: এটি বেশিরভাগ ক্ষেত্রে এমন ক্ষেত্রে যেখানে orালু মোডে বৈশ্বিক অবজেক্ট thisহয় nullবা হয় undefined
বার্গি

6
@ IllidanS4: আপনি যদি চান তবে এটিকে "আসল this" বনাম "র‌্যাপার this" হিসাবে ভাবেন । অবজেক্ট র‌্যাপারস এমন একটি ক্লেজ যা কখনও কখনও অস্তিত্ব পাওয়া উচিত ছিল না, সুতরাং এটি বোঝা যায় যে যখন সম্ভব হয় তখন কঠোর মোড এগুলি এড়াতে পারে।
রাই-
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.