সি # তে ছোট কোডের নমুনা বেঞ্চমার্কিং, এই বাস্তবায়ন কি উন্নত করা যেতে পারে?


104

বেশিরভাগ ক্ষেত্রে এসও তে আমি নিজেকে কোডের ছোট ছোট অংশগুলি দেখতে পাচ্ছি কোনটি কার্যকর করা সবচেয়ে দ্রুত see

বেশিরভাগ সময় আমি এমন মন্তব্য দেখতে পাই যে বেঞ্চমার্কিং কোডটি জিটিং বা আবর্জনা সংগ্রহকারীকে বিবেচনা করে না।

আমার নিম্নোক্ত সাধারণ বেঞ্চমার্কিং কার্য রয়েছে যা আমি ধীরে ধীরে বিবর্তিত হয়েছি:

  static void Profile(string description, int iterations, Action func) {
        // warm up 
        func();
        // clean up
        GC.Collect();

        var watch = new Stopwatch();
        watch.Start();
        for (int i = 0; i < iterations; i++) {
            func();
        }
        watch.Stop();
        Console.Write(description);
        Console.WriteLine(" Time Elapsed {0} ms", watch.ElapsedMilliseconds);
    }

ব্যবহার:

Profile("a descriptions", how_many_iterations_to_run, () =>
{
   // ... code being profiled
});

এই বাস্তবায়নের কোনও ত্রুটি আছে কি? জেড পুনরাবৃত্তির ওপরে বাস্তবায়নের চেয়ে এক্স এক্সপ্লোরেশন এক্স দ্রুততর তা দেখাতে কি যথেষ্ট ভাল? আপনি যে কোনও উপায়ে উন্নতি করতে পারেন তা ভাবতে পারেন?

সম্পাদনা সম্পাদনা এটি অত্যন্ত পরিষ্কার যে একটি সময় ভিত্তিক পদ্ধতির (পুনরাবৃত্তির বিপরীতে) পছন্দ করা হয়, কারও কি এমন কোনও বাস্তবায়ন রয়েছে যেখানে সময় চেকগুলি কার্য সম্পাদন করে না?


উত্তর:


95

পরিবর্তিত ফাংশনটি এখানে: সম্প্রদায় দ্বারা প্রস্তাবিত হিসাবে এটির একটি সম্প্রদায়ের উইকি সংশোধন করতে দ্বিধা বোধ করুন।

static double Profile(string description, int iterations, Action func) {
    //Run at highest priority to minimize fluctuations caused by other processes/threads
    Process.GetCurrentProcess().PriorityClass = ProcessPriorityClass.High;
    Thread.CurrentThread.Priority = ThreadPriority.Highest;

    // warm up 
    func();

    var watch = new Stopwatch(); 

    // clean up
    GC.Collect();
    GC.WaitForPendingFinalizers();
    GC.Collect();

    watch.Start();
    for (int i = 0; i < iterations; i++) {
        func();
    }
    watch.Stop();
    Console.Write(description);
    Console.WriteLine(" Time Elapsed {0} ms", watch.Elapsed.TotalMilliseconds);
    return watch.Elapsed.TotalMilliseconds;
}

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


লুপের ওভারহেড কমানোর জন্য আপনি 10 এর মতো কয়েকবার লুপটি আনারল করতে চাইতে পারেন।
মাইক ডুনলাভে

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

1
@ লুক, দুর্দান্ত পরিবর্তন (আমি আশা করি এটি +1 করতে পারতাম)। @ মাইকে নিশ্চিত নয়, আমি সন্দেহ করি যে ভার্চুয়ালকালের ওভারহেড তুলনা এবং কার্যনির্বাহী থেকে অনেক বেশি হবে, সুতরাং পারফরম্যান্সের পার্থক্য নগণ্য হবে
স্যাম সাফরন

আমি আপনাকে অ্যাকশনটিতে পুনরাবৃত্তি গণনাটি পাস করার এবং সেখানে লুপ তৈরি করার প্রস্তাব দিচ্ছি (সম্ভবত - এমনকি অনিবন্ধিতও)। আপনি যদি অপেক্ষাকৃত সংক্ষিপ্ত অপারেশন পরিমাপ করেন তবে এটিই একমাত্র বিকল্প। এবং আমি ইনভার্স মেট্রিক দেখতে পছন্দ করি - যেমন পাস / সেকেন্ডের গণনা count
অ্যালেক্স ইয়াকুনিন

2
গড় সময় দেখাতে আপনি কী ভাবেন। এর মতো কিছু: কনসোল.ওরাইটলাইন ("গড় সময় অতিবাহিত {0} এমএস", ওয়াচ.এলাপড মিলিসেকেন্ডস / পুনরাবৃত্তি);
রুডিমিটার

22

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

আপনি যদি পরীক্ষাটি শুরু করার আগে চূড়ান্তকরণটি শেষ হয়ে গেছে তা নিশ্চিত করতে চান তবে আপনি কল করতে চাইতে পারেন GC.WaitForPendingFinalizersযা চূড়ান্তকরণের সারিটি সাফ না হওয়া পর্যন্ত অবরুদ্ধ হবে:

GC.Collect();
GC.WaitForPendingFinalizers();
GC.Collect();

10
GC.Collect()আরও একবার কেন ?
কলিনফ্যাং

7
@ কলিনফ্যাং কারণ বস্তুগুলি "চূড়ান্ত করা" চূড়ান্তকরণকারীর দ্বারা GC'ed হয় না। দ্বিতীয়টি Collect"চূড়ান্ত" অবজেক্টগুলিও সংগ্রহ করা হয়েছে তা নিশ্চিত করার জন্য সেখানে রয়েছে।
এমএভি

15

আপনি যদি জিসি ইন্টারঅ্যাকশনটিকে সমীকরণের বাইরে নিয়ে যেতে চান তবে আপনি নিজের 'ওয়ার্ম আপ' কলটি জিসি.কালেক্ট কলের পরে চালাতে চাইতে পারেন , এর আগে নয়। এইভাবে আপনি জানেন N নেট আপনার কার্যকারিতার কাজের সেটের জন্য ইতিমধ্যে ওএস থেকে যথেষ্ট পরিমাণ মেমরি বরাদ্দ করবে।

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

এছাড়াও, আপনি কী ধরণের স্টাফ তৈরি করছেন তার উপর নির্ভর করে আপনি নির্দিষ্ট সময়ের জন্য নির্দিষ্ট সময়ের জন্য আপনার সময় ভিত্তিক চলমান কাজটি করতে চাইতে পারেন - এটি ছাড়াই আরও সহজে তুলনীয় সংখ্যার দিকে ঝুঁকতে পারে সবচেয়ে ভাল বাস্তবায়নের জন্য খুব সংক্ষিপ্ত রান করতে হবে এবং / বা সবচেয়ে খারাপের জন্য খুব দীর্ঘ একটি হতে হবে।


1
ভাল পয়েন্টগুলি, আপনি কি মাথায় রেখে সময় ভিত্তিক বাস্তবায়ন করবেন?
স্যাম জাফরন

6

আমি প্রতিনিধি পাস করা এড়াতে চাই:

  1. ডেলিগেট কল হ'ল ভার্চুয়াল পদ্ধতি কল। সস্তা নয়:। নেট মধ্যে ক্ষুদ্রতম মেমরির বরাদ্দের 25%। আপনি যদি বিশদে আগ্রহী হন তবে দেখুন এই লিঙ্কটি
  2. বেনামে প্রতিনিধি ক্লোজারগুলির ব্যবহারের দিকে নিয়ে যেতে পারে, যা আপনি খেয়ালও করবেন না। আবার ক্লোজার ফিল্ডগুলি অ্যাক্সেস করা লক্ষণীয় than স্ট্যাকের কোনও ভেরিয়েবল অ্যাক্সেস করার চেয়ে।

বন্ধের ব্যবহারের দিকে পরিচালিত করে এমন একটি উদাহরণ কোড:

public void Test()
{
  int someNumber = 1;
  Profiler.Profile("Closure access", 1000000, 
    () => someNumber + someNumber);
}

যদি আপনি ক্লোজারগুলি সম্পর্কে সচেতন না হন, NET রিফ্লেক্টরে এই পদ্ধতিটি একবার দেখুন।


আকর্ষণীয় বিষয়, তবে আপনি যদি কোনও প্রতিনিধি পাস না করেন তবে কীভাবে আপনি পুনরায় ব্যবহারযোগ্য প্রোফাইল () পদ্ধতি তৈরি করবেন? কোনও পদ্ধতিতে স্বেচ্ছাসেবক কোড পাস করার অন্যান্য উপায় আছে কি?
অ্যাশ

1
আমরা "ব্যবহার করে (নতুন পরিমাপ (...)) {... পরিমাপ করা কোড ...}" ব্যবহার করি। সুতরাং আমরা ডেলিগেটটি পাস করার পরিবর্তে পরিমাপের অবজেক্টটি প্রয়োগকারী আইডিজিপোজেবল পাব। কোড. google.com/p/dataobjectsdotnet/source/browse/XLive.Core/…
অ্যালেক্স ইয়াকুনিন

এটি বন্ধ হওয়ার সাথে কোনও সমস্যার দিকে পরিচালিত করবে না।
অ্যালেক্স ইয়াকুনিন

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

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

6

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

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


1
সত্যিই লোড হওয়া শর্তগুলির মধ্যে একটি তাৎপর্যপূর্ণ। কখনও কখনও 20% দ্রুত বাস্তবায়ন হওয়া তাৎপর্যপূর্ণ হয়, কখনও কখনও তাৎপর্যপূর্ণ হতে 100 গুণ দ্রুত হতে হয়। আপনার সাথে স্বচ্ছতার সাথে একমত হোন দেখুন: স্ট্যাকওভারফ্লো.com
স্যাম সাফ্রন

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

5

func()ওয়ার্ম-আপের জন্য আমি একাধিকবার ফোন করেছি , কেবল একটি নয়।


1
উদ্দেশ্যটি হ'ল জিট সংকলন সম্পাদিত হয় তা নিশ্চিত করা, পরিমাপের আগে একাধিকবার ফানক কল করা থেকে আপনি কী সুবিধা পাবেন?
স্যাম জাফরান

3
জেআইটিকে তার প্রথম ফলাফলের উন্নতির সুযোগ দেওয়ার জন্য।
অ্যালেক্সি রোমানভ

1
.NET JIT সময়ের সাথে সাথে এর ফলাফলগুলি উন্নত করে না (জাভা যেমন করে)। এটি প্রথম কলটিতে কেবল একবার আইএল থেকে অ্যাসেমব্লিতে রূপান্তর করে।
ম্যাট ওয়ারেন

4

উন্নতির জন্য পরামর্শ

  1. কার্যকর করার পরিবেশটি বেঞ্চমার্কিংয়ের জন্য ভাল কিনা তা সনাক্ত করা (যেমন কোনও ডিবাগার সংযুক্ত রয়েছে কিনা তা সনাক্ত করা বা যদি জিট অপ্টিমাইজেশন অক্ষম করা হয় যা ভুল পরিমাপের ফলে ঘটতে পারে)।

  2. কোডের কিছু অংশ স্বাধীনভাবে পরিমাপ করা (ঠিক কোথায় বাধা আছে তা দেখতে)।

  3. কোডের বিভিন্ন সংস্করণ / উপাদান / অংশগুলির সাথে তুলনা করা (আপনার প্রথম বাক্যে আপনি বলেছিলেন '... কোন প্রয়োগটি দ্রুততর হয় তা দেখতে কোডের ছোট অংশগুলি বেঞ্চমার্ক করে' ')।

# 1 সম্পর্কিত:

  • কোনও ডিবাগার সংযুক্ত আছে কিনা তা সনাক্ত করতে সম্পত্তিটি পড়ুন System.Diagnostics.Debugger.IsAttached (শুরুতে ডিবাগারটি সংযুক্ত না থাকলেও কিছু সময় পরে সংযুক্ত থাকে এমন ক্ষেত্রেও পরিচালনা করতে মনে রাখবেন)।

  • জিট অপ্টিমাইজেশন অক্ষম রয়েছে কিনা তা সনাক্ত করতে, DebuggableAttribute.IsJITOptimizerDisabledপ্রাসঙ্গিক অ্যাসেমব্লিজগুলির সম্পত্তি পড়ুন :

    private bool IsJitOptimizerDisabled(Assembly assembly)
    {
        return assembly.GetCustomAttributes(typeof (DebuggableAttribute), false)
            .Select(customAttribute => (DebuggableAttribute) customAttribute)
            .Any(attribute => attribute.IsJITOptimizerDisabled);
    }

# 2 সম্পর্কিত:

এটি বিভিন্ন উপায়ে করা যেতে পারে। একটি উপায় হ'ল বেশ কিছু প্রতিনিধি সরবরাহ করার অনুমতি দেয় এবং তারপরে সেই প্রতিনিধিদের পৃথকভাবে পরিমাপ করে।

# 3 সম্পর্কিত:

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

এটি করার একটি উপায় হ'ল বেঞ্চমার্কের ফলাফলটিকে দৃ a়ভাবে টাইপ করা অবজেক্ট হিসাবে ফিরিয়ে আনা যা সহজেই বিভিন্ন প্রসঙ্গে ব্যবহার করা যায়।


Etimo.Benchmarks

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

এটি একটি উদাহরণ আউটপুট যেখানে দুটি উপাদানকে তুলনা করা হয় এবং ফলাফলটি কনসোলে লেখা হয়। এক্ষেত্রে তুলনামূলকভাবে দুটি উপাদানকে 'কেয়েডক্লাকশন' এবং 'মাল্টিপ্লি ইন্ডেক্সডকিডক্ল্যাডক্ল্যাশন' বলা হয়:

ইটিমো.বেঞ্চমার্কস - নমুনা কনসোল আউটপুট

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

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


1

জেআইটি সংকলক আপনার কোডটি লেখার জন্য যে সময় ব্যয় করে তা বাদ দিতে আপনাকে অবশ্যই প্রকৃত পরিমাপের আগে "ওয়ার্ম আপ" পাস চালাতে হবে।


এটি পরিমাপের আগে সম্পাদিত হয়
স্যাম জাফরন

1

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


1

আপনি যদি বেঞ্চমার্ক থেকে আবর্জনা সংগ্রহের প্রভাবটি সম্পূর্ণরূপে অপসারণের চেষ্টা করছেন, তবে এটি কি সেট করার মতো GCSettings.LatencyMode?

যদি না, এবং আপনি যে আবর্জনা তৈরির প্রভাবটি funcবেঞ্চমার্কের অংশ হতে চান, তবে আপনি কি পরীক্ষা শেষে (টাইমারের ভিতরে) সংগ্রহ করা বাধ্য করবেন না?


0

আপনার প্রশ্নের মূল সমস্যাটি এমন এক ধারণা যা একক পরিমাপ আপনার সমস্ত প্রশ্নের উত্তর দিতে পারে। পরিস্থিতির কার্যকর চিত্র পেতে আপনাকে একাধিকবার পরিমাপ করতে হবে এবং বিশেষত সি # এর মতো আবর্জনা সংগ্রহ করা ল্যাঙ্গোজে।

আর একটি উত্তর মৌলিক কর্মক্ষমতা পরিমাপের একটি ঠিক উপায় দেয়।

static void Profile(string description, int iterations, Action func) {
    // warm up 
    func();

    var watch = new Stopwatch(); 

    // clean up
    GC.Collect();
    GC.WaitForPendingFinalizers();
    GC.Collect();

    watch.Start();
    for (int i = 0; i < iterations; i++) {
        func();
    }
    watch.Stop();
    Console.Write(description);
    Console.WriteLine(" Time Elapsed {0} ms", watch.Elapsed.TotalMilliseconds);
}

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

static void ProfileGarbageMany(string description, int iterations, Action func) {
    // warm up 
    func();

    var watch = new Stopwatch(); 

    // clean up
    GC.Collect();
    GC.WaitForPendingFinalizers();
    GC.Collect();

    watch.Start();
    for (int i = 0; i < iterations; i++) {
        func();
    }
    GC.Collect();
    GC.WaitForPendingFinalizers();
    GC.Collect();

    watch.Stop();
    Console.Write(description);
    Console.WriteLine(" Time Elapsed {0} ms", watch.Elapsed.TotalMilliseconds);
}

এবং কেউ কেবলমাত্র একবার বলা হয়ে থাকে এমন কোনও পদ্ধতির জন্য আবর্জনা সংগ্রহের সবচেয়ে খারাপ পরিস্থিতি পরিমাপ করতে চাইতে পারেন only

static void ProfileGarbage(string description, int iterations, Action func) {
    // warm up 
    func();

    var watch = new Stopwatch(); 

    // clean up
    GC.Collect();
    GC.WaitForPendingFinalizers();
    GC.Collect();

    watch.Start();
    for (int i = 0; i < iterations; i++) {
        func();

        GC.Collect();
        GC.WaitForPendingFinalizers();
        GC.Collect();
    }
    watch.Stop();
    Console.Write(description);
    Console.WriteLine(" Time Elapsed {0} ms", watch.Elapsed.TotalMilliseconds);
}

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

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