নেট নেট ব্যতিক্রম কত ধীর?


143

কখন এবং কীভাবে ব্যতিক্রম ছোঁড়াবেন না সে সম্পর্কে আমি আলোচনা চাই না। আমি একটি সাধারণ সমস্যা সমাধান করতে ইচ্ছুক। 99% সময় ব্যতিক্রম না ছোঁড়ার যুক্তি তাদের চারদিকে ঘোরে যখন অন্য পক্ষ দাবি করে (বেঞ্চমার্ক পরীক্ষা দিয়ে) যে গতি ইস্যু নয়। আমি একপাশে বা অন্যের সাথে সম্পর্কিত অসংখ্য ব্লগ, নিবন্ধ এবং পোস্ট পড়েছি। তাহলে এটি কোনটি?

উত্তরগুলি থেকে কিছু লিঙ্ক: স্কিট , মারিয়ানি , ব্রুমে


13
মিথ্যা, জঘন্য মিথ্যা এবং মানদণ্ড আছে। :)
gbjbaanb

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

উত্তর:


207

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

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

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


2
দুর্ভাগ্যক্রমে, লোকেদের ব্যতিক্রম মুক্ত বলা হয়, তুচ্ছ 'সঠিক' কার্যকারিতার জন্য এগুলি ব্যবহার করুন, আপনার বক্তব্য হিসাবে তাদের ব্যবহার করা উচিত, যখন জিনিসগুলি ভুল হয়েছে - 'ব্যতিক্রমী' পরিস্থিতিতে
gbjbaanb

4
হ্যাঁ, লোকেদের অবশ্যই সচেতন হওয়া উচিত যে ব্যতিক্রমগুলি যথাযথভাবে ব্যবহারের সাথে জড়িত performance আমি কেবল মনে করি যখন এটি যথাযথভাবে ব্যবহৃত হয় তখন এটি একটি নন-ইস্যু :)
জন স্কিটি

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

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

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

31

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

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

ক্রিস একটি প্রাসঙ্গিক উক্তি দিয়েছেন:

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


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

8

লোকেরা কী সম্পর্কে কথা বলছে তা আমি জানি না যখন তারা বলে যে তারা নিক্ষেপ করা হয় তবে তারা ধীর হয়।

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

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

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

তদুপরি, এসি টিমের লিখিত "পারফরম্যান্স টেস্টিং মাইক্রোসফ্ট। নেট ওয়েব অ্যাপ্লিকেশনস" এর অনুলিপি অনুসারে:

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

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


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

2) আপনি ডিবাগারের নিচে ছুটছিলেন, না?
জন স্কিটি 2:58

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

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

5
কোরি, আমি মনে করি "কেবল ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে থেমে যেত ক্যাচ / অবশেষে ব্লক উপস্থিত থাকায় আপনাকে পারফরম্যান্স সম্পর্কে চিন্তা করতে হবে না। অর্থাত্ এগুলিই কোনও পারফরম্যান্স হিটের কারণ নয়, কেবলমাত্র একটি আসল ব্যতিক্রম উদাহরণের ঘটনা।
ইয়ান হরউইল

6

যুক্তি হিসাবে আমি এটি বুঝতে পারি যে নিক্ষেপ ব্যতিক্রমগুলি খারাপ তা তারা প্রতি সেমি ধীর হয়। পরিবর্তে, এটি আরও বেশি traditionalতিহ্যবাহী শর্তসাপেক্ষ কনস্ট্রাক্টের পরিবর্তে থ্রো / ক্যাচ কনস্ট্রাক্টটিকে সাধারণ অ্যাপ্লিকেশন লজিক নিয়ন্ত্রণের প্রথম শ্রেণীর উপায় হিসাবে ব্যবহার করার বিষয়ে।

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

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

এটি অনেক ক্ষেত্রে দেখা যায় কারণ গ্রাহকরা একটি লুপে মানগুলি রূপান্তর করার চেষ্টা করছিলেন এবং প্রতিটি প্রচেষ্টা ব্যর্থ হয়েছিল। একটি রূপান্তর ব্যতিক্রম নিক্ষেপ করা হয়েছিল এবং তারপরে একটি ব্যতিক্রম হ্যান্ডলার দ্বারা ধরা হয়েছিল যা তারপরে ব্যতিক্রমটিকে গ্রাস করে এবং লুপটি অবিরত করে।

মাইক্রোসফ্ট সুপারিশ করে এখন ট্রাইএক্সএক্সএক্সএক্স পদ্ধতিগুলি বিশেষত এই পরিস্থিতিতে সম্ভাব্য কার্য সম্পাদনের সমস্যাগুলি এড়াতে ব্যবহার করা উচিত।

আমি ভুল হতে পারি, তবে মনে হচ্ছে আপনি যে "বেঞ্চমার্কস" সম্পর্কে পড়েছেন তার সত্যতা সম্পর্কে আপনি নির্দিষ্ট নন। সহজ সমাধান: এটি নিজের জন্য চেষ্টা করে দেখুন।


আমি ভেবেছিলাম যে অভ্যন্তরীণভাবে "চেষ্টা" ফাংশনগুলিও ব্যতিক্রমগুলি ব্যবহার করে?
গ্রেগ

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

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

4

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


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

3

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


2

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

ওভার ত্রুটি কোডগুলি ব্যবহার করার জন্য তারা অবশ্যই মূল্যবান, সুবিধাগুলি রয়েছে বিশাল আইএমও।


2

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

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

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

দিনের শেষে, এগুলি একটি বৈধ ভাষার বৈশিষ্ট্য।

শুধু আমার বক্তব্য প্রমাণ করতে

দয়া করে এই লিঙ্কে কোডটি চালান (উত্তরের জন্য খুব বড়)

আমার কম্পিউটারে ফলাফল:

marco@sklivvz:~/develop/test$ mono Exceptions.exe | grep PM
10/2/2008 2:53:32 PM
10/2/2008 2:53:42 PM
10/2/2008 2:53:52 PM

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


2

কিন্তু মনো একা। নেট স্ট্যান্ডেলোন মোডের চেয়ে ব্যতিক্রম 10x দ্রুত নিক্ষেপ করে এবং। নেট স্ট্যান্ডেলোন মোড। নেট ডিবাগার মোডের চেয়ে 60x দ্রুত ব্যতিক্রম ছুঁড়ে দেয়। (টেস্টিং মেশিনগুলির একই সিপিইউ মডেল রয়েছে)

int c = 1000000;
int s = Environment.TickCount;
for (int i = 0; i < c; i++)
{
    try { throw new Exception(); }
    catch { }
}
int d = Environment.TickCount - s;

Console.WriteLine(d + "ms / " + c + " exceptions");

1

রিলিজ মোডে ওভারহেড ন্যূনতম হয়।

আপনি যদি পুনরাবৃত্ত ফ্যাশনে প্রবাহ-নিয়ন্ত্রণের জন্য ব্যতিক্রম (উদাহরণস্বরূপ, অ-স্থানীয় প্রস্থানগুলি) ব্যবহার না করে থাকেন তবে আমি সন্দেহ করি আপনি পার্থক্যটি লক্ষ্য করতে সক্ষম হবেন।


1

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

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

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

উইন্ডোজ সিএলআর-এর জন্য আমার ব্যতিক্রম বনাম রিটার্ন মানগুলির সংক্ষিপ্ত ফলাফলগুলি।

baseline: recurse_depth 8, error_freqeuncy 0 (0), time elapsed 13.0007 ms
baseline: recurse_depth 8, error_freqeuncy 0.25 (0), time elapsed 13.0007 ms
baseline: recurse_depth 8, error_freqeuncy 0.5 (0), time elapsed 13.0008 ms
baseline: recurse_depth 8, error_freqeuncy 0.75 (0), time elapsed 13.0008 ms
baseline: recurse_depth 8, error_freqeuncy 1 (0), time elapsed 14.0008 ms
retval_error: recurse_depth 5, error_freqeuncy 0 (0), time elapsed 13.0008 ms
retval_error: recurse_depth 5, error_freqeuncy 0.25 (249999), time elapsed 14.0008 ms
retval_error: recurse_depth 5, error_freqeuncy 0.5 (499999), time elapsed 16.0009 ms
retval_error: recurse_depth 5, error_freqeuncy 0.75 (999999), time elapsed 16.001 ms
retval_error: recurse_depth 5, error_freqeuncy 1 (999999), time elapsed 16.0009 ms
retval_error: recurse_depth 8, error_freqeuncy 0 (0), time elapsed 20.0011 ms
retval_error: recurse_depth 8, error_freqeuncy 0.25 (249999), time elapsed 21.0012 ms
retval_error: recurse_depth 8, error_freqeuncy 0.5 (499999), time elapsed 24.0014 ms
retval_error: recurse_depth 8, error_freqeuncy 0.75 (999999), time elapsed 24.0014 ms
retval_error: recurse_depth 8, error_freqeuncy 1 (999999), time elapsed 24.0013 ms
exception_error: recurse_depth 8, error_freqeuncy 0 (0), time elapsed 31.0017 ms
exception_error: recurse_depth 8, error_freqeuncy 0.25 (249999), time elapsed 5607.3208     ms
exception_error: recurse_depth 8, error_freqeuncy 0.5 (499999), time elapsed 11172.639  ms
exception_error: recurse_depth 8, error_freqeuncy 0.75 (999999), time elapsed 22297.2753 ms
exception_error: recurse_depth 8, error_freqeuncy 1 (999999), time elapsed 22102.2641 ms

এবং এখানে কোড ..

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace ConsoleApplication1 {

public class TestIt {
    int value;

    public class TestException : Exception { } 

    public int getValue() {
        return value;
    }

    public void reset() {
        value = 0;
    }

    public bool baseline_null(bool shouldfail, int recurse_depth) {
        if (recurse_depth <= 0) {
            return shouldfail;
        } else {
            return baseline_null(shouldfail,recurse_depth-1);
        }
    }

    public bool retval_error(bool shouldfail, int recurse_depth) {
        if (recurse_depth <= 0) {
            if (shouldfail) {
                return false;
            } else {
                return true;
            }
        } else {
            bool nested_error = retval_error(shouldfail,recurse_depth-1);
            if (nested_error) {
                return true;
            } else {
                return false;
            }
        }
    }

    public void exception_error(bool shouldfail, int recurse_depth) {
        if (recurse_depth <= 0) {
            if (shouldfail) {
                throw new TestException();
            }
        } else {
            exception_error(shouldfail,recurse_depth-1);
        }

    }

    public static void Main(String[] args) {
        int i;
        long l;
        TestIt t = new TestIt();
        int failures;

        int ITERATION_COUNT = 1000000;


        // (0) baseline null workload
        for (int recurse_depth = 2; recurse_depth <= 10; recurse_depth+=3) {
            for (float exception_freq = 0.0f; exception_freq <= 1.0f; exception_freq += 0.25f) {            
                int EXCEPTION_MOD = (exception_freq == 0.0f) ? ITERATION_COUNT+1 : (int)(1.0f / exception_freq);            

                failures = 0;
                DateTime start_time = DateTime.Now;
                t.reset();              
                for (i = 1; i < ITERATION_COUNT; i++) {
                    bool shoulderror = (i % EXCEPTION_MOD) == 0;
                    t.baseline_null(shoulderror,recurse_depth);
                }
                double elapsed_time = (DateTime.Now - start_time).TotalMilliseconds;
                Console.WriteLine(
                    String.Format(
                      "baseline: recurse_depth {0}, error_freqeuncy {1} ({2}), time elapsed {3} ms",
                        recurse_depth, exception_freq, failures,elapsed_time));
            }
        }


        // (1) retval_error
        for (int recurse_depth = 2; recurse_depth <= 10; recurse_depth+=3) {
            for (float exception_freq = 0.0f; exception_freq <= 1.0f; exception_freq += 0.25f) {            
                int EXCEPTION_MOD = (exception_freq == 0.0f) ? ITERATION_COUNT+1 : (int)(1.0f / exception_freq);            

                failures = 0;
                DateTime start_time = DateTime.Now;
                t.reset();              
                for (i = 1; i < ITERATION_COUNT; i++) {
                    bool shoulderror = (i % EXCEPTION_MOD) == 0;
                    if (!t.retval_error(shoulderror,recurse_depth)) {
                        failures++;
                    }
                }
                double elapsed_time = (DateTime.Now - start_time).TotalMilliseconds;
                Console.WriteLine(
                    String.Format(
                      "retval_error: recurse_depth {0}, error_freqeuncy {1} ({2}), time elapsed {3} ms",
                        recurse_depth, exception_freq, failures,elapsed_time));
            }
        }

        // (2) exception_error
        for (int recurse_depth = 2; recurse_depth <= 10; recurse_depth+=3) {
            for (float exception_freq = 0.0f; exception_freq <= 1.0f; exception_freq += 0.25f) {            
                int EXCEPTION_MOD = (exception_freq == 0.0f) ? ITERATION_COUNT+1 : (int)(1.0f / exception_freq);            

                failures = 0;
                DateTime start_time = DateTime.Now;
                t.reset();              
                for (i = 1; i < ITERATION_COUNT; i++) {
                    bool shoulderror = (i % EXCEPTION_MOD) == 0;
                    try {
                        t.exception_error(shoulderror,recurse_depth);
                    } catch (TestException e) {
                        failures++;
                    }
                }
                double elapsed_time = (DateTime.Now - start_time).TotalMilliseconds;
                Console.WriteLine(
                    String.Format(
                      "exception_error: recurse_depth {0}, error_freqeuncy {1} ({2}), time elapsed {3} ms",
                        recurse_depth, exception_freq, failures,elapsed_time));         }
        }
    }
}


}

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

বিপরীতে, প্রশ্নটি হল "ব্যতিক্রমগুলি ধীরে ধীরে", পিরিয়ড। এটি বিশেষত কখন ব্যতিক্রম ছুঁড়তে হবে তা এড়িয়ে চলতে বলেছে, কারণ এই বিষয়টি সত্যগুলিকে অস্পষ্ট করে। ব্যতিক্রম কর্মক্ষমতা কি?
ডেভিড জেস্ক

0

ব্যতিক্রম ক্যাপচারের সাথে সম্পর্কিত পারফরম্যান্সের জন্য এখানে একটি দ্রুত নোট।

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


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

-1

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

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

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


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