Skip to main content

Linq performance with Count() and Any()

Recently I was using resharper to refactor some of my code and found that it was suggesting to use any() extension method instead of count() method in List<T>. I was really keen about performance and found that resharper was right. There is huge performance difference between any() and count() if you are using count() just to check whether list is empty or not.

Difference between Count() and Any():


In Count() method code will traverse all the list and get total number of objects in list while in Any() will return after examining first element in the sequence. So in list where we have many object it will be significant execution time if we use count().

Example:


Let’s take an example to illustrate this scenario. Following is a code for that.
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;

namespace ConsoleApplication3
{
    class Program
    {
        static void Main() {

            //Creating List of customers
            List<Customer> customers = new List<Customer>();
            for (int i = 0; i <= 100; i++) {
                Customer customer = new Customer {
                    CustomerId = i,
                    CustomerName = string.Format("Customer{0}", i)
                };
                customers.Add(customer);
            }

            //Measuring time with count
            Stopwatch stopWatch = new Stopwatch();
            stopWatch.Start();
            if (customers.Count > 0) {
                Console.WriteLine("Customer list is not empty with count");
            }
            stopWatch.Stop();
            Console.WriteLine("Time consumed with count: {0}", stopWatch.Elapsed);

            //Measuring time with any
            stopWatch.Restart();
            if (customers.Any()) {
                Console.WriteLine("Customer list is not empty with any");
            }
            stopWatch.Stop();
            Console.WriteLine("Time consumed with count: {0}", stopWatch.Elapsed);
        }
    }

    public class Customer
    {
        public int CustomerId { get; set; }
        public string CustomerName { get; set; }
    }
}

Here in the above code you can see that I created ‘Customer’ class which has simple two properties ‘CustomerId’ and ‘CustomerName’. Then in Main method I have created a list of customers and used for loop and object intializer to fill customers list. After that I have written a code to measure time for count and any with ‘Stop watch’ class and printing CPU ticks. It’s pretty simple.

Now let’s run this console application to see output.

Performance diffrence between Any() and Count() in c#

Conclusion:


Here in the above example you can see there is huge performance benefit of using any() instead of count() when we are checking whether list<T> is empty or not.

Hope you like it. Stay tuned for more..

Comments

  1. Have you tried to measure this multiple times or switch the if's? It could be that the second call was faster cause of optimization.
    Otherwise this would be fascinating and a bit weird.

    ReplyDelete
  2. Your conclusion is (mostly) correct, in that Enumerable.Count() is generally slower than Enumerable.Any(), but your method is flawed.

    First, you are not even using LINQ's Count() extension, but rather List.Count property. And, more importantly, you are including Console.WriteLine calls in your timings, which affects the result.

    If I modify your code to just time 'customers.Count > 0' and 'customers.Any()', the results are completely different (Count = 00:00:00.0000018, Any() = 00:00:00.0001110). This is expected, as accessing List.Count doesn't iterate through the list and is internally maintained by List as elements are added and removed.

    However, due to LINQ being heavily optimised, even if you used Count() it would *still* be faster than using Any() on List. This is because Count() recognises that your collection implements ICollection and so returns the value of its Count property immediately, while Any() always calls GetEnumerator() and tries to advance it.

    ReplyDelete
  3. @google-90118b81f48cfb8666f1e1d44a427168:disqus - Thanks for your inputs and will check it.

    ReplyDelete
  4. @google-90118b81f48cfb8666f1e1d44a427168:disqus - Hi thanks for your input. I will definitely check this

    ReplyDelete
  5. I measured with: no Console.WriteLine(), 10k lists with 50 Customers, 10 iterations, in Release mode.


    In my case:
    - List.Count() is more than 2 times faster then List.Any()

    - List.Count is more than 2 times then List.Count() and more than 5 times faster then List.Any()

    The conclusion should be opposite: Use 'List.Count == 0' instead of List.Any() when checking if List is empty or not.

    ReplyDelete

Post a Comment

Your feedback is very important to me. Please provide your feedback via putting comments.

Popular posts from this blog

How to create Rest API(Web API) with ASP.NET Core 1.0

Recently Microsoft has released ASP.NET Core 1.0 RC2, I am getting lots of request from readers that about creating Web API. So I thought it will be a good idea to write a blog post about how to create Rest API(Web API) with ASP.NET Core 1.0.

So let’s get started via creating an ASP.NET Core 1.0 Web Application like following.



Once you click on ASP.NET Web Application, It will ask whether you need to create Web Application or Web API application. We are going to Web API so I am going to select Web API Application like following. Please note that in ASP.NET Core 1.0 there is no separate libraries or DLLs required for creating web APIs. This is just a project template.



Now once you click on OK It will create a Web API application with default values controller and program.cs.  As you know Program.cs is now starting point for the ASP.NET Core 1.0 application so It contains all the required configuration and startup items. Following is a code for that.
using System.IO; using Microsoft.Asp…

How to use migration with Entity Framework Core

Entity framework core is  the lightweight, extensible and cross-platform version of Entity Framework. Before some time, Microsoft has Released a new version of Entity Framework RC2. I have written a couple of blog post about Entity framework code first migration earlier for Entity framework 6.0. So there was a couple of request coming for writing a blog post about Entity Framework Core RC2 migration. So I thought it will be a good idea to give an overview how database migration works in Entity Framework Core RC2. This post will cover a basic scenario where we are going to create the database with existing ASP.NET Identity migration and then we are going to create a new model and have that migration applied in the database.

How to use Entity Framework Migrations: Let’s get started, To demonstrate entity framework core migrations, I am going to create a sample asp.net core web application like following.



Once we select asp.net core application it will appear the following dialog.



Now w…

Solution: gulp is not recognized as internal or external command- Visual Studio

Recently, After Upgrading to the newer version of Gulp, I was getting this error.  After doing lots of  finding online and in my system I was able to figure out that Modules like Gulp does not installed to the path. So when you try to run it from the command line it was showing below error.
gulp is not recognized as internal or external command How to solve : gulp is not recognized as internal or external command To solve this error we just need to create a new environment variable and set the NPM modules path there.

To create an environment variable,  Right click My Computer/ This Pc and click on properties.  It will open following windows.



Go to Advance System Settings and it will open system properties windows like below.



Click on Environment Variables it will open an environment and system variables windows like below.



Click on new System variable and put NODE_PATH in system variable name and %AppData%\npm\node_modules into the variable value like below.



Click on Ok. That’s it. N…