Skip to main content

Which linq method performs better: .Any() vs .Count() > 0?

Introduction

In this modern era of enterprises application, entity framework playing a key role in dealing with the databases. so we need to follow the best practices in each statements of our code to speedup. Sometimes we developers will have multiple options to check the same condition. We must choose the best option else it will cost to us. Let's have this scenario, we need to check whether our collection object is having any elements in LINQ. We can use Any() method or Count()>0, still this is debatable topic in many technical forums. So, I decided to create this article for the developers who is having same thought which I am having. Let's conclude is our way
 

Approaches

Performance checking for Any and Count LINQ Methods is trickiest thing over ICollection<T> and IEnumerable<T>
  • ICollection<T>  Count is better performer than Any Method
  • IEnumerable<T> Any is best option, no availability of Count property

Public API

To check the performance, I need some amount of data which should already available. So I decided to choose this public api. Thanks to publicapis

Public API Models

Entry class

using System;
using System.Collections.Generic;
using System.Text;
 
namespace AnyVsCount
{
    public class Entry
    {
        public string API { get; set; }
        public string Description { get; set; }
        public string Auth { get; set; }
        public bool HTTPS { get; set; }
        public string Cors { get; set; }
        public string Link { get; set; }
        public string Category { get; set; }
    }
}
 

Root Collection

using System;
using System.Collections.Generic;
using System.Text;
 
namespace AnyVsCount
{
    public class RootCollection
    {
        public int count { get; set; }
        public ICollection<Entry> entries { get; set; }
    }
}
 

ICollection<T>  Count is better performer than Any Method

Tick Count Based Approach ICollection<T>

For Any() and Count()>0 method comparisons we will  evaluate based on tick counts in executing the LINQ Statement. 
using Newtonsoft.Json;
using System;
using System.Linq;
using System.Net.Http;
using System.Threading.Tasks;
 
namespace AnyVsCount
{
    class Program
    {
        static async Task Main(string[] args)
        {
            Console.WriteLine("Who is better performer Any or  Count>0 (ICollection<T>)?");
            var client = new HttpClient();
            var response = await client.GetAsync("https://api.publicapis.org/entries");
            if (response.IsSuccessStatusCode)
            {
                var data = await response.Content.ReadAsStringAsync();
 
                var coll = JsonConvert.DeserializeObject<RootCollection>(data);
 
                Console.WriteLine("Evaluating Any Method:");
                Console.WriteLine("-----------------------");
 
                var watch3 = System.Diagnostics.Stopwatch.StartNew();
                // the code that you want to measure comes here
                var result3 = coll.entries.Any();
                watch3.Stop();
                var elapsedMs3 = watch3.ElapsedTicks;
                Console.WriteLine("ICollection<T>.Any : " + elapsedMs3 + " Ticks");
 
                Console.WriteLine("-----------------------");
                Console.WriteLine(" ");
 
                Console.WriteLine("Evaluating Count>0 Method:");
                Console.WriteLine("-----------------------");
 
                var watch7 = System.Diagnostics.Stopwatch.StartNew();
                // the code that you want to measure comes here
                var result7 = coll.entries.Count > 0;
                watch7.Stop();
                var elapsedMs7 = watch7.ElapsedTicks;
                Console.WriteLine("ICollection<T>.Count > 0 : " + elapsedMs7 + " Ticks");
 
                Console.WriteLine("-----------------------");
                Console.ReadKey();
            }
        }
    }
}
 

Debug Video ICollection<T> 




ICollection<T> Performance Result

After multiple attempts in my local machine , For ICollection<T> Count > 0 is performing better than Any




Why Count is better performer than Any for ICollection<T>?

According to the source .NET Core source, ICollection<T> just calls the Count method for optimization, but Any method needs to be enumerated. That's why Any is slower than Count.

IEnumerable<T> Any is best option, no availability of Count property

For IEnumerable<T> types , we know that Count property is not available and execution of Any method is very fast as it enumerate over single item to identify the result. It will not loop over items to get count or length.

 Root Enumerable 

using System;
using System.Collections.Generic;
using System.Text;
 
namespace AnyVsCount
{
    public class RootEnumerable
    {
        public int count { get; set; }
        public IEnumerable<Entry> entries { get; set; }
 
    }
}
 

Tick Count Based Approach IEnumerable<T>

using Newtonsoft.Json;
using System;
using System.Linq;
using System.Net.Http;
using System.Threading.Tasks;
 
namespace AnyVsCount
{
    class Program
    {
        static async Task Main(string[] args)
        {
            Console.WriteLine("Who is better performer Any or  Count>0 (IEnumerable<T>)?");
            var client = new HttpClient();
            var response = await client.GetAsync("https://api.publicapis.org/entries");
            if (response.IsSuccessStatusCode)
            {
                var data = await response.Content.ReadAsStringAsync();
 
                var coll = JsonConvert.DeserializeObject<RootEnumerable>(data);
 
                Console.WriteLine("Evaluating Any Method:");
                Console.WriteLine("-----------------------");
 
                var watch3 = System.Diagnostics.Stopwatch.StartNew();
                // the code that you want to measure comes here
                var result3 = coll.entries.Any();
                watch3.Stop();
                var elapsedMs3 = watch3.ElapsedTicks;
                Console.WriteLine("IEnumerable<T>.Any : " + elapsedMs3 + " Ticks");
 
                Console.WriteLine("-----------------------");
                Console.WriteLine(" ");
 
                Console.WriteLine("-----------------------");
                Console.ReadKey();
            }
        }
    }
}
 

IEnumerable<T> Performance Results

IEnumerable can use Count() method for optimization but Any() will look for element and stop its iteration



Conclusion

Any Method will always be good for readability and good performer over IEnumerable types while Count > 0 is better performer for ICollection types. But both methods has its pros and cons. Hope you like this article









Comments

Popular posts from this blog

How to resolve ASP.NET core web API 2 mins timeout issue

Introduction We are in the new world of microservices and cross-platform applications which will be supported for multiple platforms and multiple heterogeneous teams can work on the same application. I like ASP.NET Core by the way its groomed to support modern architecture and adhere to the software principles. I am a big fan of dot net and now I become the craziest fan after seeing the sophisticated facility by dot net core to support infrastructure level where we can easily perform vertical and horizontal scaling. It very important design aspect is to keep things simple and short and by the way, RESTFul applications are build and it is a powerful mantra for REST-based application and frameworks. Some times we need to overrule some principles and order to handle some situations. I would like to share my situation of handling HTTP long polling to resolve the ASP.Net core 2 mins issue. What is HTTP Long polling? In the RESTFul term, when a client asks for a query from the serv

How to Resolve ASP.NET Core Key Protection Ring Problem in AWS Lambda

Introduction When it comes to server less web application design using asp.net core razor pages, we definitely need to consider a factor of data protection key management and its lifetime in asp.net core. I developed a site using AWS toolkit of ASP.NET Core Razor Pages. The main advantage of ASP.NET Core is cross-platform from where we can deploy our application in MAC, Linux or windows. I deployed my site initially in IIS Server from which I got the results as expected .but later period I decided to host my site in AWS Lambda in order to meet our client requirement. Strangely, I got unexpected behavior from my site. I just refer the cloud information Lambda Log to identify or pinpoint the case, I got the error Information like “Error Unprotecting the session cookie” from the log. In this article, I tried to explain the root cause of the problem and its solution to overcome such kind of issue. Data Protection in ASP.NET Core This is feature in ASP.NET Core which acts as repl

Which linq method performs better: Where(expression).FirstorDefault() vs .FirstOrDefault(expression)

 Introduction When it comes to LINQ, we always have multiple options to execute the query for the same scenario. Choosing correct one is always challenging aspect and debatable one. In one of our previous articles   Any Vs Count  , we have done performance testing about best LINQ methods over .NET types. In this article, I would like to share about  Where(expression).FirstorDefault() vs .FirstOrDefault(expression) Approaches Performance testing for  Where(expression).FirstorDefault() vs .FirstOrDefault(expression) is very interesting IEnumerable<T> or ICollcetion<T>  .FirstOrDefault(expression) is better than  Where(expression).FirstorDefault() Public API To check the performance, I need some amount of data which should already available. So I decided to choose this  public api . Thanks to publicapis Public API Models Entry class using System ; using System.Collections.Generic ; using System.Text ;   namespace AnyVsCount { public class Entry { pub