কোন পদ্ধতিটি আরও ভাল সম্পাদন করে?


576

মধ্যে System.Linqনামস্থান, আমরা এখন আমাদের প্রসারিত করতে পারেন IEnumerable এর আছে কোন () এবং গণনা () এক্সটেনশন পদ্ধতি

আমাকে সম্প্রতি বলা হয়েছিল যে আমি যদি কোনও সংগ্রহের ভিতরে 1 বা ততোধিক আইটেম রয়েছে তা পরীক্ষা করতে চাই, তবে .Any()এক্সটেনশন পদ্ধতির পরিবর্তে আমার এক্সটেনশন পদ্ধতিটি ব্যবহার করা উচিত .Count() > 0কারণ .Count()এক্সটেনশন পদ্ধতিটি সমস্ত আইটেমের মাধ্যমে পুনরাবৃত্তি করতে হয়।

দ্বিতীয়ত, কিছু সংগ্রহ একটি আছে সম্পত্তি (না একটি এক্সটেনশন পদ্ধতি) যে Countবা Length। এর পরিবর্তে .Any()বা সেগুলি ব্যবহার করা কি ভাল হবে .Count()?

হ্যাঁ / না?


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

উত্তর:


708

আপনি কিছু একটা আছে যা দিয়ে শুরু হয় .Lengthবা .Count(যেমন ICollection<T>, IList<T>, List<T>, ইত্যাদি) - তারপর এই দ্রুততম বিকল্প হবে যেহেতু এটি মধ্য দিয়ে যেতে হবে না GetEnumerator()/ MoveNext()/ Dispose()ক্রম দ্বারা প্রয়োজন Any()একটি খালি জন্য চেক করতে IEnumerable<T>ক্রম ।

ঠিক IEnumerable<T>, তাহলে Any()হবে সাধারণত , দ্রুততর হতে যেমন শুধুমাত্র একটি পুনরাবৃত্তির তাকান হয়েছে। তবে নোট করুন যে লিনকু-টু-অবজেক্টগুলির বাস্তবায়ন ( অপ্টিমাইজেশন হিসাবে ব্যবহারের Count()জন্য ) যাচাই ICollection<T>করে .Count- তাই যদি আপনার অন্তর্নিহিত ডেটা উত্সটি সরাসরি তালিকা / সংগ্রহ হয় তবে বড় পার্থক্য হবে না। আমাকে জিজ্ঞাসা করবেন না কেন এটি অ-জেনেরিক ব্যবহার করে না ICollection...

অবশ্যই আপনি যদি লিনকিউ ব্যবহার করে থাকেন ইত্যাদি ইত্যাদি ফিল্টার করার জন্য Where, আপনার কাছে একটি পুনরুক্তি-ব্লক ভিত্তিক ক্রম থাকবে এবং সুতরাং এই ICollection<T>অপ্টিমাইজেশনটি অকেজো।

সাধারণভাবে IEnumerable<T>: লাঠি সাথে ;- Any()পি


9
মার্ক: আইকোলিকেশন <T> আসলে আইকোল্লেশন থেকে আসে না। আমিও অবাক হয়েছি, তবে রিফ্লেক্টর মিথ্যা বলেন না।
ব্রায়ান ওয়াটস

7
কোনও () প্রয়োগকরণ আইকোলিকেশন ইন্টারফেসের জন্য পরীক্ষা করে গণনা সম্পত্তি জন্য অনুসন্ধান করে না?
ডেরিগেল

313
আমি মনে করি বেশিরভাগ সময় কোনও () ব্যবহারের আরও একটি কারণ রয়েছে। এটি বিকাশকারীর সুনির্দিষ্ট অভিপ্রায়কে ইঙ্গিত দেয়। আপনি আইটেম সংখ্যা বুদ্ধিমান আগ্রহী না হয় তাহলে, কিন্তু শুধুমাত্র যদি কিছু হয়, তাহলে somecollection.Any () সহজ এবং somecollection.Count চেয়ে পরিষ্কার 0>
TJKjaer

13
@ হুত্তেলিহুত - আপনি কতজন বিকাশকারীকে জানেন যে কে জবাব দিয়ে সত্যই বিভ্রান্ত (somecollection.Count > 0)? লিনকিউ'র প্রচলনের আগে কি আমাদের সমস্ত কোড ছিল? কোন () পদ্ধতি বোঝা মুশকিল?
ক্রেগটিপি

25
@ জেএলআরিশ - আমি এখনও মনে করি যে someCollection.Count > 0এটি ঠিক ততটাই স্পষ্ট someCollection.Any()এবং বৃহত্তর পারফরম্যান্সের এবং লিনকিউ প্রয়োজন না হওয়ার অতিরিক্ত উপকার পেয়েছে। মঞ্জুর, এটি একটি খুব সহজ কেস এবং লিনকিউ অপারেটরগুলি ব্যবহার করে অন্যান্য কন্সট্রাক্টসগুলি বিকাশকারীদের সমতুল্য নন-লিনকিউ বিকল্পের তুলনায় আরও স্পষ্টতর ধারণা দেবে।
ক্রেগটিপি

65

দ্রষ্টব্য: সত্তা ফ্রেমওয়ার্ক 4 আসল হওয়ার সময় আমি এই উত্তরটি লিখেছিলাম। এই উত্তরটির বিন্দুটি ছিল তুচ্ছ .Any()বনাম .Count()পারফরম্যান্স পরীক্ষার দিকে যাওয়া। পয়েন্টটি ইঙ্গিত দেয় যে EF নিখুঁত থেকে অনেক দূরে। নবীনতর সংস্করণ আরও ভাল হয় ... কিন্তু আপনি কোড যে স্লো এর অংশ আছে এবং এটি সরাসরি TSQL সঙ্গে মতিন পরীক্ষা ব্যবহার করে এবং অনুমানের ওপর নির্ভর (যে বদলে কর্মক্ষমতা তুলনা যদি .Any()সর্বদা যতো তাড়াতাড়ি .Count() > 0)।


যদিও আমি বেশিরভাগ আপ-ভোট দেওয়া উত্তর এবং মন্তব্যের সাথে একমত হই - বিশেষত পয়েন্ট Anyসিগন্যালের বিকাশকারী অভিপ্রায়র চেয়ে ভাল Count() > 0- আমার এমন পরিস্থিতি হয়েছিল যার মধ্যে এসকিউএল সার্ভারের (এনটিটি ফ্রেমওয়ার্ক 4) পরিমাপের মাধ্যমে গণনা দ্রুততর হয়।

এখানে সেই নতুন Anyসময়সীমা ব্যতিক্রম (~ 200.000 রেকর্ডে) এর সাথে প্রশ্নটি রয়েছে :

con = db.Contacts.
    Where(a => a.CompanyId == companyId && a.ContactStatusId <= (int) Const.ContactStatusEnum.Reactivated
        && !a.NewsletterLogs.Any(b => b.NewsletterLogTypeId == (int) Const.NewsletterLogTypeEnum.Unsubscr)
    ).OrderBy(a => a.ContactId).
    Skip(position - 1).
    Take(1).FirstOrDefault();

Count মিলিসেকেন্ডের ক্ষেত্রে কার্যকর সংস্করণ:

con = db.Contacts.
    Where(a => a.CompanyId == companyId && a.ContactStatusId <= (int) Const.ContactStatusEnum.Reactivated
        && a.NewsletterLogs.Count(b => b.NewsletterLogTypeId == (int) Const.NewsletterLogTypeEnum.Unsubscr) == 0
    ).OrderBy(a => a.ContactId).
    Skip(position - 1).
    Take(1).FirstOrDefault();

উভয় লিনকুইগুলি কী সঠিক এসকিউএল উত্পাদন করে তা দেখার জন্য আমাকে একটি উপায় খুঁজে বের করতে হবে - তবে এটি স্পষ্টতই রয়েছে যে কিছু ক্ষেত্রে Countএবং এর Anyমধ্যে একটি বিশাল পারফরম্যান্স পার্থক্য রয়েছে এবং দুর্ভাগ্যক্রমে মনে হয় আপনি কেবলমাত্র Anyসব ক্ষেত্রেই আটকে থাকতে পারবেন না ।

সম্পাদনা: এখানে এসকিউএল উত্পন্ন হয়। সুন্দরীদের আপনি দেখতে পারেন হিসাবে;)

ANY:

নির্বাহী sp_executesql এন 'শীর্ষ শীর্ষ (1) 
[প্রকল্প 2]। [যোগাযোগ আইডি] এএস [যোগাযোগ আইডি], 
[প্রকল্প 2]। [কোম্পানীআইডি] এএস [কোম্পানীআইডি], 
[প্রকল্প 2]। [যোগাযোগের নাম] এএস [যোগাযোগ নাম], 
[প্রজেক্ট ২] [[পূর্ণ নাম] এএস [পূর্ণ নাম], 
[প্রজেক্ট ২] 
[প্রকল্প 2]। [তৈরি করা] এএস [তৈরি]
থেকে (নির্বাচন করুন [প্রকল্প ২]। [যোগাযোগ আইডি] এএস [পরিচিতি আইডি], [প্রকল্প ২]। [কোম্পানীআইডি] এএস [কোম্পানীআইডি], [প্রকল্প ২]। [যোগাযোগনাম] এএস [পরিচিতি নাম], [প্রজেক্ট ২]। [ফুলনাম] এএস [পূর্ণ নাম] , [প্রজেক্ট ২]। [যোগাযোগস্ট্যাটাসআইডি] এএস [যোগাযোগ স্ট্যাটাস আইডি], [প্রজেক্ট ২]। [তৈরি] এএস [সৃজিত], সারি_নম্বার () ওভার (অর্ডার দ্বারা [প্রজেক্ট ২]। [যোগাযোগ আইডি] এএসসি) এএস [সারি_ সংখ্যা]
    FROM (নির্বাচন করুন) 
        [এক্সটেন্ট 1]। [যোগাযোগ আইডি] এএস [যোগাযোগ আইডি], 
        [এক্সটেন্ট 1]। [কোম্পানীআইডি] এএস [কোম্পানীআইডি], 
        [এক্সটেন্ট 1]। [যোগাযোগের নাম] এএস [যোগাযোগ নাম], 
        [এক্সটেন্ট 1]। [পুরো নাম] এএস [পূর্ণ নাম], 
        [এক্সটেন্ট ১] 
        [এক্সটেন্ট 1]। [তৈরি] এএস [তৈরি]
        [ডিবিও] থেকে। [যোগাযোগ করুন] এএস [এক্সটেন্ট 1]
        যেখানে ([এক্সটেন্ট 1]। [কোম্পানীআইডি] = @ পি__লিঙ্ক__0) এবং এবং ([এক্সটেন্ট 1]। [যোগাযোগ স্ট্যাটাসআইড] <= 3) এবং (অস্তিত্ব নেই (নির্বাচন করুন 
            1 এএস [সি 1]
            থেকে [ডিবিও]। [নিউজলেটার লগ] এএস [এক্সটেন্ট 2]
            যেখানে ([এক্সটেন্ট 1]। [যোগাযোগ আইডি] = [এক্সটেন্ট 2]। [যোগাযোগ আইড]) এবং (6 = [এক্সটেন্ট 2]। [নিউজলেটার লগ টাইপআইডি])
        ))
    ) এএস [প্রকল্প 2]
) এএস [প্রকল্প 2]
যেখানে [প্রকল্প 2]। [সারি_সংখ্যা]> 99
অর্ডার [প্রজেক্ট 2]। [যোগাযোগ আইডি] এএসসি ', এন' @ পি__লিনিক__0 ইনট ', @ পি__লিংক__0 = 4

COUNT:

নির্বাহী sp_executesql এন 'শীর্ষ শীর্ষ (1) 
[প্রকল্প 2]। [যোগাযোগ আইডি] এএস [যোগাযোগ আইডি], 
[প্রকল্প 2]। [কোম্পানীআইডি] এএস [কোম্পানীআইডি], 
[প্রকল্প 2]। [যোগাযোগের নাম] এএস [যোগাযোগ নাম], 
[প্রজেক্ট ২] [[পূর্ণ নাম] এএস [পূর্ণ নাম], 
[প্রজেক্ট ২] 
[প্রকল্প 2]। [তৈরি করা] এএস [তৈরি]
থেকে (নির্বাচন করুন [প্রকল্প ২]। [যোগাযোগ আইডি] এএস [পরিচিতি আইডি], [প্রকল্প ২]। [কোম্পানীআইডি] এএস [কোম্পানীআইডি], [প্রকল্প ২]। [যোগাযোগনাম] এএস [পরিচিতি নাম], [প্রজেক্ট ২]। [ফুলনাম] এএস [পূর্ণ নাম] , [প্রজেক্ট ২]। [যোগাযোগস্ট্যাটাসআইডি] এএস [যোগাযোগ স্ট্যাটাস আইডি], [প্রজেক্ট ২]। [তৈরি] এএস [সৃজিত], সারি_নম্বার () ওভার (অর্ডার দ্বারা [প্রজেক্ট ২]। [যোগাযোগ আইডি] এএসসি) এএস [সারি_ সংখ্যা]
    FROM (নির্বাচন করুন) 
        [প্রজেক্ট 1]। [যোগাযোগ আইডি] এএস [যোগাযোগ আইডি], 
        [প্রজেক্ট 1]। [কোম্পানীআইডি] এএস [কোম্পানীআইডি], 
        [প্রজেক্ট 1]। [যোগাযোগের নাম] এএস [যোগাযোগ নাম], 
        [প্রজেক্ট 1]। [পুরো নাম] এএস [পুরো নাম], 
        [প্রজেক্ট 1]। [যোগাযোগস্ট্যাটাসআইডি] এএস [যোগাযোগ স্ট্যাটাস আইডি], 
        [প্রকল্প 1]। [তৈরি করা] এএস [তৈরি]
        FROM (নির্বাচন করুন) 
            [এক্সটেন্ট 1]। [যোগাযোগ আইডি] এএস [যোগাযোগ আইডি], 
            [এক্সটেন্ট 1]। [কোম্পানীআইডি] এএস [কোম্পানীআইডি], 
            [এক্সটেন্ট 1]। [যোগাযোগের নাম] এএস [যোগাযোগ নাম], 
            [এক্সটেন্ট 1]। [পুরো নাম] এএস [পূর্ণ নাম], 
            [এক্সটেন্ট ১] 
            [এক্সটেন্ট 1]। [তৈরি করা] এএস [তৈরি], 
            (নির্বাচন 
                COUNT (1) এএস [এ 1]
                থেকে [ডিবিও]। [নিউজলেটার লগ] এএস [এক্সটেন্ট 2]
                যেখানে ([এক্সটেন্ট 1]। [যোগাযোগ আইডি] = [এক্সটেন্ট 2]। [যোগাযোগ আইড]) এবং (6 = [এক্সটেন্ট 2]। [নিউজলেটার লগটাইপআইডি])) এএস [সি 1]
            [ডিবিও] থেকে। [যোগাযোগ করুন] এএস [এক্সটেন্ট 1]
        ) এএস [প্রকল্প 1]
        যেখানে ([প্রজেক্ট 1]। [কোম্পানীআইডি] = @ পি__লিন্ক__0) এবং ((প্রকল্প 1]
    ) এএস [প্রকল্প 2]
) এএস [প্রকল্প 2]
যেখানে [প্রকল্প 2]। [সারি_সংখ্যা]> 99
অর্ডার [প্রজেক্ট 2]। [যোগাযোগ আইডি] এএসসি ', এন' @ পি__লিনিক__0 ইনট ', @ পি__লিংক__0 = 4

বিশুদ্ধ বলে মনে হয় যেখানে উপস্থিতের সাথে গণনা গণনা করা এবং তারপরে গণনার সাথে == 0 করার চেয়ে খারাপ কাজ করে।

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


2
প্রতিটি দৃশ্যের জন্য প্রতিটি লিনক-কোয়েরি দ্বারা উত্পাদিত কিছু স্ক্যালের ক্যোয়ারী পরিকল্পনা দেখতে পছন্দ করবে Would
বিশুদ্ধ.ক্রোম

43
এসকিউএল-এর উপর ভিত্তি করে, আমি যা বলতে পারি তা হ'ল: উভয় প্রশ্নেরই ভয়ঙ্কর দেখাচ্ছে। আমি জানতাম যে আমি সাধারণত নিজের নিজস্ব টিএসকিউএল লেখার একটি কারণ ছিল ...
মার্ক গ্র্যাভেল

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

25

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

পরীক্ষার env: EF 6.1.3, এসকিউএল সার্ভার, 300 কে রেকর্ডস

সারণী মডেল :

class TestTable
{
    [Key]
    public int Id { get; set; }

    public string Name { get; set; }

    public string Surname { get; set; }
}

পরীক্ষার কোড:

class Program
{
    static void Main()
    {
        using (var context = new TestContext())
        {
            context.Database.Log = Console.WriteLine;

            context.TestTables.Where(x => x.Surname.Contains("Surname")).Any(x => x.Id > 1000);
            context.TestTables.Where(x => x.Surname.Contains("Surname") && x.Name.Contains("Name")).Any(x => x.Id > 1000);
            context.TestTables.Where(x => x.Surname.Contains("Surname")).Count(x => x.Id > 1000);
            context.TestTables.Where(x => x.Surname.Contains("Surname") && x.Name.Contains("Name")).Count(x => x.Id > 1000);

            Console.ReadLine();
        }
    }
}

ফলাফল:

যে কোনও () ~ 3 এসএম

প্রথম ক্যোয়ারির জন্য () Count 230ms, দ্বিতীয়টির জন্য 400 ডলার গণনা করুন

মন্তব্য:

আমার ক্ষেত্রে, ইএফ তার পোস্টে উল্লিখিত @ বেনের মতো এসকিউএল তৈরি করে নি।


4
সঠিক তুলনা করার জন্য, আপনার করা উচিত Count() > 0। : ডি
অ্যান্ড্রু

1
অ্যান্ড্রু, গণনা ()> 0 এই নির্দিষ্ট পরীক্ষায় গণনা () এর চেয়ে আলাদাভাবে চলবে না।
কোডমনকিফোর্ডহায়ার

11

সম্পাদনা: এটি EF সংস্করণে 6.1.1 ঠিক করা হয়েছিল। এবং এই উত্তর আর প্রকৃত নয়

এসকিউএল সার্ভার এবং EF4-6- এর জন্য, গণনা () যেকোন () এর চেয়ে প্রায় দ্বিগুণ দ্রুত সম্পাদন করে।

আপনি যখন Table.Any () চালানো, এটা ভালো কিছু উৎপন্ন হবে ( সতর্কতা: এটা বোঝার চেষ্টা মস্তিষ্ক আঘাত না )

SELECT 
CASE WHEN ( EXISTS (SELECT 
    1 AS [C1]
    FROM [Table] AS [Extent1]
)) THEN cast(1 as bit) WHEN ( NOT EXISTS (SELECT 
    1 AS [C1]
    FROM [Table] AS [Extent2]
)) THEN cast(0 as bit) END AS [C1]
FROM  ( SELECT 1 AS X ) AS [SingleRowTable1]

এর জন্য আপনার অবস্থার সাথে 2 টি স্ক্যান সারি প্রয়োজন।

আমি লিখতে পছন্দ করি না Count() > 0কারণ এটি আমার উদ্দেশ্যকে আড়াল করে। আমি এর জন্য কাস্টম প্রিকেট ব্যবহার করতে পছন্দ করি:

public static class QueryExtensions
{
    public static bool Exists<TSource>(this IQueryable<TSource> source, Expression<Func<TSource, bool>> predicate)
    {
        return source.Count(predicate) > 0;
    }
}

আমি এটিও লক্ষ্য করেছি। যে কোনও () এসকিউএল মোটেই বোঝায় না। তারা নিশ্চিত না কেন আমি নিশ্চিত নই: কেস WHEN (উপস্থিত (বর্গ)) তখন 1 জন 0 ইন্ডে। ০. ফিরে আসার জন্য কেন তাদের একটি অস্তিত্ব নেই তার কারণ আমি ভাবতে পারি না
স্কট.কোরিন

এটা মিথ্যা। আপনি এলোমেলো সুযোগ দ্বারা একটি খারাপ ক্যোয়ারী পরিকল্পনা পেয়েছেন। এটা ঘতছে. যে কোনও, প্রায় সর্বদা দ্রুততর।
usr ডিরেক্টরির

আমি .1.১.৩ এ উত্পন্ন স্কয়ারটি চেক করেছি, তারা এটি স্থির করেছে: নির্বাচন করুন WHEN (উপস্থিত থাকুন (নির্বাচন করুন 1 AS [C1] থেকে [dbo] [ তারপরে (বিট হিসাবে 1) ELSE castালাই (বিট হিসাবে 0) সমাপ্তি হিসাবে [সি 1] ফর্ম (1 এএস এক্স নির্বাচন করুন) হিসাবে [সিঙ্গেলরো টেবিল 1]
বেন

6

এটি নির্ভর করে, ডেটা কত বড় সেট হয় এবং আপনার সম্পাদনের প্রয়োজনীয়তাগুলি কী?

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


2

আমাদের সম্পর্কে কাউন্ট () পদ্ধতি, যদি IEnumarable একটি হল ICollection , তাহলে আমরা করতে পারেন না বারবার সব আইটেম জুড়ে কারণ আমরা উদ্ধার করতে পারেন কাউন্ট ক্ষেত্রে ICollection , যদি IEnumerable একটি নয় ICollection আমরা বারবার একটি ব্যবহার সব আইটেম জুড়ে আবশ্যক যখন সঙ্গে একটি মুভেক্সটেক্সট .NET ফ্রেমওয়ার্ক কোডটি একবার দেখুন:

public static int Count<TSource>(this IEnumerable<TSource> source)
{
    if (source == null) 
        throw Error.ArgumentNull("source");

    ICollection<TSource> collectionoft = source as ICollection<TSource>;
    if (collectionoft != null) 
        return collectionoft.Count;

    ICollection collection = source as ICollection;
    if (collection != null) 
        return collection.Count;

    int count = 0;
    using (IEnumerator<TSource> e = source.GetEnumerator())
    {
        checked
        {
            while (e.MoveNext()) count++;
        }
    }
    return count;
}

তথ্যসূত্র: রেফারেন্স উত্স গণনাযোগ্য


2

এটি বের করার জন্য আপনি একটি সাধারণ পরীক্ষা করতে পারেন:

var query = //make any query here
var timeCount = new Stopwatch();
timeCount.Start();
if (query.Count > 0)
{
}
timeCount.Stop();
var testCount = timeCount.Elapsed;

var timeAny = new Stopwatch();
timeAny.Start();
if (query.Any())
{
}
timeAny.Stop();
var testAny = timeAny.Elapsed;

টেস্টকাউন্ট এবং টেস্টঅ্যানির মানগুলি পরীক্ষা করে দেখুন।


1
এখানে কাউন্টার সম্পত্তি বনাম যে কোনও () গণনা সম্পত্তি + 2x সহ কোনও () বনাম জয়ের জন্য কোড সহ পরীক্ষা করা হচ্ছে - লিঙ্ক
স্তানিস্লাভ প্রুশাক

1
আরও ভাল ফলাফলের জন্য, আপনি এই তুলনাগুলি 1000 বার (বা আরও বেশি) করতে পারতেন। এটি ফলাফলগুলি গড়তে এবং কোনও এলোমেলো স্পাইক এড়াতে সহায়তা করে।
রোমান

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

আরও ভাল তুলনা করার জন্য Countপদ্ধতি গণনা () বনাম। যে কোনও () কোনও সম্পত্তি নয় by আপনার পুনরাবৃত্তির সময় প্রয়োজন।
daremachine

0

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

যে কোনও () পারফরম্যান্স বর্ধন হতে পারে কারণ জিনিসগুলির সংখ্যা পেতে এটি সংগ্রহকে পুনরাবৃত্তি করতে নাও পারে। এটি কেবল তাদের একটি আঘাত করতে হবে। অথবা, লিনকিউ-টু-সত্তা হিসাবে বলুন, উত্পাদিত এসকিউএল যদি নির্বাচিত COUNT ... বা এমনকি নির্বাচন * .... না হয়ে উপস্থিত থাকে ...

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