পরেরটি বারবার ভেরিয়েবলগুলি তৈরি করতে হবে যদিও এটি পরবর্তী কার্য 10% দ্রুত কেন?


14
var toSizeString = (function() {

 var KB = 1024.0,
     MB = 1024 * KB,
     GB = 1024 * MB;

  return function(size) {
    var gbSize = size / GB,
        gbMod  = size % GB,
        mbSize = gbMod / MB,
        mbMod  = gbMod % MB,
        kbSize = mbMod / KB;

    if (Math.floor(gbSize)) {
      return gbSize.toFixed(1) + 'GB';
    } else if (Math.floor(mbSize)) {
      return mbSize.toFixed(1) + 'MB';
    } else if (Math.floor(kbSize)) {
      return kbSize.toFixed(1) + 'KB';
    } else {
      return size + 'B';
    }
  };
})();

এবং দ্রুততর ফাংশন: (দ্রষ্টব্য যে এটি সর্বদা একই ভেরিয়েবলগুলি কেবি / এমবি / জিবি বারবার গণনা করতে হবে)। এটি কোথায় কর্মক্ষমতা অর্জন করে?

function toSizeString (size) {

 var KB = 1024.0,
     MB = 1024 * KB,
     GB = 1024 * MB;

 var gbSize = size / GB,
     gbMod  = size % GB,
     mbSize = gbMod / MB,
     mbMod  = gbMod % MB,
     kbSize = mbMod / KB;

 if (Math.floor(gbSize)) {
      return gbSize.toFixed(1) + 'GB';
 } else if (Math.floor(mbSize)) {
      return mbSize.toFixed(1) + 'MB';
 } else if (Math.floor(kbSize)) {
      return kbSize.toFixed(1) + 'KB';
 } else {
      return size + 'B';
 }
};

3
কোনও স্থিতিযুক্ত ভাষায় "ভেরিয়েবল" ধ্রুবক হিসাবে সংকলিত হবে। সম্ভবত আধুনিক জেএস ইঞ্জিনগুলি একই অপটিমাইজেশন করতে সক্ষম। ভেরিয়েবলগুলি বন্ধের অংশ হলে এটি কাজ করবে না বলে মনে হয়।
usr ডিরেক্টরির

6
এটি আপনি ব্যবহার করছেন জাভাস্ক্রিপ্ট ইঞ্জিনের একটি বাস্তবায়ন বিশদ। তাত্ত্বিক সময় এবং স্থান একই, এটি কেবলমাত্র একটি প্রদত্ত জাভাস্ক্রিপ্ট ইঞ্জিনের বাস্তবায়ন যা এগুলি পরিবর্তিত করতে পারে। সুতরাং আপনার প্রশ্নের সঠিক উত্তর দেওয়ার জন্য, আপনাকে নির্দিষ্ট জাভাস্ক্রিপ্ট ইঞ্জিনটি তালিকাভুক্ত করতে হবে যা দিয়ে আপনি এটি পরিমাপ করেছেন। এটির প্রয়োগের বিশদটি কেউ হয়ত জানাতে পারে যে / কেন এটি একে অপরটির চেয়ে আরও অনুকূল করে তুলেছিল। এছাড়াও আপনার নিজের পরিমাপের কোডটি পোস্ট করা উচিত।
জিমি হোফা

আপনি ধ্রুবক মানগুলির প্রসঙ্গে "গণনা" শব্দটি ব্যবহার করেন; আপনি যা উল্লেখ করছেন সেখানে গণনা করার কিছুই নেই । ধ্রুবক মানগুলির পাটিগণিত হ'ল সর্বাধিক সহজ এবং সুস্পষ্ট অপটিমাইজেশন সংকলকগুলির মধ্যে একটি, সুতরাং যে কোনও সময় আপনি কেবল একটি ধ্রুবক মান রয়েছে এমন কোনও এক্সপ্রেশন দেখেন, আপনি কেবলমাত্র সম্পূর্ণ এক্সপ্রেশনটিকে একটি একক ধ্রুবক মানের সাথে অনুকূলিত করে ধরে নিতে পারেন।
জিমি হোফা

@ জিমিহোফা সত্যই সত্য, তবে অন্যদিকে প্রতিটি ফাংশন কলকে 3 ধ্রুবক পরিবর্তনশীল তৈরি করা দরকার ...
টমি

@ টমি ধ্রুবকগুলি পরিবর্তনশীল নয় are এগুলি পৃথক হয় না, সুতরাং সংকলনের পরে তাদের পুনরায় তৈরি করার দরকার নেই। একটি ধ্রুবক সাধারণত স্মৃতিতে স্থাপন করা হয় এবং ভবিষ্যতের প্রতিটি ধ্রুবকের জন্য পৌঁছানো সঠিক স্থানে পরিচালিত হয়, এটি পুনরায় তৈরি করার দরকার নেই কারণ এর মান কখনই পরিবর্তিত হয় না, সুতরাং এটি পরিবর্তনশীল নয়। সংকলকগুলি সাধারণত ধ্রুবক তৈরি করে এমন কোড নির্গত করে না, সংকলকটি তৈরি করে এবং এটি যা কোড তৈরি করে তার সমস্ত কোডের রেফারেন্সকে নির্দেশ দেয়।
জিমি হফা

উত্তর:


23

আধুনিক জাভাস্ক্রিপ্ট ইঞ্জিনগুলি সমস্তই ইন-টাইম সংকলন করে। এটি "বার বার তৈরি করতে হবে" সে সম্পর্কে আপনি কোনও অনুমান করতে পারবেন না। এই ধরণের গণনা অপেক্ষাকৃত সহজ, উভয় ক্ষেত্রেই অপ্টিমাইজ করা সহজ।

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

এই ধরণের পরিস্থিতি এ কারণেই লোকেরা "অকাল অপ্টিমাইজেশন" লাইন ফেলে দেয়। সহজ অপ্টিমাইজেশানগুলি ইতিমধ্যে সংকলক দ্বারা সম্পন্ন হয়েছে।


আমি সন্দেহ করি এটি ভেরিয়েবল রেজোলিউশনের জন্য এটি স্কোপ ট্র্যাভারসাল যা আপনার উল্লেখ হিসাবে ক্ষতি ঘটাচ্ছে। যুক্তিসঙ্গত বলে মনে হচ্ছে তবে জাভাস্ক্রিপ্ট জেআইটি ইঞ্জিনে পাগলামি কী তা সত্যই জানে ...
জিমি হোফা

1
এই উত্তরটি সম্ভাব্য সম্প্রসারণ: কারণ একটি জে আই টি JIT একটি অপ্টিমাইজেশান একটি অফলাইন কম্পাইলার জন্য সহজে উপেক্ষা করবে কারণ পুরো কম্পাইলার কর্মক্ষমতা অস্বাভাবিক মামলার চেয়ে আরো গুরুত্বপূর্ণ।
লুশেনকো

12

চলকগুলি সস্তা are সম্পাদন প্রসঙ্গে এবং স্কোপ চেইনগুলি ব্যয়বহুল।

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

সুতরাং আপনার প্রথম ফাংশনে, যখন ইঞ্জিন এই বিবৃতিটি দেখবে:

var gbSize = size / GB;

এটি নিম্নলিখিত পদক্ষেপ নিতে হবে:

  1. sizeবর্তমান সুযোগে একটি পরিবর্তনশীল অনুসন্ধান করুন । (এটি খুঁজে পেয়েছে))
  2. GBবর্তমান সুযোগে একটি পরিবর্তনশীল অনুসন্ধান করুন । (পাওয়া যায় নি।)
  3. GBপ্যারেন্ট স্কোপে ভেরিয়েবলের সন্ধান করুন। (এটি খুঁজে পেয়েছে))
  4. গণনা করুন এবং বরাদ্দ করুন gbSize

পদক্ষেপ 3 কেবলমাত্র একটি ভেরিয়েবল বরাদ্দের চেয়ে যথেষ্ট ব্যয়বহুল। তদ্ব্যতীত, আপনি এটি পাঁচবার করেন , দু'বারের জন্য GBএবং দু'বারের জন্য MB। আমি সন্দেহ করি যে আপনি যদি ফাংশনের শুরুতে এগুলি var gb = GBআলাদা করে রেখেছিলেন (উদাঃ ) এবং পরিবর্তে উপনামটি উল্লেখ করেছেন তবে এটি আসলে একটি ছোট গতিপথ তৈরি করবে, যদিও এটি সম্ভব যে কিছু জেএস ইঞ্জিন ইতিমধ্যে এই অপটিমাইজেশনটি সম্পাদন করে। এবং অবশ্যই, কার্যকরকরণের গতি বাড়ানোর সবচেয়ে কার্যকর উপায়টি কেবল স্কোপ চেইনকে মোটেই অতিক্রম করা নয়।

মনে রাখবেন যে জাভাস্ক্রিপ্ট কোনও সংকলিত, স্ট্যাটিকালি-টাইপ করা ভাষার মতো নয় যেখানে সংকলক সংকলনের সময় এই পরিবর্তনশীল ঠিকানাগুলি সমাধান করে। জেএস ইঞ্জিনটি তাদের নাম অনুসারে সমাধান করতে হবে এবং প্রতিবার রান-টাইমে এই চেহারাগুলি ঘটে। সুতরাং আপনি যখন সম্ভব এগুলি এড়াতে চান।

ভেরিয়েবল অ্যাসাইনমেন্ট জাভাস্ক্রিপ্টে অত্যন্ত সস্তা। এটি আসলে সবচেয়ে সস্তা অপারেশন হতে পারে, যদিও আমার কাছে এই বিবৃতিটি ব্যাক আপ করার কিছু নেই। তা সত্ত্বেও, এটা প্রায় যে বলে নিরাপদ না একটি ভাল ধারণা চেষ্টা এড়াতে ভেরিয়েবল তৈরি; আপনি যে অঞ্চলে প্রায় কোনও অপ্টিমাইজেশানটি করার চেষ্টা করছেন তা আসলে জিনিসগুলি আরও খারাপ, কর্মক্ষমতা অনুসারে তৈরি করে চলেছে।


এমনকি যদি "অপ্টিমাইজেশান" নেতিবাচকভাবে কর্মক্ষমতা প্রভাবিত করে না, এটা প্রায় অবশ্যই হয় নেতিবাচকভাবে কোড পাঠযোগ্যতা প্রভাবিত করার যাচ্ছে। যা আপনি যদি কিছু ক্রেজি কম্পিউটেশনাল স্টাফ না করেন তবে এটি প্রায়শই খারাপ ট্রেড অফ (দুর্ভাগ্যক্রমে দুর্ভাগ্যক্রমে কোনও পারমালিক অ্যাঙ্কর নয়; "২০০৯-০২-১ 11 ১১:৪১" অনুসন্ধান করুন)। সেখানে সংক্ষিপ্তসারটি যেমন রয়েছে: "গতির উপরে সম্পূর্ণরূপে প্রয়োজন না হলে গতির চেয়ে স্বচ্ছতা চয়ন করুন" "
সিভিএন

গতিশীল ভাষার জন্য খুব প্রাথমিক দোভাষী লিখতে গিয়েও রানটাইম চলাকালীন চলক অ্যাক্সেস একটি ও (1) অপারেশন হতে থাকে এবং প্রাথমিক সংকলনের সময় ও (এন) স্কোপ ট্র্যাভারসাল এমনকি প্রয়োজন হয় না। প্রতিটি সুযোগে, প্রতিটি সদ্য ঘোষিত ভেরিয়েবলকে একটি সংখ্যা বরাদ্দ করা হয়, সুতরাং প্রদত্ত হিসাবে var a, b, cআমরা bহিসাবে অ্যাক্সেস করতে পারি scope[1]। সমস্ত স্কোপগুলি নম্বরযুক্ত, এবং যদি এই সুযোগটি পাঁচটি স্কোপ গভীরভাবে বাসা বাঁধে, তবে পার্সিংয়ের সময় পরিচিত যা bদ্বারা সম্পূর্ণরূপে সম্বোধন করা হবে env[5][1]। নেটিভ কোডে স্কোপগুলি স্ট্যাক সেগমেন্টের সাথে মিল রয়েছে। বন্ধ একটি আরো জটিল যেহেতু তারা ব্যাক আপ এবং প্রতিস্থাপন আবশ্যকenv
আমন

@ এমন: এটি সম্ভবত আপনি কাজ করতে পছন্দ করেন তবে এটি বাস্তবে কীভাবে কাজ করে তা তা নয়। আমার তুলনায় অনেক বেশি জ্ঞানী এবং অভিজ্ঞ লোকেরা এই বই লিখেছেন; বিশেষত আমি আপনাকে নিকোলাস সি জাকাসের উচ্চ পারফরম্যান্স জাভাস্ক্রিপ্টের দিকে নির্দেশ করব। এখানে একটি স্নিপেট রয়েছে এবং এটি ব্যাক আপ করার জন্য তিনি বেঞ্চমার্কের সাথে একটি আলাপও করেছিলেন। অবশ্যই তিনি একমাত্র নন, কেবল সর্বাধিক সুপরিচিত। জাভাস্ক্রিপ্টের লেক্সিকাল স্কোপিং রয়েছে, সুতরাং ক্লোজারগুলি আসলে এটি বিশেষ নয় - মূলত, সবকিছুই একটি বন্ধ।
অ্যারোনআট

অ্যারোনট যেহেতু সেই বইটি 5 বছরের পুরানো, আমি আগ্রহী ছিলাম বর্তমান জেএস ইঞ্জিনটি কীভাবে পরিবর্তনশীল লকআপগুলি পরিচালনা করে এবং ভি 8 ইঞ্জিনের এক্স 64 ব্যাকএন্ডের দিকে তাকিয়ে। স্থির বিশ্লেষণ চলাকালীন, বেশিরভাগ পরিবর্তনগুলি স্থিরভাবে সমাধান করা হয় এবং তাদের সুযোগে একটি মেমরি অফসেট বরাদ্দ করা হয়। ফাংশন স্কোপগুলি লিঙ্কযুক্ত তালিকাগুলি হিসাবে উপস্থাপিত হয় এবং সঠিক সুযোগে পৌঁছানোর জন্য অ্যাসেমব্লিকে একটি অনিবন্ধিত লুপ হিসাবে নির্গত হয়। এখানে, আমরা *(scope->outer + variable_offset)অ্যাক্সেসের জন্য সি কোডের সমতুল্য চাই ; প্রতিটি অতিরিক্ত ফাংশন স্কোপ স্তরের জন্য একটি অতিরিক্ত পয়েন্টার ডিरेফারেন্স লাগে। মনে হয় আমরা উভয় ডান :) ছিলেন
আমন

2

একটি উদাহরণ একটি বন্ধ জড়িত জড়িত, অন্য না। ক্লোজারগুলি প্রয়োগ করা কৌতূহলোদ্দীপক, যেহেতু বন্ধ ওভার ভেরিয়েবলগুলি সাধারণ ভেরিয়েবলগুলির মতো কাজ করে না। এটি সি এর মতো নিম্ন-স্তরের ভাষায় আরও সুস্পষ্ট, তবে আমি জাভাস্ক্রিপ্ট ব্যবহার করব এটি চিত্রিত করার জন্য।

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

function add(vars, y) {
  vars.x += y;
}

function getSum(vars) {
  return vars.x;
}

function makeAdder(x) {
  return { x: x, add: add, getSum: getSum };
}

var adder = makeAdder(40);
adder.add(adder, 2);
console.log(adder.getSum(adder));  //=> 42

এর closure.apply(closure, ...realArgs)জন্য প্রয়োজনীয় বিশ্রী কলিং কনভেনশনটি নোট করুন

জাভাস্ক্রিপ্টের অন্তর্নির্মিত অবজেক্ট সমর্থন স্পষ্ট varsযুক্তি বাদ দেওয়া সম্ভব করে তোলে এবং এর thisপরিবর্তে আমাদের ব্যবহার করতে দেয় :

function add(y) {
  this.x += y;
}

function getSum() {
  return this.x;
}

function makeAdder(x) {
  return { x: x, add: add, getSum: getSum };
}

var adder = makeAdder(40);
adder.add(2);
console.log(adder.getSum());  //=> 42

এই উদাহরণগুলি ক্লোজারগুলি ব্যবহার করে এই কোডটির সমতুল্য:

function makeAdder(x) {
  return {
    add: function (y) { x += y },
    getSum: function () { return x },
  };
}

var adder = makeAdder(40);
adder.add(2);
console.log(adder.getSum());  //=> 42

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

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

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