.NET- এ, কোন লুপ দ্রুত চলে, 'ফর' বা 'ফোরচ'?


345

সি # / ভিবি.এনইটি / .নেটে কোন লুপটি দ্রুত চলে, forবা foreach?

যখন থেকে আমি পড়তে করে একটি forলুপ একটি তুলনায় দ্রুততর কাজ করে foreachলুপ একটি দীর্ঘ সময় আগে আমি সব সংগ্রহ, জেনেরিক সংগ্রহ, সমস্ত অ্যারে, ইত্যাদি জন্য সত্য দাঁড়িয়ে অধিকৃত

আমি গুগলকে ঘৃণা করেছি এবং কয়েকটি নিবন্ধ পেয়েছি, তবে তাদের বেশিরভাগই অনিবার্য (নিবন্ধগুলিতে মন্তব্যগুলি পড়ুন) এবং খোলা শেষ।

আদর্শটি হ'ল প্রতিটি দৃশ্যের তালিকাভুক্ত করা এবং এর জন্য সর্বোত্তম সমাধান।

উদাহরণস্বরূপ (এটি কেমন হওয়া উচিত তার একটি উদাহরণ):

  1. 1000+ স্ট্রিংগুলির একটি অ্যারের পুনরাবৃত্তি করার জন্য - এর forচেয়ে ভালforeach
  2. ওভার IList(নন জেনেরিক) স্ট্রিংগুলিকে পুনরুক্ত করার জন্য - এর foreachচেয়ে ভালfor

এর জন্য ওয়েবে কয়েকটি রেফারেন্স পাওয়া গেছে:

  1. ইমানুয়েল শ্যাঞ্জারের মূল গ্র্যান্ড পুরাতন নিবন্ধ
  2. কোডপ্রজেক্ট ফোরআরচ বনাম। জন্য
  3. ব্লগ - করতে foreachবা না করা foreach, এটাই প্রশ্ন
  4. এএসপি.নেট ফোরাম - নেট 1.1 সি # forবনামforeach

[সম্পাদনা]

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


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

3
প্রসঙ্গ ব্যতীত, আপনি ঠিক কী করছেন তা আমি জানতে পারি না, তবে আপনি যখন আংশিক পরিপূর্ণ অ্যারেটি জুড়ে আসেন তখন কী ঘটে?
ক্রিস চডমোর

6
যাইহোক, 2 মিলিয়ন হিট / মাস কিছুই ভীতিজনক নয়। এটি গড়ে প্রতি সেকেন্ডে হিটের চেয়ে কম।
মেহরদাদ আফশারি

37
গুরুত্বপূর্ণ দ্রষ্টব্য : এই প্রশ্নটি গতকাল সি # এর foreachপরিবর্তে ব্যবহার করতে বাধ্য করা সম্পর্কে সম্পূর্ণ সম্পর্কহীন প্রশ্নের সাথে একত্রীকরণ হয়েছে for। আপনি যদি এখানে এমন উত্তরগুলি দেখেন যা মোটেই কোনও অর্থ দেয় না, এজন্যই। মডারেটরকে দোষ দিন, বিরক্তিকর উত্তর নয়।
টেড

7
@ টেড ওহ আমি ভাবছিলাম যে সমস্ত "আপনার বস একজন নির্বোধ" মন্তব্যগুলি কোথা থেকে এসেছে, ধন্যবাদ
গ্যাসপা 79৯

উত্তর:


350

প্যাট্রিক স্মাচিয়া নিম্নলিখিত মাসে এই সিদ্ধান্ত নিয়েছেন :

  • তালিকার লুপগুলির জন্য তালিকায় ফোরচ লুপের চেয়ে 2 গুণ কম সস্তা।
  • অ্যারেতে লুপিং তালিকার লুপিংয়ের চেয়ে প্রায় 2 গুণ কম।
  • ফলস্বরূপ, অ্যারে ব্যবহার করে লুপিং ফোরচ ব্যবহার করে তালিকার লুপিংয়ের চেয়ে 5 গুণ কম (যা আমি বিশ্বাস করি, আমরা সবাই যা করি)।

129
তবে, কখনও ভুলে যাবেন না: "অকালীন অপটিমাইজেশন হ'ল সমস্ত মন্দের মূল"।
ওরং

18
@ হার্ডওয়্যারগুয়ে: আপনি যদি একবার জানতে পারেন যে প্রায় অনিবার্যভাবে দ্রুততর হয়, তবে কেন আপনি সাধারণভাবে এটি ব্যবহার শুরু করবেন না? এটি অতিরিক্ত সময় নেয় না।
ডেভিনিবি

46
@ ডিভাইনব, "ফর" ব্যবহার করা "ফরচ" ব্যবহারের চেয়ে আরও শক্ত, কারণ এতে কোড যুক্ত করা হয়, অন্য পরিবর্তনশীল, একটি শর্ত যা আপনার চেক করতে হবে ইত্যাদি। "ফোরচ" লুপটিতে আপনি কতবার বাইরের ত্রুটি দেখেছেন? ?
tster

35
@ হার্ডওয়্যারগুয়ে, আমাকে এই সোজা পেয়েছি কিনা তা দেখতে দিন। এটি foreachদিয়ে অ্যারের মাধ্যমে লুপ করার চেয়ে কোনও তালিকার সাথে লুপ করতে 5 গুণ বেশি সময় লাগে for, এবং আপনি সেই তুচ্ছ কথা বলছেন? এই জাতীয় পারফরম্যান্সের পার্থক্য আপনার অ্যাপ্লিকেশনের জন্য গুরুত্বপূর্ণ হতে পারে এবং এটি নাও পারে তবে আমি কেবল এটিকে হাতছাড়া করব না।
রবার্ট হার্ভে

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

164

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

using System;
using System.Diagnostics;
using System.Linq;

class Test
{
    const int Size = 1000000;
    const int Iterations = 10000;

    static void Main()
    {
        double[] data = new double[Size];
        Random rng = new Random();
        for (int i=0; i < data.Length; i++)
        {
            data[i] = rng.NextDouble();
        }

        double correctSum = data.Sum();

        Stopwatch sw = Stopwatch.StartNew();
        for (int i=0; i < Iterations; i++)
        {
            double sum = 0;
            for (int j=0; j < data.Length; j++)
            {
                sum += data[j];
            }
            if (Math.Abs(sum-correctSum) > 0.1)
            {
                Console.WriteLine("Summation failed");
                return;
            }
        }
        sw.Stop();
        Console.WriteLine("For loop: {0}", sw.ElapsedMilliseconds);

        sw = Stopwatch.StartNew();
        for (int i=0; i < Iterations; i++)
        {
            double sum = 0;
            foreach (double d in data)
            {
                sum += d;
            }
            if (Math.Abs(sum-correctSum) > 0.1)
            {
                Console.WriteLine("Summation failed");
                return;
            }
        }
        sw.Stop();
        Console.WriteLine("Foreach loop: {0}", sw.ElapsedMilliseconds);
    }
}

ফলাফল:

For loop: 16638
Foreach loop: 16529

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


"উপরের তালিকাটিকে <ডাবল> এ অ্যারে পরিবর্তন করুন, এবং আপনি মূলত বিভিন্ন ফলাফল পাবেন" খুব আকর্ষণীয়, আমি সে সম্পর্কে ভেবে
দেখিনি

5
আমার পরীক্ষাগুলি এবং অন্যান্য ব্যক্তির মানদণ্ডের মধ্যে ফলাফলের মধ্যে বিস্ময়কর পার্থক্য দেখে আমি মনে করি এটি একটি ব্লগ পোস্টের যোগ্যতা অর্জন করবে ...
জন স্কিটি

1
আপনি প্রায় সবসময় অ্যারে এবং এর মধ্যে কোনটি পছন্দ করেন List<T>? পাঠযোগ্যতা ট্রাম্প কি সেই ক্ষেত্রে মাইক্রো-অপ্টিমাইজেশন?
জনবি

12
@ জনবি: হ্যাঁ - আমি প্রায় সবসময় List<T>অ্যারের চেয়ে বেশি পছন্দ করি । ব্যতিক্রমগুলি char[]এবং byte[]যেগুলি প্রায়শই সাধারণ সংগ্রহের চেয়ে ডেটার "অংশ" হিসাবে বিবেচিত হয়।
জন স্কিটি

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

162

foreachলুপ চেয়ে বেশি নির্দিষ্ট অভিপ্রায় প্রকট forলুপ

একটি foreachলুপ ব্যবহার করে যে কেউ আপনার কোড ব্যবহার করে তা প্রমাণ করে যে আপনি সংগ্রহের কোনও স্থান নির্বিশেষে সংগ্রহের প্রতিটি সদস্যকে কিছু করার পরিকল্পনা করছেন। এটিও দেখায় যে আপনি মূল সংগ্রহটি সংশোধন করছেন না (এবং আপনি চেষ্টা করলে একটি ব্যতিক্রম নিক্ষেপ করেন)।

এর অন্য সুবিধাটি foreachহ'ল এটি যে কোনও ক্ষেত্রেই কাজ করে IEnumerable, যেখানে forকেবলমাত্র তা বোঝায় IList, যেখানে প্রতিটি উপাদানের আসলে সূচক থাকে।

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

আমি যতটা সচেতন সেখানে কোনও উল্লেখযোগ্য পারফরম্যান্সের প্রভাব নেই। ভবিষ্যতে কোনও পর্যায়ে foreachএকাধিক কোর ব্যবহার করে কোড মানিয়ে নেওয়া আরও সহজ হতে পারে তবে এটি এখনই চিন্তার কিছু নয়।


23
সিটিফোর্ড: না, তা নয়। সংকলক অবশ্যই উপাদানগুলিকে পুনঃক্রম করতে পারে না foreachforeachফাংশনাল প্রোগ্রামিং সম্পর্কিত মোটেই সম্পর্কিত নয়। এটি প্রোগ্রামিংয়ের সম্পূর্ণ অপরিহার্য দৃষ্টান্ত। আপনি টিপিএল এবং পিএলএনকিউ-তে ঘটে যাওয়া জিনিসগুলিকে ভুল-গুণায়িত করছেন foreach
মেহরদাদ আফশারি

13
@ ব্লুট্রিন: এটি অবশ্যই গ্যারান্টির অর্ডার দেয় (সি # স্পেস বিভাগ 8.8.4 আনুষ্ঠানিকভাবে foreachএকটি whileলুপের সমতুল্য হিসাবে সংজ্ঞায়িত করে )। আমি মনে করি আমি জানি @ctford উল্লেখ করছে। কার্য সমান্তরাল গ্রন্থাগারটি অন্তর্নিহিত সংগ্রহকে একটি স্বেচ্ছাসেবী ক্রমে উপাদান সরবরাহ করতে দেয় ( .AsParallelএকটি গণ্যমানকে কল করে)। foreachএখানে কিছু করে না এবং লুপটির বডি একক থ্রেডে কার্যকর করা হয় । সমান্তরাল একমাত্র জিনিসটি ক্রমটির প্রজন্ম।
মেহরদাদ আফশারি

6
অনুমিতযোগ্য eসিলেক্টের একটি ওভারলোড রয়েছে যা আপনাকে আইটেমের সূচক পেতে দেয়, সুতরাং এমনকি কোনও সূচকের প্রয়োজনীয়তাও এর জন্য ব্যবহারের আদেশ দেয় না। দেখুন msdn.microsoft.com/en-us/library/bb534869.aspx
TrueWill

5
পাঠ্যযোগ্যতা এবং টাইপিং সংরক্ষণের জন্য ফরচ প্রতিটি সুবিধাজনক। ব্যয়গুলি গুরুত্বপূর্ণ, যদিও; আমি তৈরি করা একটি ডকুমেন্ট ডিজাইনার ইউআই-তে 2 বা 3-এর জন্য লুপগুলি পরিবর্তন করে (প্রতিটি তালিকার প্রতিটি আপত্তি অনুসারে) থেকে (i = 0 এর জন্য list.count-1) প্রতি সম্পাদনার সময়টি সম্পাদনা প্রতি 2-3 সেকেন্ড থেকে প্রায় হ্রাস করে। একটি ছোট দস্তাবেজে সম্পাদনা প্রতি 5 সেকেন্ডে কয়েকশো বস্তুর মধ্যে লুপিং। এখন এমনকি বিশাল নথিগুলির জন্য, সমস্ত লুপ করার সময় বাড়েনি। এটি কীভাবে হয়েছিল তা আমার কোনও ধারণা নেই। আমি যা জানি তা হ'ল বিকল্পটি কেবলমাত্র বস্তুর একটি সাবসেট লুপ করার জন্য একটি জটিল পরিকল্পনা ছিল। আমি যে কোনও দিন 5 মিনিটের পরিবর্তন নেব! - না মাইক্রো- অপ্টিমাইজেশান।
ফাস্টআল

5
@ ফস্টএল সাধারণ তালিকার জন্য পারফরম্যান্স foreachএবং forপারফরম্যান্স হ'ল কয়েক মিলিয়ন আইটেমের পুনরাবৃত্তির জন্য একটি সেকেন্ডের ভগ্নাংশ, যাতে আপনার সমস্যাটি অবশ্যই ভবিষ্যতের দক্ষতার সাথে সরাসরি সম্পর্কিত ছিল না, কমপক্ষে কয়েকশ বস্তুর জন্য নয়। আপনি যে তালিকা ব্যবহার করছেন তা ভাঙ্গা গণকের প্রয়োগের মত শোনাচ্ছে।
মাইক মেরিনোভস্কি

53

পারফরম্যান্স নিয়ে যে কোনও সময় তর্ক রয়েছে, আপনার কেবল একটি ছোট্ট পরীক্ষা লিখতে হবে যাতে আপনি আপনার ক্ষেত্রে সমর্থন করার জন্য পরিমাণগত ফলাফল ব্যবহার করতে পারেন।

স্টপওয়াচ ক্লাসটি ব্যবহার করুন এবং নির্ভুলতার জন্য কয়েক মিলিয়ন বার কিছু পুনরাবৃত্তি করুন। (এটি লুপ ছাড়াই কঠিন হতে পারে):

using System.Diagnostics;
//...
Stopwatch sw = new Stopwatch()
sw.Start()
for(int i = 0; i < 1000000;i ++)
{
    //do whatever it is you need to time
}
sw.Stop();
//print out sw.ElapsedMilliseconds

আঙ্গুলগুলি এই শোটির ফলাফলগুলি অতিক্রম করেছে যে পার্থক্যটি নগণ্য, এবং আপনি কেবলমাত্র সর্বাধিক রক্ষণাবেক্ষণযোগ্য কোডের ফলাফল যা করতে পারেন


13
তবে আপনি জন্য এবং foreach এর পারফরম্যান্স তুলনা করতে পারবেন না। এগুলি বিভিন্ন পরিস্থিতিতে ব্যবহারের কথা রয়েছে।
মাইকেল ক্রেলিন -

7
মাইকেল আমি আপনার সাথে একমত, পারফরম্যান্সের ভিত্তিতে কোনটি ব্যবহার করা উচিত তা আপনার চয়ন করা উচিত নয় - আপনার উচিত এমন একটিটি বেছে নেওয়া উচিত যা সর্বাধিক অর্থপূর্ণ হয়! তবে যদি আপনার বস বলেন "এটি পূর্বাভাসের চেয়ে ধীর কারণ এটি ব্যবহার করবেন না" তবে তাকে বোঝানোর একমাত্র উপায় এটি হ'ল পার্থক্য নগণ্য
রব ফনসেকা-এনসোর

"(এটি লুপের জন্য ছাড়াই কঠিন হতে পারে)" অথবা আপনি কিছুক্ষণ লুপ ব্যবহার করতে পারেন।
jonescb

49

এটি সর্বদা কাছাকাছি থাকবে। একটি অ্যারের জন্য, কখনও কখনও for সামান্য দ্রুততর, কিন্তু foreachআরো ভাবপূর্ণ, এবং অফার LINQ, ইত্যাদি সাধারণ, সঙ্গে লাঠি সালে foreach

অতিরিক্তভাবে, foreachকিছু পরিস্থিতিতে অনুকূলিত হতে পারে। উদাহরণস্বরূপ, একটি লিঙ্কযুক্ত তালিকা সূচক দ্বারা ভয়ানক হতে পারে, তবে এটি দ্রুত হতে পারে foreach। প্রকৃতপক্ষে, মানটি LinkedList<T>এই কারণে কোনও সূচকও সরবরাহ করে না।


সুতরাং আপনি কি বলছেন LinkedList<T>যে তুলনায় ঝোঁক List<T>? এবং যদি আমি সবসময় foreach(পরিবর্তে for) ব্যবহার করতে যাচ্ছি তবে আমি কি আরও ভাল ব্যবহার করব LinkedList<T>?
জনবি

2
@ জনবিবি - ঝুঁকিপূর্ণ নয়; একটু ভিন্ন. উদাহরণস্বরূপ, লিঙ্কযুক্ত তালিকার প্রতিটি নোডের অতিরিক্ত রেফারেন্স রয়েছে যা ফ্ল্যাট অ্যারের জন্য প্রয়োজন হয় না (যা আন্ডারপিনগুলিও রয়েছে List<T>)। এটা যে এটি সস্তা বেশি সন্নিবেশ / অপসারণ
মার্ক গ্র্যাভেল

36

আমার অনুমান যে এটি সম্ভবত 99% ক্ষেত্রে তাত্পর্যপূর্ণ হবে না, তবে আপনি কেন সবচেয়ে উপযুক্ত (বুঝতে সহজ / বজায় রাখা সহজ হিসাবে) এর পরিবর্তে দ্রুত চয়ন করবেন?


6
@ ক্লিও, আপনি যদি আপনার কোডটি প্রকৃতপক্ষে প্রোফাইল করেন তবে আপনার অনুমান করতে হবে না যে কোনটি 20% যত দ্রুত সম্ভব হওয়া দরকার। আপনি সম্ভবত এটিও জানতে পারেন যে দ্রুত হওয়া দরকার এমন লুপগুলির প্রকৃত সংখ্যা অনেক কম। তদুপরি, আপনি কি সত্যিই বলছেন যে লুপিংয়ের কাজটি যেখানে আপনি আপনার সময়টি ব্যয় করেছেন, সেই লুপটিতে আপনি যা করছেন তার বিপরীতে?
টিস্টার

32

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

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


32

লুপের উপরে লুপ পছন্দ করার জন্য খুব ভাল কারণ রয়েছে । আপনি যদি একটি লুপ ব্যবহার করতে পারেন তবে আপনার বস আপনার ঠিক করা উচিত।foreachforforeach

যাইহোক, প্রতিটি পুনরাবৃত্তি কেবল একের পর এক ক্রমের তালিকায় চলে না। যদি তিনি এর জন্য নিষেধ করছেন তবে হ্যাঁ এটি ভুল।

আমি যদি আপনি হতাম তবে আমি যা করতাম তা হ'ল আপনার সমস্ত প্রাকৃতিক লুপকে পুনরাবৃত্তিতে রূপান্তরিত করা । এটি তাকে শেখাত এবং এটি আপনার জন্য একটি ভাল মানসিক মহড়াও।


পুনরুক্তি কীভাবে forলুপ এবং foreachলুপের কর্মক্ষমতা অনুসারে তুলনা করে ?
জনবি

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

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

18

টেকএড 2005-এ জেফ্রি রিখরটার:

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

অন-ডিমান্ড ওয়েবকাস্ট: http://msevents.microsoft.com/CUI/WebCastEventDetails.aspx?EventID=1032292286&EventCategory=3&c فرهن=en-US&CountryCode=US


12

এটি হাস্যকর। লুপ, পারফরম্যান্স-ভিত্তিক বা অন্যান্য নিষিদ্ধ করার কোনও বাধ্যতামূলক কারণ নেই।

পারফরম্যান্সের মানদণ্ড এবং অন্যান্য যুক্তিগুলির জন্য জন স্কিটির ব্লগ দেখুন ।


2
আপডেট হওয়া লিংক: কোডব্লগ.জোনস্কিট.উক
ম্যাট

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

11

আপনি যখন বস্তুর সংগ্রহের সাথে কাজ করেন সে ক্ষেত্রে আরও foreachভাল তবে আপনি যদি একটি সংখ্যা বাড়ান তবে একটি forলুপ আরও ভাল।

নোট করুন যে শেষ ক্ষেত্রে আপনি এমন কিছু করতে পারেন:

foreach (int i in Enumerable.Range(1, 10))...

তবে এটি অবশ্যই আরও ভাল পারফর্ম করে না, এটির তুলনায় এটির আরও খারাপ পারফরম্যান্স রয়েছে for


"আরও ভাল" বিতর্কযোগ্য: এটি ধীর গতির এবং ডিএনএসপি ডিবাগারটি সি # পূর্বাভাসে প্রবেশ করবে না (যদিও ভিএস2017 ডিবাগার হবে)। কখনও কখনও আরও পঠনযোগ্য তবে আপনি ভাষাগুলি সমর্থন না করে বিরক্তিকর হতে পারেন।
জেক 2

10

এটি আপনাকে বাঁচাতে হবে:

public IEnumerator<int> For(int start, int end, int step) {
    int n = start;
    while (n <= end) {
        yield n;
        n += step;
    }
}

ব্যবহার করুন:

foreach (int n in For(1, 200, 4)) {
    Console.WriteLine(n);
}

বৃহত্তর জয়ের জন্য, আপনি প্যারামিটার হিসাবে তিনটি প্রতিনিধি নিতে পারেন।


1
একটি ছোট পার্থক্য হ'ল একটি forলুপ সাধারণত পরিসীমা (যেমন 0 <= i < 10) এর শেষে বাদ দিতে লেখা হয় । Parallel.Forএটি একটি সাধারণ forলুপের সাথে সহজেই বিনিময়যোগ্য রাখতে এটি করে does
গ্রো

9

আপনি ডিপ। নেট - ভাগ - 1 অংশে এটি সম্পর্কে পড়তে পারেন

এটি NET উত্স কোড থেকে বিচ্ছিন্ন হয়ে যাওয়ার সমস্ত পথে ফলাফল (প্রথম সূচনা ব্যতীত) কভার করে।

উদাহরণস্বরূপ - ফোরচ লুপের সাথে অ্যারে আইট্রেশন: এখানে চিত্র বর্ণনা লিখুন

এবং - ফোরচ লুপের সাথে তালিকা পুনরাবৃত্তি: এখানে চিত্র বর্ণনা লিখুন

এবং শেষ ফলাফল: এখানে চিত্র বর্ণনা লিখুন

এখানে চিত্র বর্ণনা লিখুন


8

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

এখনও অবধি যা বলা হয়নি তা হ'ল যখন কোনও foreachলুপ সংকলন করা হয়, এটি সংকলনের সাহায্যে এটি পুনরুক্তি করা সংগ্রহের ভিত্তিতে অনুকূলিত হয়। এর অর্থ হ'ল যখন কোন লুপটি ব্যবহার করবেন তা আপনি নিশ্চিত নন, আপনার foreachলুপটি ব্যবহার করা উচিত - এটি সংকলিত হয়ে গেলে এটি আপনার জন্য সেরা লুপ তৈরি করবে। এটিও বেশি পঠনযোগ্য।

foreachলুপের সাথে আর একটি মূল সুবিধা হ'ল যদি আপনার সংগ্রহ বাস্তবায়ন পরিবর্তন হয় ( উদাহরণস্বরূপ কোনও অন্তর্দৃষ্টি arrayথেকে List<int>) তবে আপনার foreachলুপের কোনও কোড পরিবর্তনের প্রয়োজন হবে না:

foreach (int i in myCollection)

আপনার সংগ্রহটি কী ধরণের তা বিবেচনা করে উপরেরটি একই রকম, যদিও আপনার forলুপে, আপনি একটি myCollectionথেকে একটিতে পরিবর্তিত হলে নিম্নলিখিতটি তৈরি করবে না :arrayList

for (int i = 0; i < myCollection.Length, i++)

7

"লুপের জন্য এটি গ্রহণযোগ্য কিনা তা বোঝাতে আমাকে সাহায্য করতে কোনও যুক্তি কি আমি ব্যবহার করতে পারি?"

না, যদি আপনার বস আপনাকে প্রোগ্রামিংয়ের ভাষাটি কী ব্যবহার করতে বলে তা নির্ধারণের পর্যায়ে মাইক্রো ম্যানেজ করে তবে আপনি যা বলতে পারেন তা আসলে কিছুই নেই। দুঃখিত।


7

এটি সম্ভবত আপনি যে ধরণের সংগ্রহ করছেন তা এবং এর সূচকটি প্রয়োগ করার উপর নির্ভর করে। যদিও সাধারণত, ব্যবহার foreachকরা আরও ভাল পদ্ধতির হতে পারে।

এছাড়াও, এটি যে IEnumerableকোনওর সাথে কাজ করবে - কেবল সূচকগুলির সাথে জিনিস নয়।


7

এটি বেশিরভাগ "যা দ্রুত" প্রশ্নগুলির মতো একই দুটি উত্তর রয়েছে:

1) আপনি যদি পরিমাপ না করেন তবে আপনি জানেন না।

2) (কারণ ...) এটি নির্ভর করে।

"মুভনেক্সট ()" পদ্ধতিটি কত ব্যয়বহুল, তার তুলনায় "এই [ইনটেক্স ইনডেক্স]" পদ্ধতিটি যে ব্যয়বহুল তা নির্ভর করে, আপনি যে ধরণের পুনরুক্তি করতে পারবেন সেই ধরণের (বা প্রকারের) জন্য depends

"ফরচ" কীওয়ার্ডটি ধারাবাহিক ক্রিয়াকলাপের জন্য শর্টহ্যান্ড - এটি আইটেমারেবলের জন্য একবার getEnumerator () কল করে, এটি পুনরুক্তি প্রতি একবার মুভনেক্সট () কল করে, এটি কিছু প্রকারের চেকিং করে on পারফরম্যান্স পরিমাপের উপর প্রভাব ফেলতে পারে এমন জিনিস হ'ল মুভনেক্সট () এর ব্যয় যেহেতু ও (এন) বার চাওয়া হয়। সম্ভবত এটি সস্তা, তবে সম্ভবত এটি তা নয়।

"ফর" কীওয়ার্ডটি আরও অনুমানযোগ্য মনে হয় তবে বেশিরভাগ ভিতরে "লুপ" এর মধ্যে আপনি "সংগ্রহ [সূচি]" এর মতো কিছু পাবেন। এটি একটি সাধারণ অ্যারে সূচক অপারেশনের মতো দেখায়, তবে এটি আসলে একটি পদ্ধতি কল whose যার মূল্য সম্পূর্ণরূপে সংগ্রহের প্রকৃতির উপর নির্ভর করে যা আপনি পুনরাবৃত্তি করছেন। সম্ভবত এটি সস্তা, তবে সম্ভবত এটি তা নয়।

যদি সংগ্রহটির অন্তর্নিহিত কাঠামোটি মূলত একটি লিঙ্কযুক্ত তালিকা হয় তবে মুভনেেক্সট ময়লা-সস্তা, তবে সূচকটির ও (এন) ব্যয় হতে পারে, যা "ফর" লুপ ও (এন * এন) এর সত্যিকারের ব্যয় করে।


6

প্রতিটি ভাষা নির্মানের ব্যবহারের জন্য উপযুক্ত সময় এবং স্থান রয়েছে। সি # ভাষার একটি পৃথক চারটি পুনরাবৃত্তি বিবৃতি রয়েছে - এর প্রতিটি কারণ নির্দিষ্ট উদ্দেশ্যে রয়েছে এবং এর যথাযথ ব্যবহার রয়েছে।

আমি আপনার বসের সাথে বসে পরামর্শ দিয়ে পরামর্শ দিচ্ছি যে লুপটির কেন forউদ্দেশ্য রয়েছে to এমন সময় আছে যখন একটি forপুনরাবৃত্তি ব্লক একটি foreachপুনরাবৃত্তির চেয়ে অ্যালগরিদমকে আরও স্পষ্টভাবে বর্ণনা করে । যখন এটি সত্য হয়, সেগুলি ব্যবহার করা উপযুক্ত।

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

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


5

লুপের ভিতরে আপনি যা করেন যা পারফোমেন্সকে প্রভাবিত করে, আসল লুপিংটি নির্মাণ করে না (আপনার কেসটি অ-তুচ্ছ মনে করে)।


5

কিনা forচেয়ে দ্রুত foreachপয়েন্ট ছাড়াও সত্যিই হয়। আমি গুরুতরভাবে সন্দেহ করি যে একে অপরের থেকে একটি বেছে নেওয়া আপনার অভিনয়তে গুরুত্বপূর্ণ প্রভাব ফেলবে a

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

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


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

2
forতুলনায় সামান্য দ্রুত foreach। আমি এই বক্তব্যটি গুরুত্ব সহকারে আপত্তি করব। এটি সম্পূর্ণ অন্তর্নিহিত সংগ্রহের উপর নির্ভর করে। যদি কোনও লিঙ্কযুক্ত তালিকাগুলি একটি পূর্ণসংখ্যা পরামিতি সহ কোনও সূচক সরবরাহ করে তবে আমি আশা করব যে forএটিতে লুপটি O (n ^ 2) foreachহবে এবং ও (এন) হবে।
মেহরদাদ আফশারি

@ মেরহাদাদ: আসলে এটি একটি ভাল বিষয়। আমি কেবল একটি তালিকা সূচকের নিয়মিত কেস (অর্থাত্ অ্যারে) সম্পর্কে ভাবছিলাম। আমি প্রতিফলিত করতে হবে। ধন্যবাদ।
ব্রায়ান রাসমুসেন

@Mehrdad Afshari: পূর্ণসংখ্যা দ্বারা একটি সংগ্রহ ইন্ডেক্স হতে পারে অনেক ধীর এটি উপর enumerating হয়। তবে আপনি আসলে ব্যবহার করে for এবংforeach নিজেই ব্যবহার করে একটি সূচক দেখার জন্য তুলনা করছেন । আমি মনে করি @ ব্রায়ান রাসমুসেনের উত্তরটি সঠিক যে, সংগ্রহের সাথে যেকোন ব্যবহার বাদ দিয়ে forসর্বদা তুলনায় কিছুটা দ্রুত হবে foreach। তবে forপ্লাস সংগ্রহের অনুসন্ধানটি সর্বদা foreachনিজে থেকে ধীর হবে ।
ড্যানিয়েল প্রাইডেন

@ ড্যানিয়েল: হয় আপনার একটি সরল অ্যারে রয়েছে, যার জন্য উভয়ই অভিন্ন কোড উত্পন্ন করবে, অথবা আপনি forবিবৃতি ব্যবহার করার সময় কোনও সূচক জড়িত থাকবে । forএকটি পূর্ণসংখ্যা নিয়ন্ত্রণ ভেরিয়েবল সহ সমতল লুপটি তুলনীয় নয় foreach, সুতরাং এটি বাইরে। আমি বুঝি @ ব্রায়ান এর অর্থ কী এবং আপনি যেমন বলেছেন ঠিক তেমন তবে উত্তরটি বিভ্রান্তিকর হতে পারে। পুনরায়: আপনার শেষ পয়েন্ট: না, আসলে, forওভারটি List<T>এখনও তার চেয়ে দ্রুত foreach
মেহরদাদ আফশারি

4

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


সংকলক অ্যারে / আইলিস্ট ইত্যাদিতে ব্যবহৃত ফোরচ লুপগুলি সনাক্ত করে এবং এগুলিকে লুপের জন্য পরিবর্তন করে।
কলম রজার্স

3
তাকে অনির্বচনীয় প্রমাণের লাইনগুলি দেখান যে এটি ঠিক আছে এবং তার প্রমাণটি জিজ্ঞাসা করুন যে এটি ঠিক নয়।
সিজেকে

3

কারণ প্রয়োগের জন্য আরও সহজ যুক্তিযুক্ত তাই এটি পূর্বাভাসের চেয়ে দ্রুততর।


3

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

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



3

বেশিরভাগ ক্ষেত্রেই আসলে কোনও পার্থক্য নেই।

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

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


3

লুপের মতো কোনও কিছুর ব্যবহার সম্পূর্ণভাবে নিষিদ্ধ করা কিছুটা অদ্ভুত বলে মনে হয়।

সেখানে একটি আকর্ষণীয় নিবন্ধ এর এখানে যে দুটি loops মধ্যে কর্মক্ষমতা পার্থক্য অনেক জুড়ে।

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


প্রয়োজনীয় উদ্ধৃতিটি আপনার নিবন্ধটি লিঙ্ক করে: "... আপনি যদি উচ্চ সম্পাদন কোডটি সংগ্রহের জন্য নয়, লুপের জন্য ব্যবহার করার পরিকল্পনা করছেন তবে সংগ্রহের ক্ষেত্রেও, ভবিষ্যদ্বাণী ব্যবহারের সময় কার্যকর দেখাতে পারে তবে এটি দক্ষ নয় efficient"
নিকফিটস

3

আমি foreachলুপটি খুঁজে পেয়েছি যা একটি List দ্রুত দিয়ে পুনরাবৃত্তি করে । নীচে আমার পরীক্ষার ফলাফল দেখুন। নীচের কোডটিতে আমি সময়টি পরিমাপ করার জন্য arrayআলাদাভাবে 100 এবং 100000 আকারের পুনরাবৃত্তি করি forএবং foreachলুপ করি।

এখানে চিত্র বর্ণনা লিখুন

private static void MeasureTime()
    {
        var array = new int[10000];
        var list = array.ToList();
        Console.WriteLine("Array size: {0}", array.Length);

        Console.WriteLine("Array For loop ......");
        var stopWatch = Stopwatch.StartNew();
        for (int i = 0; i < array.Length; i++)
        {
            Thread.Sleep(1);
        }
        stopWatch.Stop();
        Console.WriteLine("Time take to run the for loop is {0} millisecond", stopWatch.ElapsedMilliseconds);

        Console.WriteLine(" ");
        Console.WriteLine("Array Foreach loop ......");
        var stopWatch1 = Stopwatch.StartNew();
        foreach (var item in array)
        {
            Thread.Sleep(1);
        }
        stopWatch1.Stop();
        Console.WriteLine("Time take to run the foreach loop is {0} millisecond", stopWatch1.ElapsedMilliseconds);

        Console.WriteLine(" ");
        Console.WriteLine("List For loop ......");
        var stopWatch2 = Stopwatch.StartNew();
        for (int i = 0; i < list.Count; i++)
        {
            Thread.Sleep(1);
        }
        stopWatch2.Stop();
        Console.WriteLine("Time take to run the for loop is {0} millisecond", stopWatch2.ElapsedMilliseconds);

        Console.WriteLine(" ");
        Console.WriteLine("List Foreach loop ......");
        var stopWatch3 = Stopwatch.StartNew();
        foreach (var item in list)
        {
            Thread.Sleep(1);
        }
        stopWatch3.Stop();
        Console.WriteLine("Time take to run the foreach loop is {0} millisecond", stopWatch3.ElapsedMilliseconds);
    }

আপডেট

@ জগাফফিনের পরামর্শের পরে আমি @ জোন্সকিট কোড ব্যবহার করেছি এবং দেখতে পেয়েছি যে forলুপটি arrayনীচের চেয়ে দ্রুততর,

  • অ্যারে সহ ফরচ লুপ
  • তালিকা সহ লুপের জন্য।
  • তালিকার সাথে ফোরচ লুপ।

আমার পরীক্ষার ফলাফল এবং কোড নীচে দেখুন,

এখানে চিত্র বর্ণনা লিখুন

private static void MeasureNewTime()
    {
        var data = new double[Size];
        var rng = new Random();
        for (int i = 0; i < data.Length; i++)
        {
            data[i] = rng.NextDouble();
        }
        Console.WriteLine("Lenght of array: {0}", data.Length);
        Console.WriteLine("No. of iteration: {0}", Iterations);
        Console.WriteLine(" ");
        double correctSum = data.Sum();

        Stopwatch sw = Stopwatch.StartNew();
        for (int i = 0; i < Iterations; i++)
        {
            double sum = 0;
            for (int j = 0; j < data.Length; j++)
            {
                sum += data[j];
            }
            if (Math.Abs(sum - correctSum) > 0.1)
            {
                Console.WriteLine("Summation failed");
                return;
            }
        }
        sw.Stop();
        Console.WriteLine("For loop with Array: {0}", sw.ElapsedMilliseconds);

        sw = Stopwatch.StartNew();
        for (var i = 0; i < Iterations; i++)
        {
            double sum = 0;
            foreach (double d in data)
            {
                sum += d;
            }
            if (Math.Abs(sum - correctSum) > 0.1)
            {
                Console.WriteLine("Summation failed");
                return;
            }
        }
        sw.Stop();
        Console.WriteLine("Foreach loop with Array: {0}", sw.ElapsedMilliseconds);
        Console.WriteLine(" ");

        var dataList = data.ToList();
        sw = Stopwatch.StartNew();
        for (int i = 0; i < Iterations; i++)
        {
            double sum = 0;
            for (int j = 0; j < dataList.Count; j++)
            {
                sum += data[j];
            }
            if (Math.Abs(sum - correctSum) > 0.1)
            {
                Console.WriteLine("Summation failed");
                return;
            }
        }
        sw.Stop();
        Console.WriteLine("For loop with List: {0}", sw.ElapsedMilliseconds);

        sw = Stopwatch.StartNew();
        for (int i = 0; i < Iterations; i++)
        {
            double sum = 0;
            foreach (double d in dataList)
            {
                sum += d;
            }
            if (Math.Abs(sum - correctSum) > 0.1)
            {
                Console.WriteLine("Summation failed");
                return;
            }
        }
        sw.Stop();
        Console.WriteLine("Foreach loop with List: {0}", sw.ElapsedMilliseconds);
    }

3
এটি খুব খারাপ পরীক্ষা is ক) একটি চূড়ান্ত উত্তর পেতে আপনি খুব কম পুনরাবৃত্তি করেন খ) যে থ্রেড leep ঘুম আসলেই এক মিলিসেকেন্ড অপেক্ষা করবে না। জন্ স্কিট তার উত্তরে যে পদ্ধতিটি করেছিলেন তা ব্যবহার করুন।
jgauffin

1
99.99% সময় অবশ্যই থ্রেডে ব্যয় করে leep লুপিং খুব দ্রুত এবং ঘুম খুব ধীর, আপনি আগেরটিকে পরীক্ষার জন্য পরে ব্যবহার করবেন না।
রোনান থাইবাডাউ

3

আপনি সত্যিই তার মাথা দিয়ে স্ক্রু করতে পারেন এবং একটি আইকিউয়ারেবলের জন্য যেতে পারেন। পরিবর্তে এই বন্ধ করার জন্য:

myList.ForEach(c => Console.WriteLine(c.ToString());

3
আমি আপনার কোডের লাইনটি প্রতিস্থাপন করব myList.ForEach(Console.WriteLine)
মেহরদাদ আফশারি

2

আমি দুজনের মধ্যে কোনও "বিশাল" পারফরম্যান্সের পার্থক্য খুঁজে পাবে বলে আমি আশা করব না।

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

অবশ্যই এই উত্তরটি সংকলকটি প্রয়োগ করতে পারে এমন কোনও অপ্টিমাইজেশনের জন্য অ্যাকাউন্ট করে না।


সি # সংকলক খুব কম অপ্টিমাইজেশন করে, এটি সত্যিই এটি জেআইটারের উপরে ছেড়ে যায়।
ljs

ঠিক আছে, জিটটারটি একটি সংকলক ... ঠিক আছে?
জোহানেস

2

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


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