কোনও ফাংশনে অকাল ফেরতের দক্ষতা


97

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

void foo1(bool flag)
{
    if (flag)
    {
        //Do stuff
        return;
    }

    //Do different stuff
}

void foo2(bool flag)
{
    if (flag)
    {
        //Do stuff
    }
    else
    {
        //Do different stuff
    }
}

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

আমি সর্বদা গৌণ অপ্টিমাইজেশনের তুলনায় উন্নত স্বচ্ছতার প্রবক্তা (প্যারামিটারের বৈধতা দিয়ে আমি foo1 দেখতে পাচ্ছি) তবে এটি এত ঘন ঘন আসে যে আমি একবার এবং সকলের জন্য সমস্ত উদ্বেগকে দূরে রাখতে চাই।

এবং আমি অকালীন অপ্টিমাইজেশনের অসুবিধাগুলি সম্পর্কে অবগত আছি ... তবে এগুলি কিছু বেদনাদায়ক স্মৃতি।

সম্পাদনা: আমি একটি উত্তর গ্রহণ করেছি, তবে ইজেপির উত্তরটি বেশ সফলভাবে ব্যাখ্যা করেছে যে কেন ব্যবহারের returnব্যবহারিকভাবে নগণ্য (সমাবেশে, returnফাংশনটির শেষে একটি 'শাখা' তৈরি করে, যা অত্যন্ত দ্রুত The শাখাটি পিসি রেজিস্টারে পরিবর্তন করে এবং ক্যাশে এবং পাইপলাইনকেও প্রভাবিত করতে পারে যা বেশ বিয়োগান্তক)) বিশেষত এই ক্ষেত্রে এর জন্য আক্ষরিক অর্থে কোনও তাত্পর্য হয় না কারণ if/elseএবং উভয়ই returnফাংশনটির শেষে একই শাখা তৈরি করে।


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

10
@ সিরওয়াল্টারস্কট, যদি না দু'টি ক্ষেত্রে কোনওভাবে প্রতিসম হয়, তবে আপনি একই ধরণের ইন্ডেন্টেশনে রেখে প্রতিসাম্য আনতে চান।
luqui

4
স্যার ভল্টারস্কোফ: অনির্বাণিত বাসা
বাঁধার

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

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

উত্তর:


92

কোনও পার্থক্য নেই:

=====> cat test_return.cpp
extern void something();
extern void something2();

void test(bool b)
{
    if(b)
    {
        something();
    }
    else
        something2();
}
=====> cat test_return2.cpp
extern void something();
extern void something2();

void test(bool b)
{
    if(b)
    {
        something();
        return;
    }
    something2();
}
=====> rm -f test_return.s test_return2.s
=====> g++ -S test_return.cpp 
=====> g++ -S test_return2.cpp 
=====> diff test_return.s test_return2.s
=====> rm -f test_return.s test_return2.s
=====> clang++ -S test_return.cpp 
=====> clang++ -S test_return2.cpp 
=====> diff test_return.s test_return2.s
=====> 

অর্থ দুটি সংযোজকগুলির মধ্যে অপ্টিমাইজেশন ছাড়াই উত্পন্ন কোডে কোনও পার্থক্য নেই


59
বা আরও ভাল: একটি নির্দিষ্ট সংকলকের কমপক্ষে একটি সংস্করণ রয়েছে যা দুটি সংস্করণের জন্য একই কোড উত্পন্ন করে।
আঙ্কেলজিভ

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

6
@ স্টিভ 314, নিশ্চিত, আমি কেবল
নিটপিকিং করছিলাম

@ ইউঙ্কলেজিভ: ঝাঁকুনির উপরও পরীক্ষিত এবং একই ফলাফল
দানি

আমি বুঝতে পারছি না। এটি স্পষ্ট বলে মনে হয় যা something()সর্বদা কার্যকর করা হবে। মূল প্রশ্নে ওপি রয়েছে Do stuffএবং Do diffferent stuffপতাকাটির উপর নির্ভর করে। আমি সুর নই যে উত্পন্ন কোডটি একই হবে।
লুক এম

65

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

পাঠযোগ্যতা এবং রক্ষণাবেক্ষণযোগ্যতার উপর মনোনিবেশ করুন।

আপনি যদি দেখতে চান তবে এটি অপটিমাইজেশন দিয়ে তৈরি করুন এবং এসেম্বলারের আউটপুটটি দেখুন।


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

8
অপ্টিমাইজারগুলি আপনার চেয়ে বেশি স্মার্ট নয় !!! প্রভাবগুলি যেখানে খুব বেশি গুরুত্ব দেয় না সে সিদ্ধান্ত নিতে তারা কেবল দ্রুত faster এটি সত্যিই গুরুত্বপূর্ণ যেখানে আপনি অবশ্যই কিছু অভিজ্ঞতার সাথে সংকলকটির চেয়ে আরও ভাল অনুকূলিতকরণ করবেন।
johannes

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

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

4
আমি এর সাথে একমত এবং একমত নই। এমন কিছু ঘটনা রয়েছে যখন সংকলক জানতে পারে না যে কিছু অন্য কিছুর সমতুল্য। আপনি কি জানতেন x = <some number>যে if(<would've changed>) x = <some number>অযৌক্ত শাখাগুলি সত্যিই আঘাত করতে পারে তার থেকে প্রায়শই দ্রুত করার উপায় এটি । অন্যদিকে, যদি না এটি অত্যন্ত নিবিড় ক্রিয়াকলাপের মূল লুপের ভিতরে না থাকে, আমি এটি নিয়েও উদ্বিগ্ন হব না।
ব্যবহারকারী 606723

28

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

উপরের সরল উদাহরণটি যদি সম্পদ বরাদ্দের সাথে প্রসারিত করা হয়, এবং তারপরে ত্রুটিগুলি পরীক্ষা করে সম্ভাব্য ফলস্বরূপ সংস্থানগুলি মুক্ত করা হয় তবে চিত্রটি পরিবর্তন হতে পারে।

নিখুঁত পদ্ধতির বিবেচনা করুন প্রাথমিকভাবে গ্রহণকারীরা নিতে পারে:

int func(..some parameters...) {
  res_a a = allocate_resource_a();
  if (!a) {
    return 1;
  }
  res_b b = allocate_resource_b();
  if (!b) {
    free_resource_a(a);
    return 2;
  }
  res_c c = allocate_resource_c();
  if (!c) {
    free_resource_b(b);
    free_resource_a(a);
    return 3;
  }

  do_work();

  free_resource_c(c);
  free_resource_b(b);
  free_resource_a(a);

  return 0;
}

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

int func(..some parameters...) {
  res_a a;
  res_b b;
  res_c c;

  try {
    a = allocate_resource_a(); # throws ExceptionResA
    b = allocate_resource_b(); # throws ExceptionResB
    c = allocate_resource_c(); # throws ExceptionResC
    do_work();
  }  
  catch (ExceptionBase e) {
    # Could use type of e here to distinguish and
    # use different catch phrases here
    # class ExceptionBase must be base class of ExceptionResA/B/C
    if (c) free_resource_c(c);
    if (b) free_resource_b(b);
    if (a) free_resource_a(a);
    throw e
  }
  return 0;
}

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

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

বা প্রাক ব্যতিক্রম দিনগুলিতে করতে পারে:

int func(..some parameters...) {
  res_a a = allocate_resource_a();
  res_b b = allocate_resource_b();
  res_c c = allocate_resource_c();
  if (a && b && c) {   
    do_work();
  }  
  if (c) free_resource_c(c);
  if (b) free_resource_b(b);
  if (a) free_resource_a(a);

  return 0;
}

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

কোডটি দ্রুত (!) রাখতে, কমপ্যাক্ট এবং সহজেই পঠনযোগ্য এবং এক্সটেনসিবল লিনাস টরভাল্ডস কার্নেল কোডের জন্য আলাদা স্টাইল প্রয়োগ করেছে যা সংস্থানসমূহের সাথে সম্পর্কিত, এমনকি কুখ্যাত গোটোকে এমনভাবে ব্যবহার করে যা একেবারে অর্থপূর্ণ :

int func(..some parameters...) {
  res_a a;
  res_b b;
  res_c c;

  a = allocate_resource_a() || goto error_a;
  b = allocate_resource_b() || goto error_b;
  c = allocate_resource_c() || goto error_c;

  do_work();

error_c:
  free_resource_c(c);
error_b:
  free_resource_b(b);
error_a:
  free_resource_a(a);

  return 0;
}

কার্নেল মেলিং তালিকাগুলির আলোচনার মূল বক্তব্যটি হল যে বেশিরভাগ ভাষা বৈশিষ্ট্যগুলি গোটো স্টেটমেন্টের চেয়ে "পছন্দসই" থাকে তবে হ'ল বিশাল, গাছের মতো যদি / অন্য, ব্যতিক্রম হ্যান্ডলার, লুপ / ​​ব্রেক / চালিয়ে যাওয়া বিবৃতি ইত্যাদি imp এবং উপরের উদাহরণটিতে গোটোকে ঠিক হিসাবে বিবেচনা করা হয়, যেহেতু তারা কেবল অল্প দূরত্বে চলেছে, পরিষ্কার লেবেল রয়েছে এবং ত্রুটির অবস্থার উপর নজর রাখার জন্য অন্যান্য বিশৃঙ্খলার কোড মুক্ত করে free এই প্রশ্নটি এখানে স্ট্যাকওভারফ্লো নিয়েও আলোচনা করা হয়েছে

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

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


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

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

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

4
মনে রাখবেন যে সি ++ এ আপনি এই পদ্ধতির কোনও ব্যবহার করবেন না, তবে সংস্থানগুলি যথাযথভাবে পরিষ্কার হয়েছে কিনা তা নিশ্চিত করতে RAII ব্যবহার করবেন।
মার্ক বি

12

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


9

এ সম্পর্কে সুনির্দিষ্ট হওয়ার জন্য, returnপদ্ধতির শেষ পর্যন্ত একটি শাখায় সংকলিত হবে, যেখানে কোনও RETনির্দেশনা থাকবে বা যা কিছু হোক না কেন। যদি আপনি এটি ছেড়ে চলে যান তবে ব্লকের শেষে ব্লকের elseপ্রান্তটি একটি শাখায় সংকলিত হবে else। সুতরাং আপনি এই সুনির্দিষ্ট ক্ষেত্রে এটি দেখতে পারেন যা কিছুতেই কোনও পার্থক্য নেই।


গোটচা। আমি প্রকৃতপক্ষে মনে করি এটি আমার প্রশ্নের উত্তর বেশ সুন্দরভাবে জবাব দিয়েছিল; আমার ধারণা এটি আক্ষরিকভাবে কেবল একটি রেজিস্টার সংযোজন, যা বেশ নগণ্য (যদি না আপনি সিস্টেম প্রোগ্রামিং করছেন, এবং তারপরেও ...) আমি এটিকে একটি সম্মানজনক উল্লেখ করব give
ফিলিপ গিন

ফিলিপ কি রেজিস্টার যুক্ত? পথে কোনও অতিরিক্ত নির্দেশ নেই।
লার্নের মারকুইস

ভাল উভয় রেজিস্টার সংযোজন হবে। এটাই সব বিধানসভা শাখা, তাই না? প্রোগ্রামের কাউন্টারে একটি সংযোজন? আমি এখানে ভুল হতে পারে।
ফিলিপ গিন

4
ফিলিপ নং, একটি অ্যাসেম্বলি শাখা হ'ল একটি অ্যাসেম্বলি শাখা। এটি অবশ্যই পিসিকে প্রভাবিত করে তবে এটি পুরোপুরি পুনরায় লোড করেই এটি হতে পারে, এবং এটির প্রসেসরের পাইপলাইন, ক্যাশে ইত্যাদিগুলিতে পার্শ্ব-প্রতিক্রিয়াও রয়েছে
লার্নের মারকুইস ২ '

4

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

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

পরিবর্তে, মানুষের পড়ার এবং বজায় রাখার জন্য কোডটি সুস্পষ্ট উপায়ে লিখুন এবং সংকলকটি সর্বোত্তমভাবে যা করতে পারে তা করুন: এটি আপনার উত্স থেকে সেরা সমাবেশ তৈরি করুন।


4

আপনার উদাহরণে, প্রত্যাবর্তনটি লক্ষণীয়। ফেরত যখন পৃষ্ঠার উপরের দু'র নীচে / নীচে থাকে তখন কোনও ব্যক্তির ডিবাগিংয়ের সাথে কী হয় // যেখানে বিভিন্ন জিনিস ঘটে? যখন আরও কোড থাকে তখন সন্ধান করা / দেখার পক্ষে আরও কঠিন।

void foo1(bool flag)
{
    if (flag)
    {
        //Do stuff
        return;
    }

    //Do different stuff
}

void foo2(bool flag)
{
    if (flag)
    {
        //Do stuff
    }
    else
    {
        //Do different stuff
    }
}

অবশ্যই, একটি ফাংশন এক (বা দুটি) পৃষ্ঠার বেশি হওয়া উচিত নয়। তবে ডিবাগিংয়ের দিকটি এখনও অন্য কোনও উত্তরে আচ্ছাদন করা হয়নি। পয়েন্ট নেওয়া!
সিএফআই

3

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

এর অর্থ হ'ল ডিসকপিলার ব্যবহার করা বা নিম্ন স্তরের সংকলক আউটপুট (উদাহরণস্বরূপ অ্যাসেম্বলি ল্যাঙ্গুয়েজ) at সি #, বা যে কোনও। নেট ভাষায়, এখানে ডকুমেন্ট করা সরঞ্জামগুলি আপনাকে যা প্রয়োজন তা দেবে।

তবে আপনি যেমন পর্যবেক্ষণ করেছেন, এটি সম্ভবত অকালীন অপটিমাইজেশন।


1

ক্লিন কোড থেকে : অ্যাসিল সফটওয়্যার কারুকাজের একটি হ্যান্ডবুক

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

foo(true);

কোডে পাঠককে কেবল ফাংশনে নেভিগেট করতে এবং ফু পড়ার সময় নষ্ট করবে (বুলিয়ান পতাকা)

আরও ভাল কাঠামোগত কোড বেস আপনাকে কোডের অনুকূলকরণের আরও ভাল সুযোগ দেবে।


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

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

0

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

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


ওহ, আমি ভেবেছিলাম এটি পরিষ্কার করার সাথে সাথে করা উচিত (সি সি কোড করার সময় esp)।
টমাস এডিং

না, আপনি যতক্ষণ না কোনও পদ্ধতি ছেড়ে চলেছেন ততক্ষণ আপনি যখন স্ট্যাকটি ফিরিয়ে দেন তখনই পিছন থেকে ধাক্কা মেরে ফেলা হয় (এটিই "পরিষ্কার"।
মার্টিটিপিএস

-4

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


4
আমি বলতে পারি আপনি কৌতুক করছেন, তবে ভীতিকর বিষয়টি হ'ল কিছু লোক আপনার পরামর্শকে গুরুত্বের সাথে নিতে পারে!
ড্যানিয়েল প্রাইডেন

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

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