অবজেক্ট-ওরিয়েন্টেশন কি আসলেই অ্যালগরিদমের কার্যকারিতা প্রভাবিত করে?


14

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

ওও দ্রুত এবং সহজেই অ্যালগরিদমগুলিকে কোডিংয়ে সত্যই সহায়ক। পারফরম্যান্সের ভিত্তিতে সফটওয়্যারগুলির জন্য এই ওওপি কোনও অসুবিধা হতে পারে অর্থাৎ প্রোগ্রামাম কত দ্রুত চালায়?

উদাহরণস্বরূপ, কোনও ডাটা স্ট্রাকচারে গ্রাফ নোডগুলি সংরক্ষণ করা প্রথম স্থানে "সোজা" বলে মনে হয় তবে নোড অবজেক্টগুলিতে যদি অনেকগুলি বৈশিষ্ট্য এবং পদ্ধতি থাকে তবে এটি কি ধীরে ধীরে অ্যালগরিদম বাড়ে?

অন্য কথায়, অনেকগুলি বিভিন্ন অবজেক্টের মধ্যে অনেকগুলি রেফারেন্স, বা অনেক ক্লাসের অনেক পদ্ধতি ব্যবহার করে, "ভারী" বাস্তবায়ন হতে পারে?


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

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

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

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

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

উত্তর:


16

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

সংখ্যাযুক্ত লাইব্রেরি দেখুন। তাদের মধ্যে অনেকগুলিই (কেবল 60 বা 70 এর দশকে লেখা রয়েছে) ওওপি নয় not এর একটি কারণ রয়েছে - সংখ্যার আলগোরিদিমগুলি modulesইন্টারফেস এবং এনক্যাপসুলেশন সহ ওও হায়ারার্কিগুলির চেয়ে ডিকপলডের সেট হিসাবে আরও ভাল কাজ করে ।


2
এর মূল কারণ হ'ল কেবল সি ++ ওও সংস্করণটিকে দক্ষ হিসাবে তৈরি করতে এক্সপ্রেশন টেম্পলেটগুলি ব্যবহার করে।
ডেড এমএমজি

4
আধুনিক সি ++ গ্রন্থাগারগুলি দেখুন (এসটিএল, বুস্ট) - এগুলি মোটেও ওওপি নয়। এবং কেবল পারফরম্যান্সের কারণে নয়। অ্যালগরিদমগুলি সাধারণত কোনও ওওপি স্টাইলে ভালভাবে উপস্থাপন করা যায় না। জেনেরিক প্রোগ্রামিংয়ের মতো জিনিসগুলি নিম্ন স্তরের অ্যালগরিদমের জন্য আরও বেশি উপযুক্ত।
এসকে-যুক্তি

3
Wha-Wha-কি? আমার ধারণা আমি কোয়ান্ট_দেব এবং এসকে-লজিকের চেয়ে আলাদা গ্রহ থেকে এসেছি। না, আলাদা মহাবিশ্ব। পদার্থবিজ্ঞানের বিভিন্ন আইন এবং সমস্ত কিছুর সাথে।
মাইক নকিস

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

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

9

কর্মক্ষমতা নির্ধারণ করে কি?

মূলসূত্রগুলি: ডেটা স্ট্রাকচার, অ্যালগরিদম, কম্পিউটার আর্কিটেকচার, হার্ডওয়্যার। প্লাস ওভারহেড

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

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

ক্যাভেট: ব্যবসায়িক সফ্টওয়্যারে পারফরম্যান্সের বিষয়টি কী গুরুত্বপূর্ণ?

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

অনুকূল পারফরম্যান্স বলতে কী বোঝায়?

সাধারণভাবে, সফ্টওয়্যার পারফরম্যান্স সহ সমস্যাটি হ'ল: "একটি দ্রুত সংস্করণ বিদ্যমান" প্রমাণ করার জন্য, দ্রুততম সংস্করণটি প্রথমে অস্তিত্বের মধ্যে আসতে হবে (অর্থাত্ নিজের ব্যতীত আর কোনও প্রমাণ নেই)।

কখনও কখনও দ্রুত সংস্করণটি অন্য কোনও ভাষা বা দৃষ্টান্তে প্রথম দেখা যায়। এটিকে উন্নতির ইঙ্গিত হিসাবে নেওয়া উচিত, অন্য কোনও ভাষা বা দৃষ্টান্তের নিকৃষ্টতার বিচার নয়।

যদি এটি সর্বোত্তম পারফরম্যান্সের জন্য আমাদের অনুসন্ধানকে বাধা দিতে পারে তবে আমরা কেন ওওপি করছি?

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

ওওপির কোন অংশগুলি প্রাথমিকভাবে সর্বোত্তম নকশাকে উত্সাহিত করতে পারে?

ওওপি-র অংশগুলি (ii) সরলতা / স্বজ্ঞাততাকে উত্সাহ দেয়, (ii) মৌলিকগুলির পরিবর্তে চলিত নকশা পদ্ধতির ব্যবহার, (iii) একই উদ্দেশ্যে একাধিক শিষ্টাঙ্কিত বাস্তবায়নকে নিরুৎসাহিত করে।

  • চুম্বন
  • YAGNI
  • শুকনো
  • মৌলিক বিষয়গুলিতে সমান চিন্তাভাবনা না করে অবজেক্ট ডিজাইন (যেমন সিআরসি কার্ড সহ)

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

ওওপি ওভারহেডগুলিতে সাধারণ প্রশমনগুলি কী কী?

যেমন আগেই বলা হয়েছে, ডেটা স্ট্রাকচার ব্যবহার করে যা ডিজাইনের অনুকূল।

কিছু ভাষা কোড ইনলাইনিং সমর্থন করে যা কিছু রানটাইম কর্মক্ষমতা পুনরুদ্ধার করতে পারে।

পারফরম্যান্স ত্যাগ না করে আমরা কীভাবে ওওপি গ্রহণ করতে পারি?

ওওপি এবং ফান্ডামেন্টাল উভয়ই শিখুন এবং প্রয়োগ করুন।

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

এমন কি ধরণের কোড রয়েছে যা ওওপি থেকে উপকৃত হবে না?

([@ কোয়ান্ট_দেব], [@ এসকে-লজিক] এবং [@ মাইকনাকিস] এর মধ্যে আলোচনা থেকে প্রসারিত)

  1. সংখ্যার রেসিপি, যা গণিত থেকে উদ্ভূত হয়।
    • গাণিতিক সমীকরণ এবং রূপান্তরগুলি তাদের অবজেক্ট হিসাবে বোঝা যায়।
    • দক্ষ নির্বাহযোগ্য কোড জেনার জন্য অত্যন্ত পরিশীলিত কোড রূপান্তরের কৌশলগুলি প্রয়োজন techniques নিষ্পাপ ("হোয়াইট বোর্ড") বাস্তবায়নে অসাধারণ পারফরম্যান্স থাকবে।
    • তবে আজকের মূলধারার সংকলকগণ এটি করতে অক্ষম।
    • বিশেষায়িত সফ্টওয়্যার (ম্যাটল্যাব এবং ম্যাথেমেটিকা ​​ইত্যাদি) জেআইটি এবং প্রতীকী সমাধানকারী উভয়ই কিছু উপ-সমস্যার জন্য দক্ষ কোড তৈরি করতে সক্ষম। এই বিশেষায়িত সমাধানকারীদের বিশেষ-উদ্দেশ্যে সংকলক হিসাবে দেখা যায় (মানব-পঠনযোগ্য কোড এবং মেশিন-এক্সিকিউটেবল কোডের মধ্যে মধ্যস্থতাকারী) যা তারা নিজেরাই ওওপি নকশা থেকে উপকৃত হবে।
    • প্রতিটি উপ-সমস্যাটির নিজস্ব "সংকলক" এবং "কোড রূপান্তর" দরকার " সুতরাং, এটি একটি খুব সক্রিয় উন্মুক্ত গবেষণা ক্ষেত্র যা প্রতি বছর নতুন ফলাফল প্রদর্শিত হয়।
    • যেহেতু গবেষণায় দীর্ঘ সময় লাগে, সফ্টওয়্যার লেখকদের কাগজে অপ্টিমাইজেশন চালাতে হয় এবং অপ্টিমাইজড কোডটি সফ্টওয়্যারে ট্রান্সক্রিপশন করতে হয়। অনুলিপি কোড প্রকৃতপক্ষে বোধগম্য হতে পারে।
  2. খুব নিম্ন স্তরের কোড।
      *

8

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

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


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

5

ওওপি স্পষ্টতই একটি ভাল ধারণা এবং কোনও ভাল ধারণার মতো এটিও অতিরিক্ত ব্যবহার করা যেতে পারে। আমার অভিজ্ঞতাতে এটি বেশিরভাগভাবে ব্যবহৃত। খারাপ পারফরম্যান্স এবং দুর্বল রক্ষণাবেক্ষণের ফলাফল।

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

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

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

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

সম্ভবত কোনও প্রদত্ত অ্যাপ্লিকেশনটির পারফরম্যান্স লিখিত হিসাবে ঠিক আছে।

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


3

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

উদাহরণস্বরূপ, ক্লিন-কাট বস্তুগুলিতে বিভিন্ন টাস্ক এবং সত্তাগুলিকে বিভক্ত করে, আপনি সহজেই পরে আসতে পারবেন এবং বলতে পারেন, কিছু বস্তুর মধ্যে একটি ক্যাচিং সুবিধা এম্বেড করুন (তাদের কাছে স্বচ্ছ), যা হাজার হাজার উপার্জন করতে পারে - ভাঁজ উন্নতি।

সাধারণত, নিম্ন-স্তরের ভাষা ব্যবহার করে আপনি যে ধরণের উন্নতি অর্জন করতে পারেন (বা উচ্চ-স্তরের ভাষার সাথে চালাক কৌশল) ধ্রুবক (রৈখিক) সময়ের উন্নতি দেয় যা বড়-ওহ চিহ্ন হিসাবে বিবেচনা করে না। অ্যালগরিদমিক উন্নতিতে আপনি অ-রৈখিক উন্নতি অর্জন করতে সক্ষম হতে পারেন। অমূল্য।


1
+1: স্প্যাগেটি এবং অবজেক্ট-ওরিয়েন্টেড কোডের মধ্যে পার্থক্য (বা একটি সংজ্ঞায়িত দৃষ্টান্তে লিখিত কোড): ভাল কোড পুনর্লিখনের প্রতিটি সংস্করণ সমস্যার মধ্যে নতুন বোঝাপড়া নিয়ে আসে। স্প্যাগেটির পুনর্লিখনের প্রতিটি সংস্করণ কখনই কোনও অন্তর্দৃষ্টি নিয়ে আসে না।
রবিং

@ রওং এর আরও ভাল ব্যাখ্যা করা যায় না ;-)
ইউএমএলকেট

3

পারফরম্যান্সের ভিত্তিতে সফটওয়্যারগুলির জন্য এই ওওপি কোনও অসুবিধা হতে পারে অর্থাৎ প্রোগ্রামাম কত দ্রুত চালায়?

প্রায়শই হ্যাঁ !!! কিন্তু ...

অন্য কথায়, অনেকগুলি বিভিন্ন অবজেক্টের মধ্যে অনেকগুলি রেফারেন্স, বা অনেক ক্লাসের অনেক পদ্ধতি ব্যবহার করে, "ভারী" বাস্তবায়ন হতে পারে?

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

জাভা এর মতো অন্যান্য ভাষায়, কোনও জিনিসের উপরে ওভারহেড কিছুটা থাকে (প্রায়শই বেশিরভাগ ক্ষেত্রে বেশ ছোট, তবে সত্যিকারের টিনেজ অবজেক্টগুলির সাথে কিছু বিরল ক্ষেত্রে জ্যোতির্বিদ্যাগত)। উদাহরণস্বরূপ, Integerতুলনায় যথেষ্ট কম দক্ষ রয়েছে int(64৪ বিটের 4 এর বিপরীতে 16 বাইট লাগে)। তবুও এটি কেবল নির্লজ্জ বর্জ্য বা এই ধরণের কিছু নয়। বিনিময়ে, জাভা প্রতিটি একক ব্যবহারকারী-সংজ্ঞায়িত টাইপের প্রতিফলনের মতো জিনিস সরবরাহ করে, পাশাপাশি চিহ্নিত কোনও ক্রিয়াকে ওভাররাইড করার ক্ষমতাও দেয় final

তবুও আসুন সেরা ক্ষেত্রে দেখুন: অনুকূলিতকরণ সি ++ সংকলক যা অবজেক্ট ইন্টারফেসকে শূন্য ওভারহেডে নেমে যেতে পারে । তারপরেও, ওওপি প্রায়শই কর্মক্ষমতা হ্রাস করে এবং এটিকে শীর্ষে পৌঁছাতে বাধা দেয় prevent এটি সম্পূর্ণ প্যারাডক্সের মতো শোনাতে পারে: এটি কীভাবে হতে পারে? সমস্যাটি নিহিত:

ইন্টারফেস ডিজাইন এবং এনক্যাপসুলেশন

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

এই উদাহরণটি ধরুন:

class Particle
{
public:
    ...

private:
    double birth;                // 8 bytes
    float x;                     // 4 bytes
    float y;                     // 4 bytes
    float z;                     // 4 bytes
    /*padding*/                  // 4 bytes of padding
};
Particle particles[1000000];     // 1mil particles (~24 megs)

আসুন আমাদের মেমরি অ্যাক্সেস প্যাটার্নটি হ'ল ধারাবাহিকভাবে এই কণাগুলির মধ্য দিয়ে লুপ করা এবং বারবার প্রতিটি ফ্রেমের চারদিকে ঘুরিয়ে দেওয়া, সেগুলি পর্দার কোণে সরিয়ে এবং তারপরে ফলাফলটি সরবরাহ করা nd

ইতিমধ্যে আমরা দেখতে পাচ্ছি যে 4 টি বাইট প্যাডিং ওভারহেড birthসদস্যকে সঠিকভাবে সারিবদ্ধ করার জন্য প্রয়োজনীয় যখন কণাগুলি একত্রিত হয়ে যায়। ইতিমধ্যে। 16.7% মেমরির প্রান্তিককরণের জন্য ব্যবহৃত মৃত স্থানের সাথে নষ্ট হয়ে গেছে।

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

মাঠের সারিবদ্ধকরণের উপর কোনও প্রভাব ছাড়াই আমরা সহজেই এই ওভারহেডটি নির্মূল করতে পারি:

class Particle
{
public:
    ...

private:
    float x;                     // 4 bytes
    float y;                     // 4 bytes
    float z;                     // 4 bytes
};
Particle particles[1000000];     // 1mil particles (~12 megs)
double particle_birth[1000000];  // 1mil particle births (~8 bytes)

এখন আমরা মেমোরিটি 24 মেগা থেকে 20 মেগ্রে হ্রাস করেছি। অনুক্রমের অ্যাক্সেস প্যাটার্ন সহ, মেশিনটি এখন এই ডেটাটি বেশ খানিকটা দ্রুত গ্রাস করবে।

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

ফলস্বরূপ, আসল পারফরম্যান্স-সমালোচনামূলক ডেটা 20 মেগাবাইট নয় তবে আসলে একটি 12-মেগাবাইট সংঘবদ্ধ ব্লক। আমরা প্রায়শই আসল উত্তপ্ত মেমরিটি অর্ধ আকারে সঙ্কুচিত হয়েছি ! আমাদের আসল, 24-মেগাবাইট সমাধানের তুলনায় উল্লেখযোগ্য গতি বাড়ানোর প্রত্যাশা করুন (এটি পরিমাপ করার দরকার নেই - ইতিমধ্যে এই ধরণের জিনিসটি হাজারবার সম্পন্ন করেছেন, তবে সন্দেহ হলে নিঃসঙ্কোচে)।

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

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

এটিকে আরও এগিয়ে নিতে, আসুন আমরা বলি যেহেতু আমরা কেবল কণাগুলি ঘুরিয়ে নিচ্ছি, আমরা আসলে তাদের এক্স / ওয়াই / জেড ক্ষেত্রটি তিনটি পৃথক লুপগুলিতে অ্যাক্সেস করতে পারি। সেক্ষেত্রে আমরা AVX রেজিস্টারগুলির সাথে সমান্তরালভাবে 8 এসপিএফপি অপারেশনগুলিকে ভেক্টরাইজ করতে পারি এমন এসএএ স্টাইলের সিমডি ইন্টারসিনিকগুলি থেকে উপকৃত হতে পারি। তবে এটি করার জন্য, আমাদের অবশ্যই এখন এই উপস্থাপনাটি ব্যবহার করতে হবে:

float particle_x[1000000];       // 1mil particle X positions (~4 megs)
float particle_y[1000000];       // 1mil particle Y positions (~4 megs)
float particle_z[1000000];       // 1mil particle Z positions (~4 megs)
double particle_birth[1000000];  // 1mil particle births (~8 bytes)

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

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

সমাধান

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

তবুও আমরা সেই চূড়ান্ত উপস্থাপনাটি নিতে পারি যা আমরা স্থির করেছিলাম এবং এখনও একটি অবজেক্ট-ভিত্তিক ইন্টারফেসের মডেল করি:

// Represents a collection of particles.
class ParticleSystem
{
public:
    ...

private:
    double particle_birth[1000000];  // 1mil particle births (~8 bytes)
    float particle_x[1000000];       // 1mil particle X positions (~4 megs)
    float particle_y[1000000];       // 1mil particle Y positions (~4 megs)
    float particle_z[1000000];       // 1mil particle Z positions (~4 megs)
};

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

ParticleSystemসম্ভাব্য এমনকি বিমূর্ত হতে পারে এবং ভার্চুয়াল ফাংশন ব্যবহার করতে পারে। এটি এখন গতিশীল, আমরা প্রতি-কণা স্তরের পরিবর্তে কণা স্তরের সংগ্রহের জন্য ওভারহেডের জন্য অর্থ প্রদান করছি । ওভারহেডটি 1 / 1,000,000 তম হ'ল যদি তা না হয় যদি আমরা স্বতন্ত্র কণা স্তরে বস্তুর মডেলিং করতাম।

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

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


ফ্যান্টাস্টিক। উচ্চ পারফরম্যান্স চাহিদার সাথে ওওপিকে একত্রিত করার ক্ষেত্রে আমি এটিই খুঁজছিলাম। আমি কেন বুঝতে পারছি না কেন এটি আরও বেশি উত্সাহিত হয়নি।
pbx

2

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

ইস্যুটি ওওপি-র পৃথক দৃষ্টান্তগুলি সম্পর্কে চিন্তাভাবনার জোর থেকে উদ্ভূত হয়েছে। আমি মনে করি এটি ন্যায়সঙ্গত বলেছি যে একটি অ্যালগোরিদম সম্পর্কে OOP পদ্ধতিটি হল একটি নির্দিষ্ট মানগুলির সেট সম্পর্কে চিন্তা করা এবং সেভাবে প্রয়োগ করা। যদি এটি আপনার সর্বোচ্চ-স্তরের পথ হয় তবে আপনি এমন কোনও রূপান্তর বা পুনর্গঠন উপলব্ধি করতে পারবেন না যা বিগ ও লাভের দিকে নিয়ে যাবে।

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

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

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

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


0

এটি সম্পর্কিত, এবং প্রায়শই উপেক্ষা করা হয়।

এটি কোনও সহজ উত্তর নয়, এটি আপনি কী করতে চান তার উপর নির্ভর করে।

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

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

অবশ্যই, সেখানে যেখানে স্কুলগুলি কাঠামোগত প্রোগ্রামিং শেখায়, সেগুলি অ্যালগরিদমের কোনও যত্ন নেয় না।


0

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

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

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


0

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


আপনার অর্থ কী ওও ডিজাইন একটি পদ্ধতিগত ভাষা, বা ওও ডিজাইন এবং ওও প্রোগ্রামিং ভাষার সাথে প্রয়োগ হয়েছে?
uMLcat

আমি একটি সি # অ্যাপ্লিকেশন সম্পর্কে বলছি। নকশা এবং ভাষা উভয়ই ওও যেখানে ভাষার ওও-ইনসনে কিছু ছোট পারফরম্যান্স হিট (ভার্চুয়াল মেথড কল, অবজেক্ট ক্রিয়েশন, ইন্টারফেসের মাধ্যমে সদস্য অ্যাক্সেস) প্রবর্তন করবে, ওও ডিজাইনটি আরও দ্রুত অ্যাপ্লিকেশন তৈরি করতে আমাকে সহায়তা করেছিল। আমি যা বলতে চাই তা হ'ল: ওও (ভাষা এবং নকশা) এর কারণে পারফরম্যান্স হিটগুলি ভুলে যান। আপনি যদি লক্ষ লক্ষ পুনরাবৃত্তি নিয়ে ভারী গণনা না করেন তবে ওও আপনাকে ক্ষতি করবে না। আপনি সাধারণত যেখানে অনেক সময় আলগা হন তা হ'ল I / O।
অলিভিয়ার জ্যাকট-ডেসকোম্বেস
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.