সি ++ এ ব্যতিক্রম আসলেই ধীর


99

আমি সি ++ তে সিস্টেমেটিক ত্রুটি হ্যান্ডলিংটি দেখছিলাম - আন্দ্রেই আলেকজান্দ্রেস্কু তিনি দাবি করেছেন যে সি ++ এ ব্যতিক্রমগুলি খুব ধীর।

এটি কি এখনও সি ++ 98 এর জন্য সত্য?


44
"C ++ 98 ব্যতিক্রম" "C ++ 03 ব্যতিক্রম" বা "C ++ 11 ব্যতিক্রম" এর চেয়ে দ্রুত / ধীর কিনা তা জিজ্ঞাসা করার কোনও অর্থ নেই। তাদের কর্মক্ষমতা আপনার প্রোগ্রামগুলিতে সংকলক কীভাবে এটি প্রয়োগ করে তার উপর নির্ভর করে এবং সি ++ স্ট্যান্ডার্ড কীভাবে তাদের প্রয়োগ করা উচিত সে সম্পর্কে কিছুই বলে না; একমাত্র প্রয়োজন হ'ল তাদের আচরণ অবশ্যই মান ("হিসাবে যদি" ​​নিয়ম) অনুসরণ করে।
সিলিকো

সম্পর্কিত (তবে সত্যই সদৃশ নয়) প্রশ্ন: স্ট্যাকওভারফ্লো
ফিলিপ

4
হ্যাঁ, এটি খুব ধীর গতির, তবে
এগুলিকে


বি কী বলেছেন তা স্পষ্ট করে বলা, ব্যতিক্রমগুলি ব্যবহার করা ভয় পাওয়ার কিছু নয়। যখন ব্যতিক্রম ছুঁড়ে ফেলা হয় তখন আপনি সময় সাশ্রয়ী অভিযানের মুখোমুখি হন (সম্ভাব্য)। আমি কেন আপনি বিশেষত সি ++ 89 এর জন্য জানতে চান তা জানতে আগ্রহী ... সর্বশেষ সংস্করণটি হ'ল সি ++ 11, এবং এটি ব্যতিক্রম করার জন্য যে সময় লাগে তা বাস্তবায়ন সংজ্ঞায়িত করা হয়, সুতরাং আমার 'সম্ভাব্য' সময় সাপেক্ষ ।
thecoshman

উত্তর:


163

ব্যতিক্রমগুলির জন্য আজ ব্যবহৃত প্রধান মডেল (Itanium ABI, VC ++ 64 বিট) হ'ল জিরো-কস্ট মডেলের ব্যতিক্রম।

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

সাধারণ if (error)কৌশলটির তুলনায় :

  • জিরো-কস্ট মডেলটি নাম হিসাবে বোঝা যায়, কোনও ব্যতিক্রম না ঘটলে তা বিনামূল্যে
  • ifযখন ব্যতিক্রম ঘটে তখন প্রায় 10x / 20x এ ব্যয় হয়

ব্যয়টি অবশ্য পরিমাপের জন্য তুচ্ছ নয়:

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

সুতরাং, বেশিরভাগ ক্যাশে মিস হয় এবং খাঁটি সিপিইউ কোডের তুলনায় তুচ্ছ নয়।

দ্রষ্টব্য: আরও তথ্যের জন্য, TR18015 রিপোর্ট পড়ুন, অধ্যায় 5.4 ব্যতিক্রম হ্যান্ডলিং (পিডিএফ)

সুতরাং, হ্যাঁ, ব্যতিক্রমগুলি ব্যতিক্রমী পথে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে তারা এগুলি ifসাধারণভাবে স্পষ্টত চেক ( কৌশল) এর চেয়ে আরও দ্রুত er

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


এটা কোন ব্যাপার ?

আমি দাবি করব না এটি হয় না। একটি প্রোগ্রাম পাঠযোগ্যতার কথা মাথায় রেখেই লেখা উচিত , পারফরম্যান্স নয় (কমপক্ষে, প্রথম মানদণ্ড হিসাবে নয়)। যখন কেউ প্রত্যাশা করে যে কলার ঘটনাস্থলে ব্যর্থতাটি পরিচালনা করতে বা করতে চান না এবং এটি স্ট্যাকটি পাস করেন তখন ব্যতিক্রমগুলি ব্যবহার করতে হবে। বোনাস: সি ++ এ 11 টি ব্যতিক্রম স্ট্যান্ডার্ড লাইব্রেরি ব্যবহার করে থ্রেডের মধ্যে মার্শাল করা যেতে পারে।

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


4
+1 আমি কেবলমাত্র চারটি জিনিস যুক্ত করব: (0) সি ++ 11 এ পুনর্বিবেচনার জন্য সমর্থন সম্পর্কে; (1) সি ++ দক্ষতা সম্পর্কিত কমিটির রিপোর্টের একটি রেফারেন্স; (২) নির্ভুলতা সম্পর্কে কিছু মন্তব্য (এমনকি পাঠযোগ্যতার পক্ষে ট্রাম্পিং হিসাবে); এবং (3) পারফরম্যান্স সম্পর্কে, ব্যতিক্রমগুলি ব্যবহার না করার ক্ষেত্রে এটি পরিমাপ করার বিষয়ে মন্তব্য (সমস্ত আপেক্ষিক)
চিয়ার্স এবং এইচটিএস। - আলফ

4
@ চিয়ারসান্থ.-আলফ: (0), (1) এবং (3) সম্পন্ন: ধন্যবাদ। নির্ভুলতা সম্পর্কে (২), যদিও এটি পঠনযোগ্যতা ট্রাম্প করে আমি অন্য ত্রুটি-পরিচালনা সংক্রান্ত কৌশলগুলির চেয়ে বেশি সঠিক কোডের দিকে পরিচালিত ব্যতিক্রমগুলি সম্পর্কে নিশ্চিত নই (বাস্তবায়নের ব্যতিক্রমগুলির বহু অদৃশ্য পাথগুলি ভুলে যাওয়া এত সহজ)।
ম্যাথিউ এম।

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

4
> জিরো-কস্ট মডেলটি নাম হিসাবে বোঝা যায়, নিখরচায় যখন কোনও ব্যতিক্রম ঘটে না তখন এটি সর্বোত্তম স্তরের বিশদভাবে সত্য হয় না। আরও বেশি কোড উত্পন্ন করার ক্ষেত্রে সর্বদা একটি কার্যকারিতা প্রভাব থাকে, এমনকি ক্ষুদ্র ও সূক্ষ্ম হলেও ... ওএসের সম্পাদনযোগ্যকে লোড করতে খুব বেশি সময় লাগতে পারে, বা আপনি আরও আই-ক্যাশে মিস করবেন না। এছাড়াও, স্ট্যাক আনওয়াইন্ডিং কোড সম্পর্কে কী? এছাড়াও, যুক্তিযুক্ত চিন্তার সাথে এটি বোঝার চেষ্টা করার পরিবর্তে আপনি প্রভাবগুলি পরিমাপ করতে যে পরীক্ষাগুলি করতে পারেন সেগুলি সম্পর্কে কী বলা যায়?
riেরিকো

4
@ ঝেরিকো: আমি বিশ্বাস করি যে আমি আপনার বেশিরভাগ প্রশ্নের ইতিমধ্যে ইতিমধ্যে সম্বোধন করেছি। লোড করার সময়টিকে প্রভাবিত করা উচিত নয় (কোল্ড কোডটি লোড করা উচিত নয়), আই-ক্যাশে প্রভাবিত হওয়া উচিত নয় (কোল্ড কোডটি এটি আই-ক্যাশে তৈরি করা উচিত নয়), যাতে একটি অনুপস্থিত প্রশ্নের সমাধান করতে হবে: "কীভাবে পরিমাপ করতে হবে" => কল দিয়ে ছুঁড়ে দেওয়া কোনও ব্যতিক্রম প্রতিস্থাপন abortকরলে আপনাকে বাইনারি-আকারের পদচিহ্নগুলি পরিমাপ করতে এবং লোড-টাইম / আই-ক্যাশে একইরকম আচরণ করে তা পরীক্ষা করে। অবশ্যই, abort
কোনওটিই

61

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


অন্যান্য ভাষার তুলনায় কি ব্যতিক্রমগুলি বিশেষত সি ++ তে ধীর?

দাবি পুনরায়

"আমি সি ++ তে সিস্টেমেটিক ত্রুটি হ্যান্ডলিং দেখছিলাম - আন্দ্রে আলেকজান্দ্রেস্কু তিনি দাবি করেছেন যে সি ++ এ ব্যতিক্রমগুলি খুব ধীর গতিতে।"

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

সাধারণভাবে, বেশিরভাগ ভাষা নির্বিশেষে, দুটি মূল ভাষার বৈশিষ্ট্য যা বিশদের চেয়ে ধীরে ধীরে মাত্রার অর্ডার হয়, কারণ তারা রুটিনগুলির কলগুলিতে অনুবাদ করে যা জটিল ডেটা কাঠামো পরিচালনা করে,

  • ব্যতিক্রম নিক্ষেপ, এবং

  • গতিশীল মেমরি বরাদ্দ।

আনন্দের সাথে সি ++ এ সময়-সমালোচনামূলক কোড উভয়ই এড়ানো যায় avoid

দুর্ভাগ্যক্রমে C ++ এর ডিফল্ট দক্ষতাটি খুব কাছাকাছি চলে আসার পরেও নিখরচায় দুপুরের খাবারের মতো জিনিস নেই । :: এবং নিম্ন বিমূর্ততা মানে বৃহত্তর "জটিলতা"।

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


সি ++ ব্যতিক্রম নিক্ষেপ কর্মক্ষমতা কোন উদ্দেশ্যমূলক ব্যবস্থা আছে?

হ্যাঁ, আন্তর্জাতিক সি ++ প্রমিতকরণ কমিটি সি ++ পারফরম্যান্স, টিআর ১80০১৫ এর একটি প্রযুক্তিগত প্রতিবেদন প্রকাশ করেছে ।


এর অর্থ কী যে ব্যতিক্রমগুলি "ধীর"?

মূলত এর অর্থ হ্যান্ডলারের সন্ধানের কারণে throwএকটি intঅ্যাসাইনমেন্টের সাথে তুলনা করে খুব বেশি সময় লাগতে পারে।

যেমন TR18015 এর 5.5 বিভাগে "ব্যতিক্রমগুলি" আলোচনা করেছে সেখানে দুটি মূল ব্যতিক্রম হ্যান্ডলিং বাস্তবায়ন কৌশলগুলি রয়েছে,

  • প্রতিটি tryব্লক গতিশীলভাবে ব্যতিক্রমী ক্যাপচার সেটআপ করার পদ্ধতিটি এমন একটি ব্যতিক্রম ছোঁড়ার সময় হ্যান্ডলারের গতিশীল শৃঙ্খলা অনুসন্ধান করা হয় এবং

  • পদ্ধতির যেখানে সংকলক স্থির বর্ণন আপ টেবিলগুলি উত্পন্ন করে যা কোনও ছোঁড়া ব্যতিক্রমের জন্য হ্যান্ডলারটি নির্ধারণ করতে ব্যবহৃত হয়।

প্রথম খুব নমনীয় এবং সাধারণ পদ্ধতির প্রায় 32-বিট উইন্ডোতে বাধ্য করা হয়, যখন 64৪-বিট জমিতে এবং * নিক্স-জমিতে দ্বিতীয়টি আরও কার্যকর দক্ষতা সাধারণত ব্যবহৃত হয়।

সেই প্রতিবেদনটি যেমন আলোচনা করেছে, প্রতিটি পদ্ধতির জন্য তিনটি প্রধান ক্ষেত্র রয়েছে যেখানে ব্যতিক্রম দক্ষতার উপর প্রভাবগুলি পরিচালনা করে:

  • try-ব্লকস,

  • নিয়মিত ফাংশন (অনুকূলিতকরণের সুযোগ), এবং

  • throw-প্রকাশ।

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

দুর্ভাগ্যক্রমে ২০০ 2006 সালের রিপোর্টটি ২০১২ সালের শেষের দিকে ইতোমধ্যে কিছুটা তারিখ পেয়েছে এবং যতদূর আমি জানি যে এর চেয়ে নতুন তুলনামূলক কিছু নেই।

আরেকটি গুরুত্বপূর্ণ দৃষ্টিভঙ্গি হ'ল পারফরম্যান্সে ব্যতিক্রমগুলির ব্যবহারের প্রভাবটি সমর্থনকারী ভাষার বৈশিষ্ট্যগুলির বিচ্ছিন্ন দক্ষতার চেয়ে খুব আলাদা, কারণ প্রতিবেদনে উল্লেখ করা হয়েছে যে,

"ব্যতিক্রম হ্যান্ডলিংয়ের বিষয়টি বিবেচনা করার সময়, এটি ত্রুটিগুলি মোকাবেলার বিকল্প পদ্ধতির সাথে বিপরীত হতে হবে।"

উদাহরণ স্বরূপ:

  • বিভিন্ন প্রোগ্রামিং শৈলীর কারণে রক্ষণাবেক্ষণ ব্যয় (সঠিকতা)

  • অপ্রয়োজনীয় কল সাইট ifব্যর্থতা বনাম কেন্দ্রীভূতtry

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

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


ব্যতিক্রমগুলির ওভারহেড এড়ানোর একটি ভাল উপায় কী?

সঠিকতা প্রায় সবসময় দক্ষতা ট্রাম্প।

ব্যতিক্রম ছাড়া, নিম্নলিখিতগুলি সহজেই ঘটতে পারে:

  1. কিছু কোড পি বোঝানো হয় কোনও সংস্থান অর্জন করতে বা কিছু তথ্য গণনা করা।

  2. কলিং কোড সিটির সাফল্য / ব্যর্থতার জন্য পরীক্ষা করা উচিত ছিল, তবে তা নয়।

  3. সি-র অনুসরণের পরে একটি অস্তিত্বের সংস্থান বা অবৈধ তথ্য ব্যবহৃত হয়, ফলে সাধারণ বিপর্যয় ঘটে।

মূল সমস্যাটি হচ্ছে পয়েন্ট (2), যেখানে সাধারণ রিটার্ন কোড স্কিম সহ কলিং কোড সি চেক করতে বাধ্য হয় না।

দুটি প্রধান পন্থা যা এই ধরণের চেক করতে বাধ্য করে:

  • যেখানে পি ব্যর্থ হয় তখন সরাসরি একটি ব্যতিক্রম ছুঁড়ে দেয়।

  • যেখানে পি এমন কোনও বস্তু প্রদান করে যা সি এর প্রধান মান (অন্যথায় ব্যতিক্রম বা সমাপ্তি) ব্যবহারের আগে পরিদর্শন করতে হবে ।

দ্বিতীয় পন্থাটি ছিল, এএফএআইকি, বার্টন এবং ন্যাকম্যান দ্বারা প্রথম তাদের গ্রন্থ * বৈজ্ঞানিক ও প্রকৌশল সি ++ এ বর্ণনা করা হয়েছিল: উন্নত প্রযুক্তি এবং উদাহরণ সহ একটি ভূমিকা , যেখানে তারা Fallowএকটি " ক্লাস " সম্ভাব্য ফাংশন ফলাফলের জন্য ডাকা একটি ক্লাস চালু করেছিল । অনুরূপ একটি ক্লাস বলা optionalহয় এখন বুস্ট লাইব্রেরি দ্বারা অফার করা হয়। এবং আপনি নন-পিওডি ফলাফলের ক্ষেত্রে মান হিসাবে ক্যারিয়ার Optionalব্যবহার করে সহজেই একটি শ্রেণি প্রয়োগ করতে পারেন std::vector

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


ব্যতিক্রমী পারফরম্যান্সে বিভিন্ন সি ++ স্ট্যান্ডার্ডের প্রভাব কী?

"আমি জানতে চাই যে এটি এখনও সি ++ 98 এর জন্য সত্য?"

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

সি ++ 03 কেবলমাত্র সি ++ 98 এর একটি প্রযুক্তিগত করিয়েনডাম ছিল। সি ++ 03-এ কেবলমাত্র নতুনটি ছিল মান শুরুর দিকে । যার ব্যতিক্রম কিছু করার নেই।

সি ++ 11 স্ট্যান্ডার্ড সাধারণ ব্যতিক্রমের স্পেসিফিকেশনগুলি মুছে ফেলা হয়েছে এবং noexceptকীওয়ার্ডের সাথে প্রতিস্থাপন করা হয়েছে ।

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


7
"প্রোগ্রামিং ভাষা নির্বিশেষে ভাষার অন্যান্য মৌলিক ক্রিয়াকলাপগুলির তুলনায় ব্যতিক্রমগুলি সর্বদা ধীর হয়" ... সাধারণ প্রবাহ নিয়ন্ত্রণে ব্যতিক্রমগুলির ব্যবহার সংকলনের জন্য নির্মিত ভাষাগুলি ব্যতীত ...
বেন ভয়েগট

4
"একটি ব্যতিক্রম নিক্ষেপ বরাদ্দ এবং স্ট্যাক আনওয়ানডিং উভয় জড়িত"। এটি স্পষ্টতই সাধারণভাবে সত্য নয় এবং আবারও ওসিএএমএল একটি পাল্টা উদাহরণ। আবর্জনা সংগৃহীত ভাষাগুলিতে স্ট্যাকটি আনওয়াইন্ড করার দরকার নেই কারণ সেখানে কোনও ধ্বংসকারী নেই তাই আপনি কেবল longjmpহ্যান্ডলারের কাছে to
জেডি

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

4
@ চিয়ারসান্থথ-আলফ: "পাইহনের ব্যতিক্রম পরিচালনার জন্য শেষ অবধি রয়েছে this এর অর্থ একটি পাইথন বাস্তবায়ন হয় অযাচিত স্ট্যাকের সাথে রয়েছে বা পাইথন নয়।" try..finallyকনস্ট্রাক্ট স্ট্যাক unwinding ছাড়া বাস্তবায়িত করা যাবে না। এফ #, সি # এবং জাভা সমস্ত try..finallyস্ট্যাক আনওয়াইন্ডিং ব্যবহার না করে বাস্তবায়ন করে। আপনি কেবল longjmpহ্যান্ডলারের কাছে (যেমন আমি ইতিমধ্যে ব্যাখ্যা করেছি)।
জেডি

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

14

আপনি কোডটি অ্যাসেমব্লিতে রূপান্তর না করে বা এটির মাপকাঠি না করা পর্যন্ত আপনি কখনও কর্মক্ষমতা সম্পর্কে দাবি করতে পারবেন না।

আপনি যা দেখেন তা এখানে: (কুইক-বেঞ্চ)

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

সেগুলি সম্পর্কে আপনি অনেকগুলি পরস্পরবিরোধী মতামত দেখেন। তবে শেষ পর্যন্ত, ব্যতিক্রমগুলি কি ধীর? আমি বিচার করি না। শুধু মানদণ্ড দেখুন।

সি ++ ব্যতিক্রম কর্মক্ষমতা মানদণ্ড


13

এটি সংকলকের উপর নির্ভর করে।

উদাহরণস্বরূপ, জিসিসি ব্যতিক্রমগুলি পরিচালনা করার সময় খুব খারাপ অভিনয় করার জন্য পরিচিত ছিল, তবে এটি গত কয়েক বছরে যথেষ্ট উন্নত হয়েছে better

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

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


-1 প্রশ্নটি এখন যেমন দাঁড়িয়েছে, "এটি কি এখনও সি ++ 98 এর জন্য সত্য", এটি অবশ্যই সংকলকের উপর নির্ভর করে না। এছাড়াও, এই উত্তরটি throw new Exceptionএকটি জাভা-আইএসএম। একটি নিয়ম হিসাবে কখনও পয়েন্টার নিক্ষেপ করা উচিত ।
চিয়ার্স এবং এইচটিএইচ - আলফ

4
98 স্ট্যান্ডার্ড কীভাবে ব্যতিক্রমগুলি কার্যকর করতে হবে তা নির্দেশ করে?
thecoshman

6
সি ++ 98 একটি আইএসও স্ট্যান্ডার্ড, সংকলক নয়। অনেকগুলি সংকলক রয়েছে যা এটি বাস্তবায়ন করে।
ফিলিপ

4
@ থেকোশম্যান: না। সি ++ স্ট্যান্ডার্ড কীভাবে কোনও কিছু বাস্তবায়িত করা উচিত সে সম্পর্কে কিছুই বলেনি ("বাস্তবায়নের সীমাগুলির" মানের অংশটিকে সম্ভবত বাদ দিয়ে)।
সিলিকো

4
@ ইনসিলিকো তখন আমি কেবলমাত্র যৌক্তিক উপসংহারটিই আঁকতে পারি যে (আশ্চর্যের সাথে) এটি বাস্তবায়ন সংজ্ঞায়িত (পড়ুন, সংকলক নির্দিষ্ট) কীভাবে ব্যতিক্রমগুলি সম্পাদন করে।
thecoshman

4

হ্যাঁ, তবে তাতে কিছু যায় আসে না। কেন?
এটি পড়ুন:
https://blogs.msdn.com/b/ericlippert/archive/2008/09/10/vexing-exception.aspx

মূলত এটি বলে যে আলেকজান্দ্রেস্কুর বর্ণিত ব্যতিক্রমগুলি ব্যবহার করা (50x ধীরগতির কারণ তারা catchযেমন ব্যবহার করে else) ঠিক ততই ভুল। পিপিএল যারা এই কাজটি করতে চান তাদের জন্য বলা হচ্ছে আমি সি ++ 22 :) এর মতো কিছু যুক্ত করব:
(দ্রষ্টব্য এটি মূল ভাষা হতে হবে যেহেতু এটি মূলত বিদ্যমানটি থেকে কোড তৈরির কোড সংকলক)

result = attempt<lexical_cast<int>>("12345");  //lexical_cast is boost function, 'attempt'
//... is the language construct that pretty much generates function from lexical_cast, generated function is the same as the original one except that fact that throws are replaced by return(and exception type that was in place of the return is placed in a result, but NO exception is thrown)...     
//... By default std::exception is replaced, ofc precise configuration is possible
if (result)
{
     int x = result.get(); // or result.result;
}
else 
{
     // even possible to see what is the exception that would have happened in original function
     switch (result.exception_type())
     //...

}

পিএস এছাড়াও নোট করুন যে ব্যাতিক্রমগুলি যদি ধীর হয় তবে ... কার্যকর করার সময় আপনি কোডের সেই অংশটিতে প্রচুর সময় ব্যয় করবেন না এমন সমস্যা নেই ... উদাহরণস্বরূপ যদি ফ্লোট বিভাগটি ধীর হয় এবং আপনি এটি 4x করেন আপনি যদি এফপি বিভাগে আপনার 0.3% সময় ব্যয় করেন তবে তা দ্রুতই তত গুরুত্বপূর্ণ নয় ...


0

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

সম্পাদনা: আমি বলছি না যে এগুলি মোটেই ব্যবহার করবেন না তবে পারফরম্যান্স নিবিড় কোডের জন্য এগুলি এড়ানো ভাল।


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

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