জাভা স্ক্রিপ্টে অপরিবর্তনীয়তা কর্মক্ষমতা আঘাত করে?


88

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

আমার প্রাথমিক প্রতিক্রিয়াটি হ'ল, মনে হচ্ছে এটি পারফরম্যান্সের জন্য খারাপ।

কিন্তু তারপর মত লাইব্রেরি Immutable.js এবং Redux.js আমার চেয়ে আরও স্মার্ট মানুষ লেখা হয়, এবং কর্মক্ষমতা জন্য একটি শক্তিশালী উদ্বেগ আছে বলে মনে হচ্ছে, তাই এটি আমার ভাবছি যদি আবর্জনা আমার বোঝার (এবং তার কর্মক্ষমতা প্রভাব) ভুল করে তোলে।

আমি যে অস্থিরতার জন্য অভাব বোধ করছি তার কার্যকারিতা বেনিফিটগুলি কী আছে এবং এগুলি এত বেশি আবর্জনা তৈরি করার দিকটি কি অতিক্রম করে?


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

8
আমার অভিজ্ঞতায়, পারফরম্যান্স কেবল দুটি পরিস্থিতির জন্য একটি বৈধ উদ্বেগ - একটি, যখন কোনও ক্রিয়াকলাপ যখন এক সেকেন্ডে 30+ বার করা হয় এবং দুটি - যখন এর কার্যকারিতা প্রতিটি সম্পাদনের সাথে বৃদ্ধি পায় (উইন্ডোজ এক্সপি একবার একটি বাগ খুঁজে পেল যেখানে উইন্ডোজ আপডেটের সময় নিয়েছিল এর ইতিহাসের প্রতিটি আপডেটেরO(pow(n, 2)) জন্য )) বেশিরভাগ অন্যান্য কোড কোনও ইভেন্টের তাত্ক্ষণিক প্রতিক্রিয়া; একটি ক্লিক, এপিআই অনুরোধ, বা অনুরূপ, এবং যতক্ষণ না এক্সিকিউশন সময় স্থির থাকে ততক্ষণ যতগুলি অবজেক্টের ক্লিনআপ খুব কমই গুরুত্বপূর্ণ।
কাতানা 314

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

1
@ কটানা ৩১৪: আমার পক্ষে ৩০++ বার পারফরম্যান্স সম্পর্কে চিন্তিত হওয়ার পক্ষে যথেষ্ট প্রমাণিত হবে না। আমি একটি ছোট সিপিইউ এমুলেটর পোর্ট করেছি আমি নোড.জেজে লিখেছি এবং নোডটি প্রায় 20MHz এ ভার্চুয়াল সিপিইউ সম্পাদন করে (এটি প্রতি সেকেন্ডে 20 মিলিয়ন বার)। সুতরাং আমি কেবল পারফরম্যান্স নিয়েই চিন্তিত থাকি যদি আমি প্রতি সেকেন্ডে 1000+ বার কিছু করতাম (তবুও, আমি প্রতি সেকেন্ডে 1000000 অপারেশন না করা পর্যন্ত সত্যই চিন্তা করব না কারণ আমি জানি যে আমি তাদের মধ্যে 10 টিরও বেশি একবারে করতে পারি) ।
slebetman

2
@ রবার্টহারভে "অপরিবর্তনীয়তা, কেবল নিজেরাই, এই অর্থে পারফরম্যান্স সুবিধাগুলি রয়েছে যে এটি মাল্টি-থ্রেড কোড লিখতে সহজ করে তোলে।" এটি সম্পূর্ণ সত্য নয়, অপরিবর্তনীয়তা সত্যিকারের পরিণতি ছাড়াই অত্যন্ত বিস্তৃত অংশীদারিত্বের অনুমতি দেয়। যা একটি পরিবর্তনীয় পরিবেশে খুব নিরাপদ। এটি আপনাকে O(1)অ্যারে কাটা এবং O(log n)বাইনারি গাছের মধ্যে সন্নিবেশ করার মতো মনে করে যখন পুরানোটি অবাধে ব্যবহার করতে সক্ষম হয় এবং অন্য একটি উদাহরণ tailsযা তালিকার সমস্ত লেজগুলিতে tails [1, 2] = [[1, 2], [2], []]লাগে কেবল O(n)সময় এবং স্থান লাগে , তবে O(n^2)উপাদান গণনায় থাকে
সেমিকোলন

উত্তর:


59

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

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

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

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

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

এই পরিস্থিতির জন্য আমার ব্যক্তিগত নিয়মটি হ'ল:

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

এই দুটি চরমের মধ্যে অবস্থার জন্য, আপনার রায়টি ব্যবহার করুন। তবে ওয়াইএমএমভি।


8
That will leave a lot more garbage than in your case.এবং বিষয়টিকে আরও খারাপ করার জন্য আপনার রানটাইমটি সম্ভবত অর্থহীন অনুলিপি সনাক্ত করতে অক্ষম হবে এবং এইভাবে (মেয়াদোত্তীর্ণ অপরিবর্তনীয় বস্তুটি কেউ ব্যবহার করছে না তার বিপরীতে) এটি সংগ্রহের জন্যও যোগ্য হবে না।
জ্যাকব রায়হলে

37

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

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

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

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


8
"... তারপরে আমি একই অ্যালগরিদমের সাধারণ আবশ্যকীয় সংস্করণ দেখাব যা ঠিক ততটাই তৈরি করে।" এই. এছাড়াও, এই শৈলীতে নতুন এবং বিশেষত যদি তারা সাধারণভাবে কার্যকরী শৈলীতে নতুন হয় তবে তারা প্রাথমিকভাবে উপ-অনুকূল কার্যকরী বাস্তবায়নগুলি উত্পাদন করতে পারে।
ওয়াবেরি

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

33

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

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

ধীরে দ্রুত /

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

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

পরিবর্তনযোগ্য বিট এবং বাইটগুলি Trans

নিম্ন স্তরের দৃষ্টিকোণ থেকে আসছে, যদি আমরা এক্সরে ভালো ধারণা objectsএবং stringsতা অন্তরে তাই ঘোষণা, শুধু বিট এবং বিভিন্ন গতি / আকার বৈশিষ্ট্য সঙ্গে মেমরির বিভিন্ন ধরনের (গতি এবং মেমরি হার্ডওয়্যার আকার সাধারণত হচ্ছে বাইট পারস্পরিক একচেটিয়া)।

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

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

আমরা এই প্রক্রিয়াটিতে একটি রেঞ্চ ফেলে দিচ্ছি যদি এই মেমরিটি সংশোধন করে পাশের দিকে সম্পূর্ণ নতুন মেমরি ব্লক তৈরি করতে ইচ্ছুক হয়:

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

... এই ক্ষেত্রে, নতুন মেমরি ব্লক অ্যাক্সেস করার জন্য এটিকে মেমরির দ্রুততম ফর্মগুলিতে (রেজিস্টারে সমস্ত ভাবেই) ফিরে যেতে বাধ্যতামূলক পৃষ্ঠা ত্রুটিগুলি এবং ক্যাশে মিস করা প্রয়োজন হতে পারে। এটি একটি বাস্তব পারফরম্যান্স হত্যাকারী হতে পারে।

এটি প্রশমিত করার উপায় রয়েছে, তবে ইতিমধ্যে স্পর্শকৃত মেমরির একটি রিজার্ভ পুল ব্যবহার করে।

বড় সমষ্টি

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

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

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

এই ক্ষেত্রে যদি আমরা "সহায়তা" কে "কেআইএলএল" এর সাথে প্রতিস্থাপন করতে চেয়েছিলাম এবং এই মেমরি ব্লকটি অপরিবর্তনীয় ছিল, তবে এর একটিমাত্র অংশ পরিবর্তিত হলেও আমরা একটি সম্পূর্ণ নতুন ব্লক তৈরি করতে হবে একটি অনন্য নতুন অবজেক্ট তৈরি করতে would :

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

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

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

এই অপ্রয়োজনীয় অনুলিপি কাজের প্রশমিত করার একটি উপায় হ'ল এই মেমরি ব্লকগুলিকে পয়েন্টারগুলির একটি সংকলন (বা রেফারেন্স) অক্ষরগুলিতে তৈরি করা, যেমন:

দুঃখিত, আমি অনুধাবন করতে ব্যর্থ হয়েছি Lডায়াগ্রামটি তৈরি করার সময় আমাদের অনন্য তৈরি করার দরকার নেই ।

নীল অগভীর অনুলিপি করা ডেটা নির্দেশ করে।

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

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

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

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

এই ক্ষেত্রে, আমরা এই স্ট্রিংটি অতিক্রম করতে লোড করতে 7 টি বিভিন্ন ক্যাশে লাইন প্রয়োজনীয় মাপের স্মৃতি প্রয়োজন, যখন আদর্শভাবে আমাদের কেবল 3 টি প্রয়োজন।

ডেটা কাটা

উপরের সমস্যাটি প্রশমিত করতে, আমরা একই বেসিক কৌশলটি প্রয়োগ করতে পারি তবে 8 টি অক্ষরের মোটা স্তরে উদাহরণস্বরূপ

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

ফলাফলটির জন্য 4 টি ক্যাশে লাইনগুলির ডেটা প্রয়োজন (3 পয়েন্টারগুলির জন্য 1, এবং অক্ষরের জন্য 3) এই স্ট্রিংটি অতিক্রম করতে লোড করা দরকার যা তাত্ত্বিক সর্বোত্তমতার মাত্র 1 সংক্ষিপ্ত।

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

দ্রুততা

সুতরাং উপরের মতো উপস্থাপনাকে কাজে লাগানো পারফরম্যান্সের বেশ শালীন ভারসাম্য দিতে পারে। সম্ভবত অপরিবর্তনীয় ডেটা স্ট্রাকচারের সর্বাধিক কর্মক্ষমতা-সমালোচনামূলক ব্যবহারগুলি অবিচ্ছেদ্য খণ্ডগুলি অনুলিপি করার সময় অবিচ্ছিন্ন উপাত্তের টুকরোগুলি পরিবর্তিত করে প্রক্রিয়াটিতে তাদের অনন্য করে তুলবে nature এটি বহুবিশ্লেষিত প্রসঙ্গে নিরাপদে অগভীর অনুলিপি করা টুকরো টুকরো টুকরো টুকরো টুকরো টুকরো টুকরো টুকরো টুকরো টুকরো টুকরো টুকরো টুকরো টুকরো টুকরো করে রেখেছে (সম্ভবত কিছু পারমাণবিক রেফারেন্স-গণনা চলছে)।

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

নতুন এবং পুরানো ডেটা রাখা

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

উদাহরণ: সিস্টেম পূর্বাবস্থায় ফেরান

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

উচ্চ-স্তরের ইন্টারফেস

তবুও উপরের কেসটির সাথে বিশ্রী কিছু উদ্ভাসিত হয়েছে। স্থানীয় ধরনের ফাংশন প্রসঙ্গে, পরিবর্তনীয় ডেটা প্রায়শই সবচেয়ে সহজ এবং সর্বাধিক সোজা ward সর্বোপরি, একটি অ্যারে সংশোধন করার সহজতম উপায় হ'ল প্রায়শই এটির মধ্য দিয়ে লুপ করা এবং একবারে একটি উপাদান পরিবর্তন করা। অ্যারে রূপান্তর করতে যদি আমাদের কাছে উচ্চ স্তরের অ্যালগরিদমগুলি বেছে নেওয়ার জন্য প্রচুর সংখ্যক উচ্চ স্তরের অ্যালগরিদম থাকে এবং এই সমস্ত খাঁটি অগভীর অনুলিপিগুলি তৈরি করা হয় তবে পরিবর্তিত অংশগুলি হ'ল তা নিশ্চিত করার জন্য উপযুক্তটিকে বাছাই করতে হলে আমরা বৌদ্ধিক ওভারহেড বাড়িয়ে শেষ করতে পারি We অনন্য করা হয়েছে।

সম্ভবত এই ক্ষেত্রেগুলির সহজতম উপায় হ'ল স্থানীয়ভাবে কোনও ফাংশনের প্রসঙ্গে (যেখানে তারা সাধারণত আমাদের ট্রিপ দেয় না) পরিবর্তনের জন্য একটি নতুন পরিবর্তনীয় অনুলিপি পেতে ডেটা কাঠামোয় পরমাণুভাবে পরিবর্তন করে থাকে (আমি বিশ্বাস করি যে কয়েকটি ভাষায় কল আসে) এই "স্থানান্তর") ...

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

উপাত্ত কাঠামো

এখানে আর একটি বিষয় দেখা দেয় যে পারফরম্যান্স-সমালোচনামূলক প্রসঙ্গে ব্যবহৃত অপরিবর্তনীয়তা সম্ভবত ডেটা স্ট্রাকচারকে চানকি ডেটাগুলিতে ভাঙতে চায় যেখানে খণ্ডগুলি আকারে খুব ছোট নয় তবে খুব বড়ও নয়।

লিঙ্কযুক্ত তালিকাগুলি এটিকে সামঞ্জস্য করার জন্য এবং লিখিত তালিকাভুক্ত তালিকাতে পরিণত হতে বেশ কিছুটা পরিবর্তন করতে চাইবে। বড়, সংমিশ্রিত অ্যারেগুলি এলোমেলো অ্যাক্সেসের জন্য মডুলো সূচিকর্মের সাথে সংলগ্ন অংশগুলিতে পয়েন্টারগুলির একটি অ্যারে পরিণত হতে পারে।

এটি ডেটা স্ট্রাকচারের পরিবর্তনের ফাংশনগুলিকে বাল্কিয়ার প্রকৃতির সাথে সাদৃশ্য করতে এখানে কিছু বিট অনুলিপি করতে এবং সেখানে অন্যান্য বিটগুলি অনন্য করে তুলতে সম্ভাব্যভাবে পরিবর্তন করে data

কর্মক্ষমতা

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

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

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


11

ImmutableJS আসলে বেশ দক্ষ। যদি আমরা একটি উদাহরণ নিই:

var x = {
    Foo: 1,
    Bar: { Baz: 2 }
    Qux: { AnotherVal: 3 }
}

যদি উপরের বিষয়টিকে অপরিবর্তনীয় করে তোলা হয় তবে আপনি 'বাজ' সম্পত্তিটির যা যা পাবেন তার মূল্য পরিবর্তন করুন:

var y = x.setIn('/Bar/Baz', 3);
y !== x; // Different object instance
y.Bar !== x.Bar // As the Baz property was changed, the Bar object is a diff instance
y.Qux === y.Qux // Qux is the same object instance

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

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


4

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

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


4

এটিতে (ইতিমধ্যে সর্বোত্তমভাবে উত্তর দেওয়া হয়েছে) প্রশ্নের সাথে যুক্ত করতে:

সংক্ষিপ্ত উত্তর হ্যাঁ ; এটি কার্যকারিতা ক্ষতিগ্রস্থ করবে কারণ আপনি কেবলমাত্র বিদ্যমানগুলিকে পরিবর্তনের পরিবর্তে কেবলমাত্র বস্তু তৈরি করছেন, ফলশ্রুতিতে আরও বেশি অবজেক্ট তৈরি হবে।


তবে, দীর্ঘ উত্তরটি আসলে নয়

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

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

অপরিবর্তনীয়তা ব্যবহার করা বিষয়গুলি সম্পর্কে বিতর্ক করা অনেক সহজ করে তোলে । আপনি অবিলম্বে জানতে পারবেন যে এক্স অবজেক্টটি তার জীবদ্দশায় পরিবর্তিত হচ্ছে না এবং এর পরিবর্তনের একমাত্র উপায় এটি ক্লোন করা। পরিবর্তনের যে কোনও মাইক্রো-অপটিমাইজেশন আনতে পারে তার চেয়ে আমি এটিকে অনেক বেশি মূল্যবান (বিশেষত দলের পরিবেশে)।

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


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


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

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