আরার = [] আরার = নতুন অ্যারের চেয়ে দ্রুত কেন?


146

আমি এই কোডটি চালিয়েছি এবং নীচের ফলাফল পেয়েছি। আমি জানতে আগ্রহী কেন []দ্রুত হয়?

console.time('using[]')
for(var i=0; i<200000; i++){var arr = []};
console.timeEnd('using[]')

console.time('using new')
for(var i=0; i<200000; i++){var arr = new Array};
console.timeEnd('using new')
  • ব্যবহার []: 299ms
  • ব্যবহার new: 363ms

রায়নোসকে ধন্যবাদ এখানে এই কোডের একটি মানদণ্ড এবং ভেরিয়েবল সংজ্ঞায়নের আরও কয়েকটি সম্ভাব্য উপায়।

এখানে চিত্র বর্ণনা লিখুন


5
আপনি jsperf আগ্রহী হতে পারে ।
পয়েন্টটি


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

2
@কিনাকুট না তারা উভয়ই নতুন অ-সমান অবজেক্ট তৈরি করে। আমার অর্থ উত্স কোডের বিচারে []সামঞ্জস্যপূর্ণ new Array(), বস্তুগুলি ফর্মের এক্সপ্রেশনগুলি
ফেরেনি

1
হ্যাঁ, এটি খুব গুরুত্বপূর্ণ নয়। তবে আমি জানতে পছন্দ করি।
মোহসেন

উত্তর:


195

পূর্ববর্তী উত্তরগুলিতে আরও প্রসারণ করা হচ্ছে ...

একটি সাধারণ সংকলক দৃষ্টিকোণ থেকে এবং ভিএম-নির্দিষ্ট অপ্টিমাইজেশন উপেক্ষা:

প্রথমত, আমরা সংক্ষিপ্ত বিশ্লেষণের পর্যায়ে যাব যেখানে আমরা কোডটিকে টোকনাইজ করি।

উদাহরণস্বরূপ, নিম্নলিখিত টোকেন উত্পাদিত হতে পারে:

[]: ARRAY_INIT
[1]: ARRAY_INIT (NUMBER)
[1, foo]: ARRAY_INIT (NUMBER, IDENTIFIER)
new Array: NEW, IDENTIFIER
new Array(): NEW, IDENTIFIER, CALL
new Array(5): NEW, IDENTIFIER, CALL (NUMBER)
new Array(5,4): NEW, IDENTIFIER, CALL (NUMBER, NUMBER)
new Array(5, foo): NEW, IDENTIFIER, CALL (NUMBER, IDENTIFIER)

আশা করি এটি আপনার পর্যাপ্ত ভিজ্যুয়ালাইজেশন সরবরাহ করবে যাতে আপনি বুঝতে পারবেন যে আরও কতগুলি (বা কম) প্রসেসিং প্রয়োজন।

  1. উপরের টোকেনগুলির উপর ভিত্তি করে, আমরা জানি সত্য হিসাবে ARRAY_INIT সর্বদা একটি অ্যারে উত্পাদন করে। অতএব আমরা কেবল একটি অ্যারে তৈরি করি এবং এটি পপুলেট করি। অস্পষ্টতা হিসাবে, লেজিকাল অ্যানালাইসিস স্টেজ ইতিমধ্যে একটি বস্তুর সম্পত্তি অ্যাক্সেসর (উদাহরণস্বরূপ obj[foo]) বা স্ট্রিং / রেজেক্স লিটারেলের ভিতরে বন্ধনীগুলি (যেমন "foo [] বার" বা / [] /) থেকে আরআরএআইপিআইটি পৃথক করেছে eg

  2. এটি মিনিস্কুল, তবে আমাদের আরও টোকেনও রয়েছে new Array। তদতিরিক্ত, এটি এখনও সম্পূর্ণ পরিষ্কার নয় যে আমরা কেবল একটি অ্যারে তৈরি করতে চাই। আমরা "নতুন" টোকেন দেখি, তবে "নতুন" কী? তারপরে আমরা আইডেন্টিফায়ার টোকনটি দেখি যা সূচিত করে যে আমরা একটি নতুন "অ্যারে" চাই, তবে জাভাস্ক্রিপ্ট ভিএম এর সাধারণত "স্থানীয় গ্লোবাল অবজেক্টস" এর জন্য কোনও পরিচয়দাতা টোকেন এবং টোকেন আলাদা করে না। অতএব ...

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

  4. একবার আমরা ভেরিয়েবল ডিক্লেয়ারেশনটি সন্ধান করার পরে আমরা কনস্ট্রাক্টরকে অনুরোধ করব। new Arrayএকটি অন্তর্নিহিত ফাংশন কল, এবং থাম্বের নিয়মটি হ'ল ফাংশন কলগুলি কার্যকর করার সময় ধীর হয় (সুতরাং স্থির সি / সি ++ সংকলকগুলি "ফাংশন ইনলাইনিং" - যা স্পাইডারমনকি-এর মতো জেএস জেআইটি ইঞ্জিনগুলি অন-দ্য ফ্লাই করতে হবে)

  5. Arrayকন্সট্রাকটর ওভারলোড করা হয়। অ্যারে কনস্ট্রাক্টর স্থানীয় কোড হিসাবে প্রয়োগ করা হয় সুতরাং এটি কিছু কার্যকারিতা বর্ধন করে তবে এটি এখনও আর্গুমেন্টের দৈর্ঘ্যের জন্য পরীক্ষা করে তদনুযায়ী কাজ করতে হবে। তদ্ব্যতীত, ইভেন্টে কেবল একটি যুক্তি সরবরাহ করা হয়, আমাদের তর্কটির ধরণ আরও পরীক্ষা করতে হবে। নতুন অ্যারে ("foo") ["foo"] উত্পাদন করে যেখানে নতুন অ্যারে (1) উত্পাদন করে [অপরিবর্তিত]

সুতরাং এগুলি সব সরল করার জন্য: অ্যারে আক্ষরিক সাথে, ভিএম জানে আমরা একটি অ্যারে চাই; এর সাথে new Array, ভিএমকে অতিরিক্ত সিপিইউ চক্র ব্যবহার করতে হবে যা new Array প্রকৃতপক্ষে কী তা নির্ধারণ করে।


(0 থেকে 999 পর্যন্ত) জন্য = নতুন অ্যারে (1000) নয় {a [i] = i a a = [] এর চেয়ে দ্রুত; 0 a [i] = i} কারণ ওভারহেড বরাদ্দ যদিও?
Y. Yoshii

সবেমাত্র একটি পরীক্ষার মামলা করেছে। নতুন অ্যারে (ঢ) দ্রুততর ক্ষেত্রে যেখানে আপনি সময় এগিয়ে অ্যারের আকার জানি হয় jsperf.com/square-braces-vs-new-array
ওয়াই Yoshii

27

একটি সম্ভাব্য কারণ হ'ল new Arrayনাম অনুসন্ধানের প্রয়োজন Array(আপনার সুযোগে সেই নামের সাথে একটি ভেরিয়েবল থাকতে পারে), যেখানে []নেই।


4
যুক্তি যাচাই করাও অবদান রাখতে পারে।
লিওনিড

Arrayএকটি যুক্তি lenএবং একাধিক যুক্তি উভয়ই বাদ দেয় । যেখানে []কেবল একাধিক যুক্তি গ্রহণ করে। এছাড়াও ফায়ারফক্স পরীক্ষাগুলি প্রায় কোনও পার্থক্য দেখায় না।
রায়নস

আমি মনে করি এর কিছু সত্যতা আছে। আইআইএফইতে ওপির লুপ পরীক্ষা চালানো পারফরম্যান্সের উপর (তুলনামূলকভাবে) যথেষ্ট প্রভাব ফেলবে। সহ পরীক্ষার var Array = window.Arrayকর্মক্ষমতা উন্নত করে new Array
ব্যবহারকারী 113716

আমি ঠিক মনে করি না কারণ এই কনসোল.টাইম ('আরও ভার্স নতুন'); (var i = 0; i <200000; i ++) {var অ্যারে = নতুন অ্যারে ()}; কনসোল.টাইমএন্ড ('আরও ভার্স নতুন'); আরও ভার্সেস নতুন: 390 মিমি এবং এই কনসোল.টাইম ('আরও ভার্স নতুন'); var myOtherObject = {}, myOtherArray = []; (var i = 0; i <200000; i ++) {var অ্যারে = নতুন অ্যারে ()}; কনসোল.টাইমএন্ড ('আরও ভার্স নতুন'); আরও ভার্সেস নতুন: 369ms একই সময়ে ফিরেছে
মোহসেন

2

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

পারফরম্যান্সের তুলনামূলকভাবে ছোট পার্থক্যটি আমার মনে হয় এই বিষয়টিকে সমর্থন করে। আপনি একইভাবে অবজেক্ট এবং অবজেক্ট আক্ষরিক with with দিয়ে একই পরীক্ষা করতে পারেন।


1

এটি কিছু অর্থবহ হবে

অবজেক্ট লিটারালস আমাদের কোড লিখতে সক্ষম করে যা প্রচুর বৈশিষ্ট্যগুলিকে সমর্থন করে এখনও আমাদের কোডটির প্রয়োগকারীদের জন্য এটি তুলনামূলক সহজবোধ্য করে তোলে। সরাসরি কনস্ট্রাক্টরদের ডেকে আনা বা ফাংশন ইত্যাদিতে পাস হওয়া আর্গুমেন্টের সঠিক ক্রম বজায় রাখার দরকার নেই etc.

http://www.dyn-web.com/tutorials/obj_lit.php


1

এছাড়াও, আকর্ষণীয়, অ্যারের দৈর্ঘ্য যদি আগেই জানা থাকে (উপাদানগুলি তৈরির ঠিক পরে যুক্ত করা হবে) তবে সাম্প্রতিক গুগল ক্রোম 70+ এ একটি নির্দিষ্ট দৈর্ঘ্যের সাথে অ্যারে কনস্ট্রাক্টরের ব্যবহার আরও দ্রুত

  • " নতুন অ্যারে ( % ARR_LENGTH% ) " - 100% (দ্রুত) !

  • " [] " - 160-170% (ধীর)

পদক্ষেপের ফলাফল সহ চার্ট।

পরীক্ষাটি এখানে পাওয়া যাবে - https://jsppha.com/small-arr-init-with- জ্ঞান- দৈর্ঘ্য- বন্ধনী-vs - new - array/2

দ্রষ্টব্য: এই ফলাফলটি গুগল ক্রোমে v.70 + এ পরীক্ষিত ; মধ্যে ফায়ারফক্স v.70 এবং আইই উভয় সমান রূপ।

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