আমি কি অকালে অপটিমাইজ করছি?


9

আমি বর্তমানে সি ++ তে একটি উপাদান-ভিত্তিক আর্কিটেকচারের নকশার পর্যায়ে আছি।

আমার বর্তমান ডিজাইনে বৈশিষ্ট্যগুলির ব্যবহার যেমন:

  • std::vectorএর std::shared_ptrউপাদানগুলি ধরে রাখতে এস
  • std::dynamic_pointer_cast
  • std::unordered_map<std::string,[yada]>

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

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

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

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

বা আমি মাত্র অকালীন অপটিমাইজেশন করতে গিয়ে ধরা পড়েছি?


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

1
এমনকি বিশদ না জেনেও এই প্রশ্নের উত্তর প্রায় সবসময়ই একটি দুর্দান্ত "হ্যাঁ !!" is
মাওগ বলছেন মনিকা

2
@ মাওগ "... তবুও আমাদের এই সমালোচনামূলক 3% তে আমাদের সুযোগগুলি অতিক্রম করা উচিত নয়।" যেহেতু এটি ডিজাইনের মূল, তাই আমি কীভাবে জানতে পারি যে আমি এই 3% নিয়ে কাজ করছি কিনা?
ভ্যালেনকোর্ট

1
আলেকজান্দ্রি (+১) এবং একটি এক্সেলেলেন্ট পয়েন্টস, এবং হ্যাঁ, আমি জানি যে শেষ অর্ধের উদ্ধৃতিটির প্রায়শই উল্লেখ করা হয় না :-) তবে, তার আগে আমার মন্তব্যে ফিরে যেতে (যা সঞ্চিত উত্তরে প্রতিফলিত হয়েছে) , the answer to this question is almost always a resounding "YES !!"। আমি এখনও অনুভব করি যে এটি প্রথমে কাজ করা আরও ভাল এবং পরে অনুকূলিতকরণ করা ভাল, তবে ওয়াইএমএমভি, প্রত্যেকেরই তার মতামত রয়েছে যার সবগুলিই বৈধ, এবং কেবল ওপিই তার নিজের - বিষয়গত - প্রশ্নের উত্তর দিতে পারেন।
মাওগ বলছেন মনিকা

1
@ অ্যালেক্সানড্রেভেল্যানকোর্ট নথের কাগজ পড়তে থাকুন (পিডিএফ, উদ্ধৃতিটি পিডিএফ রিডারে ২8৮, পৃষ্ঠা 8 লেবেলযুক্ত পৃষ্ঠার ডান দিক থেকে আসে)। "... তিনি সমালোচনামূলক কোডটি মনোযোগ সহকারে দেখার জন্য বুদ্ধিমান হবেন; তবে কেবলমাত্র সেই কোডটি চিহ্নিত হওয়ার পরে । একটি প্রোগ্রামের কোন অংশগুলি সত্যই সমালোচনা করা যায় তা সম্পর্কে প্রায়শই বিচার করা ভুল হয়, যেহেতু সর্বজনীন অভিজ্ঞতা থেকে প্রোগ্রামাররা যারা পরিমাপের সরঞ্জামগুলি ব্যবহার করে যাচ্ছিল তা হ'ল তাদের স্বজ্ঞাত অনুমানগুলি ব্যর্থ হয়। " (তার জোর দেওয়া)
বিট্রি

উত্তর:


26

শিরোনাম ছাড়া কিছুই না পড়ে: হ্যাঁ।

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

সর্বাধিক মূর্খ ভুল এড়ানো সফ্টওয়্যারটি লিখুন, তারপরে পরীক্ষা করুন, তারপরে বাধা খুঁজে নিন, তারপরে অনুকূলিত করুন!

ফুইউইউ: https://xkcd.com/1691/


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

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

@ জার্গডব্লিউমিত্যাগ: সম্মত হয়েছেন।
স্টিফেন

3

আমি সি ++ এর সাথে পরিচিত নই, তবে সাধারণভাবে এটি নির্ভর করে।

বিচ্ছিন্ন অ্যালগরিদমগুলিতে আপনার অকালীনভাবে অপ্টিমাইজ করার দরকার নেই যেখানে এটি আসে যখন আপনি সহজেই অনুকূলিত করতে পারেন।

তবে আপনার পছন্দসই মূল কার্যকারিতা সূচকগুলি পেতে অ্যাপ্লিকেশনটির সামগ্রিক নকশা পাওয়া দরকার।

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


3

যদি জিজ্ঞাসা করতে হয়, তবে হ্যাঁ। অকাল অপটিমাইজেশন মানে একটি গুরুত্বপূর্ণ পারফরম্যান্স সমস্যা আছে তা আপনি নিশ্চিত হওয়ার আগে অপ্টিমাইজেশন ।


1

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

unordered_map<string,[yada]>

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

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

unordered_map<int,[yada]>

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

এটি বলেছে, আপনি যদি ঘন-ব্যবহৃত সূচকগুলির যথাযথভাবে কম পরিসরে স্ট্রিংটি মানচিত্র করতে পারেন, তবে আপনি কেবল এটি করতে সক্ষম হতে পারেন:

vector<[yada]> // the index and key become one and the same

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

একটি নিষ্পাপ উদাহরণ হিসাবে, একটি ভিডিও প্রসেসিং সফ্টওয়্যার যা এর বিরুদ্ধে সমস্ত কোড সংযুক্ত করে:

// Abstract pixel that could be concretely represented by
// RGB, BGR, RGBA, BGRA, 1-bit channels, 8-bit channels, 
// 16-bit channels, 32-bit channels, grayscale, monochrome, 
// etc. pixels.
class IPixel
{
public:
    virtual ~IPixel() {}
    ...
};

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

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

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