কতগুলি নেস্টেড ফাংশন কল রয়েছে?


15

স্ট্যাকওভারফ্লো এক্সেকশন সম্পর্কে এমএসডিএন থেকে উদ্ধৃত :

এক্সিকিউশন স্ট্যাকের ওভারফ্লো হয়ে গেলে যে ব্যতিক্রম ছুঁড়ে ফেলা হয় কারণ এতে অনেকগুলি নেস্টেড মেথড কল রয়েছে।

Too manyএখানে বেশ অস্পষ্ট। যখন খুব বেশি সত্যই অনেক বেশি হয় তখন আমি কীভাবে জানব? হাজার হাজার ফাংশন কল? লক্ষ লক্ষ? আমি ধরে নিই যে এটি কম্পিউটারে মেমরির পরিমাণের সাথে কোনওভাবেই সম্পর্কিত হতে পারে তবে কি পরিমাপের প্রায় সঠিক ক্রম দিয়ে আসা সম্ভব?

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


4
পুনরাবৃত্ত ফাংশনটিকে একটি নন-रिकर्सিভ ফাংশনে রূপান্তর করা তুলনামূলকভাবে সহজ। শুধু আপনার ডেটা স্টিক Stack<T>
ব্রায়ান

1
"অনেক বেশি" কত বড় তা সংজ্ঞায়িত করা সম্পূর্ণ আপনার উপর নির্ভর করে। নেট জন্য, ব্যবহার করুন editbin /stack:WHATEVER-NUMBER-YOU-LIKE yourexefile.exe
এসকে-লজিক

উত্তর:


28

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

যদি না আপনার ভাষা পরিবেশ সমর্থন লেজ কল অপ্টিমাইজেশান (এবং আপনার পুনরাবৃত্তির হয় একটি পুচ্ছ কল), একটি চলতি মৌলিক নিয়ম হল: পুনরাবৃত্তির গভীরতা হে (log n), অর্থাৎ তার উপর ভিত্তি করে আলগোরিদিম বা ডেটা স্ট্রাকচার ব্যবহার হতে নিশ্চিত করা উচিত ডিভাইড-and- বিজয়ী (গাছের মতো, সর্বাধিক বাছাই করা অ্যালগরিদম ইত্যাদি) ঠিক আছে তবে কিছু লিনিয়ার (যেমন লিঙ্কযুক্ত তালিকার হ্যান্ডলিংয়ের পুনরাবৃত্তিমূলক বাস্তবায়ন) নয়।


3
+1 টি। খুব ভাল উত্তর, আমি এই নিয়মটি স্পষ্টভাবে ব্যবহার করছি তবে আমি এটি সম্পর্কে অবগত ছিলাম না।
জর্জিও

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

1
@ জনআর.স্ট্রোহম তবে ওপি প্রশ্নটি ট্যাগ করেছে। নেট, তাই এএফএইসি এই মুহুর্তে কেবল 64৪-বিট জিটারটি টেল কল অপটিমাইজেশন করে।
মার্ক হারড

1
ঠিক তাই কোনও বিভ্রান্তি নেই, x86 এবং x64 উভয়ই সিআইএলকে "লেজ" সম্মান করে। নির্দেশ উপসর্গ। সুতরাং সংক্ষিপ্তসার হিসাবে, নেট জমিগুলিতে, F # সম্পূর্ণ টেল-কল অপ্টিমাইজেশন করে, সি # করে না, এবং এক্স 64 জিটারটি যদি এটি "সহজ" হয় তবে (এটি নির্ভর করা যায় না)। দেখুন ব্লগস.এমএসডন.কম
স্টিফেন

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

17

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

আপনি StackOverflowExceptionযদি কিছুটা অপ্রচলিত হতে ইচ্ছুক হন তবে আপনি এটি একটি একক কল দিয়েও ফেলে দিতে পারেন:

private static unsafe void BlowUpTheStack()
{
    var x = stackalloc byte[1000000000];
    Console.WriteLine("Oh no, I've blown up the stack!");
}

দুর্ভাগ্যক্রমে, এই যুক্তিসঙ্গত ডিফল্টটি প্রায়শই লঙ্ঘন করা হয় (যেমন, এসপিএনটিতে)।
এসকে-লজিক

2

যেহেতু কোল ক্যাম্পবেল লক্ষনীয় মেমরির আকার এবং মাইকেল Borgwardt লক্ষনীয় লেজ কল অপ্টিমাইজেশান আমি ঐ আবরণ করা হবে না।

আরেকটি বিষয় সম্পর্কে সচেতন হতে হবে হ'ল সিপিএস যা বেশ কয়েকটি আন্তঃ বোনা ফাংশন অনুকূল করতে ব্যবহৃত হতে পারে যেখানে টেল কল অপটিমাইজেশন একক ফাংশনের জন্য।

আমরা এখানে যেমন করেছিলাম আপনি স্ট্যাকের আকার বাড়াতে পারেন এবং সচেতন হন যে -৪-বিট কোডটি 32-বিট কোডের চেয়ে দ্রুত স্ট্যাকটি খায়।

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

এছাড়াও, সমস্যাগুলি কোথায় ঘটে তা নির্ধারণ করার জন্য এবং ভিএস-এর সাথে কোড কভারেজ না থাকলে আপনি টেস্টড্রাইভন.এনইটি প্রয়োজন হয় তা নির্ধারণ করার জন্য যদি আপনার কোড কভারেজ করার প্রয়োজন হয় Test

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