লুপ টীকাটির জন্য এই অতিরিক্ত পরিবর্তনশীলটি ব্যবহার করার কোনও সুবিধা আছে কি?


11

আমি যে বড় প্রকল্পে (সিউডোকোড) কাজ করছি তার মধ্যে নীচের লুপ টীকাটি পেয়েছি:

var someOtherArray = [];
for (var i = 0, n = array.length; i < n; i++) {
    someOtherArray[i] = modifyObjetFromArray(array[i]);
}

আমার মনোযোগ কী এনেছে তা হ'ল অতিরিক্ত "এন" পরিবর্তনশীল। আমি এর আগে কখনও লুপের জন্য লেখা দেখিনি।

স্পষ্টতই এই পরিস্থিতিতে এই কোডটি নিম্নলিখিত উপায়ে (যা আমি খুব অভ্যস্ত) লিখিত না হতে পারে তার কোনও কারণ নেই:

var someOtherArray = [];
for (var i = 0; i < array.length; i++) {
    someOtherArray[i] = modifyObjetFromArray(array[i]);
}

কিন্তু এটি আমার চিন্তাভাবনা পেয়েছে।

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

লুপের মধ্যে অ্যারে সঙ্কুচিত করা খুব বেশি অর্থবোধ করে না, কারণ আমরা আউটফাউন্ডস এক্সসেপশন পাওয়ার সম্ভাবনা পেয়েছি।

এই টীকাটি কার্যকর হয় এমন কোনও ডিজাইনের প্যাটার্ন রয়েছে কি?

@ জেরি 101 দ্বারা উল্লিখিত হিসাবে সম্পাদনা করুন কার্যকারিতা। আমি তৈরি করেছি পারফরম্যান্স পরীক্ষার লিঙ্কটি এখানে: http://jsperf.com/ninforloop । আমার মতে পার্থক্য যথেষ্ট বড় না যদি আপনি খুব বড় অ্যারে যদিও পুনরাবৃত্তি করেন। আমি যে কোডটি অনুলিপি করেছি তাতে কেবল 20 টি উপাদান রয়েছে, তাই আমি মনে করি এই ক্ষেত্রে পাঠযোগ্যতা কর্মক্ষমতা বিবেচনার চেয়ে বেশি।


প্রতিক্রিয়া হিসাবে আপনি সম্পাদনা: এটি অবজেক্ট ওরিয়েন্টেড প্রোগ্রামিং। স্ট্যান্ডার্ড অ্যারে। দৈর্ঘ্য দ্রুত এবং সস্তা। তবে যে কারণেই হোক না কেন। দৈর্ঘ্যের বাস্তবায়ন ব্যয়বহুল কিছুতে পরিবর্তিত হতে পারে। যদি মান একই থাকে তবে একাধিকবার এটি পাবেন না।
পিটার বি

আমি রাজী. এই বিকল্পটি সম্পর্কে জেনে রাখা ভাল, তবে আমি আপনার এসএলএল কোয়েরিতে অনুরূপ উদাহরণ না পেলে আমি সম্ভবত এটি প্রায়শই ব্যবহার করব না। আপনাকে ধন্যবাদ
ভ্লাদ স্প্রেস

কথাটি হ'ল, যদি আপনার অ্যারেটি মিলিয়ন আইটেম হয় তবে আপনি 1 বারের পরিবর্তে এক মিলিয়ন বার অ্যারেআরএলথকে কল করতে যাচ্ছেন যখন মান একই থাকে। কয়েক মিলিয়ন বার জিজ্ঞাসা করা এবং পরবর্তী প্রতিটি উত্তর প্রথম উত্তরের সমান হবে তা জেনে ...... আমার কাছে কিছুটা অযৌক্তিক মনে হচ্ছে।
পিটার বি

1
আমি খুঁজে পাই না যে এটি কোডটি পড়ার পক্ষে উল্লেখযোগ্যভাবে শক্ত করে তোলে। (সিরিয়াসলি, যদি কারও এমন সাধারণ লুপটি নিয়ে সমস্যা হয় তবে তাদের চিন্তিত হওয়া উচিত।) তবে: ১) আমি চার দশক সি এবং সি অবতীর্ণ ভাষাগুলির পরে যদি প্রতিটি গুরুতর সংকলক ইতিমধ্যে এটি না করে থাকে তবে আমি ভীষণ অবাক হব be তোমার জন্য; এবং 2) এটি কোনও গরম জায়গা নাও থাকতে পারে। এটা তোলে মূল্য তৈরীর কেউ এটা পার্স একটি লাইব্রেরি ভিতরে যদি না এটা একটি অতিরিক্ত 5 সেকেন্ড ব্যয় বলে মনে হচ্ছে না (যেমন একটি ডাটা স্ট্রাকচার বাস্তবায়ন।)
Doval

1
সি # /। নেট-এ ভেরিয়েন্টটি ব্যবহার করে বৈকল্পিকের nচেয়ে ধীর গতি হতে পারে array.Lengthযেহেতু জিত্তর খেয়াল করতে পারে না যে এটি অ্যারে বাউন্ড চেকগুলি অপসারণ করতে পারে।
কোডসইনচওস

উত্তর:


27

ভেরিয়েবল nনিশ্চিত করে যে উত্পন্ন কোডটি প্রতিটি পুনরাবৃত্তির জন্য অ্যারের দৈর্ঘ্য আনবে না।

এটি এমন একটি অপ্টিমাইজেশন যা ব্যবহৃত ভাষার উপর নির্ভর করে রান টাইমে একটি পার্থক্য তৈরি করতে পারে, অ্যারে আসলে সংগ্রহের বিষয় বা জাভাস্ক্রিপ্ট "অ্যারে" এবং অন্যান্য অপ্টিমাইজেশনের বিশদ কিনা।


3
না, তা হয় না। কিনা অ্যারে এর দৈর্ঘ্য সংগৃহীত প্রত্যেক পুনরাবৃত্তির নির্ভর না শুধুমাত্র ভাষার উপর, কিন্তু কম্পাইলার এবং কম্পাইলার অপশন এবং কি লুপ মধ্যে সম্পন্ন করা হয় মধ্যে (আমি C ও C সম্পর্কে ++, কথা বলছি)
BЈовић

.. এবং তবুও, আমি ব্যক্তিগতভাবে এন এসাইনমেন্টটি লুপের ঠিক উপরে রাখি যদি আমি সত্যিই এটি চাইতাম, যেহেতু - ওপি হিসাবে উল্লেখ করা হয়েছে - এটি একটি বিরল (ওয়াইএমএমভি) ব্যবহারের জন্য নির্মিত এবং এটি সহজেই মিস / অন্যান্য ডিভস পড়ার দ্বারা বোঝা যায় না কোড.
30:15

20
যেমনটি লেখা আছে, এটি nলুপের দিকে যায়, যা সাধারণত একটি ভাল জিনিস। আমি এটি লুপের আগে কেবল তখনই সংজ্ঞায়িত করব যদি আমি পরে এটি আবার ব্যবহার করতে চাই।
জেরি 101

4
@ জেরি ১০১১: স্পষ্টতই উদাহরণ স্নিপেটটি জাভাস্ক্রিপ্ট, যেখানে লুপ স্কোপ বলে কিছুই নেই…
বার্গি

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

2

অ্যারের দৈর্ঘ্য আনতে সহজেই "আরও ব্যয়বহুল" হতে পারে তবে আসল ক্রিয়াটি আপনি পুনরাবৃত্তি করতে পারেন।

সুতরাং যদি সেটটি পরিবর্তন না হয় তবে কেবল একবার দৈর্ঘ্যটি জিজ্ঞাসা করুন।

অ্যারে দিয়ে নয়, তবে স্কয়ার সার্ভার থেকে আসা রেকর্ড-সেটগুলির সাথে আমি প্রতিটি পুনরাবৃত্তিতে রেকর্ড-গণনা জিজ্ঞাসাবাদ না করে নাটকীয় উন্নতি দেখেছি। (অবশ্যই আপনি যদি গ্যারান্টি দিতে পারেন তবে এই প্রক্রিয়া চলাকালীন রেকর্ড-সেটটি পরিবর্তিত হবে না)


যদি রেকর্ড গণনা পরিবর্তন হয়, তবে কী? বলুন এখানে 100 টি আইটেম ছিল এবং আপনি 50 আইটেমটি প্রক্রিয়া করার সময় # 25 এর পরে একটি আইটেম .োকানো হবে। সুতরাং আপনি যখন # 51 আইটেমটি প্রক্রিয়া করেন তখন এটি # 50 এর সমান যা আপনি ইতিমধ্যে প্রক্রিয়া করেছেন এবং জিনিসগুলি ভুল হয়ে যায়। সুতরাং সমস্যাটি দৈর্ঘ্যের পরিবর্তনের নয়, এটি অনেক বেশি বিস্তৃত।
gnasher729

@ gnasher729 একবার অসম্পূর্ণ আচরণে উঠলে অনেক কিছুই ভুল হতে পারে। তবে এর বিরুদ্ধে আপনি কিছু করতে পারেন যেমন শুরু করা এবং স্কেল লেনদেন।
পিটার বি

2

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

পারফরম্যান্স সম্পর্কে যে লোকেরা কথা বলছেন তারা সম্ভবত সঠিক যে এ কারণেই এটি সেভাবে লেখা হয়েছিল (যে ব্যক্তি এটি সেভাবে লিখেছিল এটি সঠিক নাও হতে পারে যে এটি কার্যক্ষমতাকে উল্লেখযোগ্যভাবে প্রভাবিত করে, তবে এটি অন্য বিষয়)।

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

guests = [];
for (i = 0; i < invitations.length; ++i) {
    if (! invitations[i].is_declined()) {
        guests.append(invitations[i].recipient())
    }
}
// maybe some other stuff to modify the guestlist
for (i = 0, n = guests.length; i < n; ++i) {
    if (guests[i].has_plus_one()) {
        guests.append(guests[i].get_plus_one());
    }
}

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

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


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

0

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

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