NET-933 Modify S1155: Add benchmarks (#4592)
This commit is contained in:
parent
a2aa406613
commit
43247cd487
@ -5,6 +5,14 @@ When you call `Any()`, it clearly communicates the code's intention, which is to
|
|||||||
* if the collection is an `EntityFramework` or other ORM query, calling `Count()` will cause executing a potentially massive SQL query and could put a large overhead on the application database. Calling `Any()` will also connect to the database, but will generate much more efficient SQL.
|
* if the collection is an `EntityFramework` or other ORM query, calling `Count()` will cause executing a potentially massive SQL query and could put a large overhead on the application database. Calling `Any()` will also connect to the database, but will generate much more efficient SQL.
|
||||||
* if the collection is part of a LINQ query that contains `Select()` statements that create objects, a large amount of memory could be unnecessarily allocated. Calling `Any()` will be much more efficient because it will execute fewer iterations of the enumerable.
|
* if the collection is part of a LINQ query that contains `Select()` statements that create objects, a large amount of memory could be unnecessarily allocated. Calling `Any()` will be much more efficient because it will execute fewer iterations of the enumerable.
|
||||||
|
|
||||||
|
== How to fix it
|
||||||
|
|
||||||
|
Prefer using `Any()` to test for emptiness over `Count()`.
|
||||||
|
|
||||||
|
=== Code examples
|
||||||
|
|
||||||
|
==== Noncompliant code example
|
||||||
|
|
||||||
[source,csharp,diff-id=1,diff-type=noncompliant]
|
[source,csharp,diff-id=1,diff-type=noncompliant]
|
||||||
----
|
----
|
||||||
private static bool HasContent(IEnumerable<string> strings)
|
private static bool HasContent(IEnumerable<string> strings)
|
||||||
@ -23,7 +31,7 @@ private static bool IsEmpty(IEnumerable<string> strings)
|
|||||||
}
|
}
|
||||||
----
|
----
|
||||||
|
|
||||||
Prefer using `Any()` to test for emptiness over `Count()`.
|
==== Compliant solution
|
||||||
|
|
||||||
[source,csharp,diff-id=1,diff-type=compliant]
|
[source,csharp,diff-id=1,diff-type=compliant]
|
||||||
----
|
----
|
||||||
@ -43,6 +51,59 @@ private static bool IsEmpty(IEnumerable<string> strings)
|
|||||||
}
|
}
|
||||||
----
|
----
|
||||||
|
|
||||||
|
== Resources
|
||||||
|
|
||||||
|
=== Benchmarks
|
||||||
|
|
||||||
|
[options="header"]
|
||||||
|
|===
|
||||||
|
| Method | Runtime | Mean | Standard Deviation
|
||||||
|
| Count | .NET 9.0 | 2,841.003 ns | 266.0238 ns
|
||||||
|
| Any | .NET 9.0 | 1.749 ns | 0.1242 ns
|
||||||
|
| Count | .NET Framework 4.8.1 | 71,125.275 ns | 731.0382 ns
|
||||||
|
| Any | .NET Framework 4.8.1 | 31.774 ns | 0.3196 ns
|
||||||
|
|===
|
||||||
|
|
||||||
|
==== Glossary
|
||||||
|
|
||||||
|
* https://en.wikipedia.org/wiki/Arithmetic_mean[Mean]
|
||||||
|
* https://en.wikipedia.org/wiki/Standard_deviation[Standard Deviation]
|
||||||
|
|
||||||
|
The results were generated by running the following snippet with https://github.com/dotnet/BenchmarkDotNet[BenchmarkDotNet]:
|
||||||
|
|
||||||
|
[source,csharp]
|
||||||
|
----
|
||||||
|
private IEnumerable<int> collection;
|
||||||
|
|
||||||
|
public const int N = 10_000;
|
||||||
|
|
||||||
|
[GlobalSetup]
|
||||||
|
public void GlobalSetup()
|
||||||
|
{
|
||||||
|
collection = Enumerable.Range(0, N).Select(x => N - x);
|
||||||
|
}
|
||||||
|
|
||||||
|
[Benchmark(Baseline = true)]
|
||||||
|
public bool Count() =>
|
||||||
|
collection.Count() > 0;
|
||||||
|
|
||||||
|
[Benchmark]
|
||||||
|
public bool Any() =>
|
||||||
|
collection.Any();
|
||||||
|
----
|
||||||
|
|
||||||
|
Hardware Configuration:
|
||||||
|
|
||||||
|
[source]
|
||||||
|
----
|
||||||
|
BenchmarkDotNet v0.14.0, Windows 10 (10.0.19045.5247/22H2/2022Update)
|
||||||
|
12th Gen Intel Core i7-12800H, 1 CPU, 20 logical and 14 physical cores
|
||||||
|
[Host] : .NET Framework 4.8.1 (4.8.9282.0), X64 RyuJIT VectorSize=256
|
||||||
|
.NET 9.0 : .NET 9.0.0 (9.0.24.52809), X64 RyuJIT AVX2
|
||||||
|
.NET Framework 4.8.1 : .NET Framework 4.8.1 (4.8.9282.0), X64 RyuJIT VectorSize=256
|
||||||
|
----
|
||||||
|
|
||||||
|
|
||||||
ifdef::env-github,rspecator-view[]
|
ifdef::env-github,rspecator-view[]
|
||||||
|
|
||||||
'''
|
'''
|
||||||
@ -101,7 +162,7 @@ Added the `Count() == 0` to the description and extended the code samples
|
|||||||
\[~ann.campbell.2] You are right, I removed the comparison to `0`.
|
\[~ann.campbell.2] You are right, I removed the comparison to `0`.
|
||||||
|
|
||||||
=== on 27 May 2015, 14:04:31 Ann Campbell wrote:
|
=== on 27 May 2015, 14:04:31 Ann Campbell wrote:
|
||||||
Thanks [~tamas.vajk]. I've merged the code blocks into one block each for Compliant and Noncompliant
|
Thanks [~tamas.vajk]. I've merged the code blocks into one block each for Compliant and Noncompliant
|
||||||
|
|
||||||
=== on 1 Jun 2015, 14:30:42 Ann Campbell wrote:
|
=== on 1 Jun 2015, 14:30:42 Ann Campbell wrote:
|
||||||
I've updated the examples with `List<string>`. Please double-check me.
|
I've updated the examples with `List<string>`. Please double-check me.
|
||||||
|
Loading…
x
Reference in New Issue
Block a user