Skip to content
4 changes: 2 additions & 2 deletions samples/BenchmarkDotNet.Samples/IntroFilters.cs
Original file line number Diff line number Diff line change
Expand Up @@ -16,8 +16,8 @@ public Config()
{
// benchmark with names which contains "A" OR "1"
AddFilter(new DisjunctionFilter(
new NameFilter(name => name.Contains("A")),
new NameFilter(name => name.Contains("1"))
new NameFilter(name => name.Contains('A')),
new NameFilter(name => name.Contains('1'))
));

// benchmark with names with length < 3
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -48,7 +48,7 @@ public class ConcurrencyVisualizerProfiler : IProfiler

public void DisplayResults(ILogger logger)
{
if (!benchmarkToCvTraceFile.Any())
if (benchmarkToCvTraceFile.Count == 0)
return;

logger.WriteLineInfo($"Exported {benchmarkToCvTraceFile.Count} CV trace file(s). Example:");
Expand Down
4 changes: 2 additions & 2 deletions src/BenchmarkDotNet.Diagnostics.Windows/EtwProfiler.cs
Original file line number Diff line number Diff line change
Expand Up @@ -81,7 +81,7 @@ public IEnumerable<Metric> ProcessResults(DiagnoserResults results)

public void DisplayResults(ILogger logger)
{
if (!benchmarkToEtlFile.Any())
if (benchmarkToEtlFile.Count == 0)
return;

logger.WriteLineInfo($"Exported {benchmarkToEtlFile.Count} trace file(s). Example:");
Expand All @@ -95,7 +95,7 @@ private void Start(DiagnoserActionParameters parameters)
.Select(counter => HardwareCounters.FromCounter(counter, config.IntervalSelectors.TryGetValue(counter, out var selector) ? selector : GetInterval))
.ToArray();

if (counters.Any()) // we need to enable the counters before starting the kernel session
if (counters.Length != 0) // we need to enable the counters before starting the kernel session
HardwareCounters.Enable(counters);

try
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -81,10 +81,10 @@ private void OnPmcIntervalChange(SampledProfileIntervalTraceData data)
private void OnPmcEvent(PMCCounterProfTraceData data)
{
// if given process did not emit Benchmarking events before, we don't care about it
if (!processIdToData.ContainsKey(data.ProcessID))
if (!processIdToData.TryGetValue(data.ProcessID, out ProcessMetrics? value))
return;

processIdToData[data.ProcessID].HandleNewSample(data.TimeStampRelativeMSec, data.InstructionPointer, data.ProfileSource);
value.HandleNewSample(data.TimeStampRelativeMSec, data.InstructionPointer, data.ProfileSource);
}
}

Expand All @@ -96,7 +96,7 @@ public class ProcessMetrics

private readonly List<(double timeStamp, ulong instructionPointer, int profileSource)> samples = [];

public bool HasBenchmarkEvents => overheadTimestamps.Any() || workloadTimestamps.Any();
public bool HasBenchmarkEvents => overheadTimestamps.Count != 0 || workloadTimestamps.Count != 0;

public void HandleIterationEvent(double timeStamp, IterationMode iterationMode, long totalOperations)
{
Expand Down
2 changes: 1 addition & 1 deletion src/BenchmarkDotNet/Analysers/ConclusionHelper.cs
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@ public static void Print(ILogger logger, IEnumerable<Conclusion> conclusions)
private static void PrintFiltered(IEnumerable<Conclusion> conclusions, ConclusionKind kind, string title, Action<string> printLine)
{
var filtered = conclusions.Where(c => c.Kind == kind).ToArray();
if (filtered.Any())
if (filtered.Length != 0)
{
printLine("");
printLine($"// * {title} *");
Expand Down
2 changes: 1 addition & 1 deletion src/BenchmarkDotNet/Analysers/EnvironmentAnalyser.cs
Original file line number Diff line number Diff line change
Expand Up @@ -32,7 +32,7 @@ protected override IEnumerable<Conclusion> AnalyseSummary(Summary summary)
if (unexpectedExit)
{
var avProducts = summary.HostEnvironmentInfo.AntivirusProducts.Value;
if (avProducts.Any())
if (avProducts.Count != 0)
yield return CreateWarning(CreateWarningAboutAntivirus(avProducts));
}

Expand Down
4 changes: 2 additions & 2 deletions src/BenchmarkDotNet/Analysers/OutliersAnalyser.cs
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,7 @@ protected override IEnumerable<Conclusion> AnalyseReport(BenchmarkReport report,
var actualOutliers = statistics.GetActualOutliers(outlierMode);

var cultureInfo = summary.GetCultureInfo();
if (allOutliers.Any())
if (allOutliers.Length != 0)
yield return CreateHint(GetMessage(actualOutliers, allOutliers, statistics.LowerOutliers, statistics.UpperOutliers, cultureInfo), report);
}

Expand All @@ -54,7 +54,7 @@ string Format(int n, string verb)

var rangeMessages = new List<string?> { GetRangeMessage(lowerOutliers), GetRangeMessage(upperOutliers) };
rangeMessages.RemoveAll(string.IsNullOrEmpty);
string rangeMessage = rangeMessages.Any()
string rangeMessage = rangeMessages.Count != 0
? " (" + string.Join(", ", rangeMessages) + ")"
: string.Empty;

Expand Down
2 changes: 1 addition & 1 deletion src/BenchmarkDotNet/Analysers/ZeroMeasurementAnalyser.cs
Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,7 @@ protected override IEnumerable<Conclusion> AnalyseReport(BenchmarkReport report,
var workloadSample = workloadMeasurements.GetStatistics().Sample;
var threshold = currentFrequency.Value.ToResolution().Nanoseconds / 2;

var zeroMeasurement = overheadMeasurements.Any()
var zeroMeasurement = overheadMeasurements.Length != 0
? ZeroMeasurementHelper.AreIndistinguishable(workloadSample, overheadMeasurements.GetStatistics().Sample)
: ZeroMeasurementHelper.IsNegligible(workloadSample, threshold);

Expand Down
4 changes: 2 additions & 2 deletions src/BenchmarkDotNet/Code/CodeGenerator.cs
Original file line number Diff line number Diff line change
Expand Up @@ -69,7 +69,7 @@ private static (bool, string) GetShadowCopySettings()
{
string benchmarkDotNetLocation = Path.GetDirectoryName(typeof(CodeGenerator).GetTypeInfo().Assembly.Location)!;

if (benchmarkDotNetLocation != null && benchmarkDotNetLocation.IndexOf("LINQPAD", StringComparison.OrdinalIgnoreCase) >= 0)
if (benchmarkDotNetLocation != null && benchmarkDotNetLocation.Contains("LINQPAD", StringComparison.OrdinalIgnoreCase))
{
/* "LINQPad normally puts the compiled query into a different folder than the referenced assemblies
* - this allows for optimizations to reduce file I/O, which is important in the scratchpad scenario"
Expand Down Expand Up @@ -239,7 +239,7 @@ private static string GetEngineFactoryTypeName(BenchmarkCase benchmarkCase)
var factory = benchmarkCase.Job.ResolveValue(InfrastructureMode.EngineFactoryCharacteristic, InfrastructureResolver.Instance)!;
var factoryType = factory.GetType();

if (!factoryType.GetTypeInfo().DeclaredConstructors.Any(ctor => ctor.IsPublic && !ctor.GetParameters().Any()))
if (!factoryType.GetTypeInfo().DeclaredConstructors.Any(ctor => ctor.IsPublic && ctor.GetParameters().Length == 0))
{
throw new NotSupportedException("Custom factory must have a public parameterless constructor");
}
Expand Down
2 changes: 1 addition & 1 deletion src/BenchmarkDotNet/Configs/ImmutableConfig.cs
Original file line number Diff line number Diff line change
Expand Up @@ -122,7 +122,7 @@ internal ImmutableConfig(
{
var diagnosersForGivenMode = diagnosers.Where(diagnoser => runModeComparer(diagnoser.GetRunMode(benchmarkCase))).ToImmutableHashSet();

return diagnosersForGivenMode.Any() ? new CompositeDiagnoser(diagnosersForGivenMode) : null;
return !diagnosersForGivenMode.IsEmpty ? new CompositeDiagnoser(diagnosersForGivenMode) : null;
}

public IReadOnlyList<Conclusion> ConfigAnalysisConclusion { get; private set; }
Expand Down
11 changes: 4 additions & 7 deletions src/BenchmarkDotNet/Configs/ImmutableConfigBuilder.cs
Original file line number Diff line number Diff line change
Expand Up @@ -88,8 +88,7 @@ private static ImmutableHashSet<IDiagnoser> GetDiagnosers(IEnumerable<IDiagnoser
var builder = ImmutableHashSet.CreateBuilder(new TypeComparer<IDiagnoser>());

foreach (var diagnoser in diagnosers)
if (!builder.Contains(diagnoser))
builder.Add(diagnoser);
builder.Add(diagnoser);

if (!uniqueHardwareCounters.IsEmpty && !diagnosers.OfType<IHardwareCountersDiagnoser>().Any())
{
Expand Down Expand Up @@ -187,13 +186,11 @@ private static ImmutableHashSet<IAnalyser> GetAnalysers(IEnumerable<IAnalyser> a
var builder = ImmutableHashSet.CreateBuilder<IAnalyser>();

foreach (var analyser in analysers)
if (!builder.Contains(analyser))
builder.Add(analyser);
builder.Add(analyser);

foreach (var diagnoser in uniqueDiagnosers)
foreach (var analyser in diagnoser.Analysers)
if (!builder.Contains(analyser))
builder.Add(analyser);
builder.Add(analyser);

return builder.ToImmutable();
}
Expand Down Expand Up @@ -232,7 +229,7 @@ private static IReadOnlyList<Job> GetRunnableJobs(IEnumerable<Job> jobs)
var customDefaultJob = unique.SingleOrDefault(job => job.Meta.IsDefault);
var defaultJob = customDefaultJob ?? Job.Default;

if (!result.Any())
if (result.Count == 0)
result.Add(defaultJob);

foreach (var mutatorJob in unique.Where(job => job.Meta.IsMutator))
Expand Down
4 changes: 2 additions & 2 deletions src/BenchmarkDotNet/ConsoleArguments/ConfigParser.cs
Original file line number Diff line number Diff line change
Expand Up @@ -287,7 +287,7 @@ private static bool Validate(CommandLineOptions options, ILogger logger)
{
if (!TryParse(runtime, out RuntimeMoniker runtimeMoniker))
{
logger.WriteLineError($"The provided runtime \"{runtime}\" is invalid. Available options are: {string.Join(", ", Enum.GetNames(typeof(RuntimeMoniker)).Select(name => name.ToLower()))}.");
logger.WriteLineError($"The provided runtime \"{runtime}\" is invalid. Available options are: {string.Join(", ", Enum.GetNames<RuntimeMoniker>().Select(name => name.ToLower()))}.");
return false;
}
else if (runtimeMoniker == RuntimeMoniker.MonoAOTLLVM && (options.AOTCompilerPath == null || options.AOTCompilerPath.IsNotNullButDoesNotExist()))
Expand Down Expand Up @@ -353,7 +353,7 @@ private static bool Validate(CommandLineOptions options, ILogger logger)
foreach (var counterName in options.HardwareCounters)
if (!Enum.TryParse(counterName, ignoreCase: true, out HardwareCounter _))
{
logger.WriteLineError($"The provided hardware counter \"{counterName}\" is invalid. Available options are: {string.Join("+", Enum.GetNames(typeof(HardwareCounter)))}.");
logger.WriteLineError($"The provided hardware counter \"{counterName}\" is invalid. Available options are: {string.Join("+", Enum.GetNames<HardwareCounter>())}.");
return false;
}

Expand Down
2 changes: 1 addition & 1 deletion src/BenchmarkDotNet/Diagnosers/EventPipeProfiler.cs
Original file line number Diff line number Diff line change
Expand Up @@ -119,7 +119,7 @@ public IEnumerable<Metric> ProcessResults(DiagnoserResults results)

public void DisplayResults(ILogger resultLogger)
{
if (!benchmarkToTraceFile.Any())
if (benchmarkToTraceFile.Count == 0)
return;

resultLogger.WriteLineInfo($"Exported {benchmarkToTraceFile.Count} trace file(s). Example:");
Expand Down
4 changes: 2 additions & 2 deletions src/BenchmarkDotNet/Diagnosers/PerfCollectProfiler.cs
Original file line number Diff line number Diff line change
Expand Up @@ -73,7 +73,7 @@ private async IAsyncEnumerable<ValidationError> ValidateAsyncCore(ValidationPara

public void DisplayResults(ILogger logger)
{
if (!benchmarkToTraceFile.Any())
if (benchmarkToTraceFile.Count == 0)
return;

logger.WriteLineInfo($"Exported {benchmarkToTraceFile.Count} trace file(s). Example:");
Expand Down Expand Up @@ -227,7 +227,7 @@ private async ValueTask EnsureSymbolsForNativeRuntime(DiagnoserActionParameters
.Distinct()
.ToArray();

if (!missingSymbols.Any())
if (missingSymbols.Length == 0)
{
return; // the symbol files are already where we need them!
}
Expand Down
2 changes: 1 addition & 1 deletion src/BenchmarkDotNet/Disassemblers/DataContracts.cs
Original file line number Diff line number Diff line change
Expand Up @@ -252,7 +252,7 @@ internal static Version ParseVersion(string targetFrameworkMoniker)
}

string versionToParse = targetFrameworkMoniker.Substring(firstDigit, lastDigit - firstDigit + 1);
if (!versionToParse.Contains(".")) // Full .NET Framework (net48 etc)
if (!versionToParse.Contains('.')) // Full .NET Framework (net48 etc)
versionToParse = string.Join(".", versionToParse.ToCharArray());

return Version.Parse(versionToParse);
Expand Down
17 changes: 16 additions & 1 deletion src/BenchmarkDotNet/Disassemblers/DisassemblyDiagnoser.cs
Original file line number Diff line number Diff line change
Expand Up @@ -217,7 +217,22 @@ private static IEnumerable<IExporter> GetExporters(Dictionary<BenchmarkCase, Dis
}

private static long SumNativeCodeSize(DisassemblyResult disassembly)
=> disassembly.Methods.Sum(method => method.Maps.Sum(map => map.SourceCodes.OfType<Asm>().Sum(asm => asm.InstructionLength)));
{
long total = 0;

foreach (var method in disassembly.Methods)
{
foreach (var map in method.Maps)
{
foreach (var asm in map.SourceCodes.OfType<Asm>())
{
total += asm.InstructionLength;
}
}
}

return total;
}

InProcessDiagnoserHandlerData IInProcessDiagnoser.GetHandlerData(BenchmarkCase benchmarkCase)
{
Expand Down
2 changes: 1 addition & 1 deletion src/BenchmarkDotNet/Disassemblers/MonoDisassembler.cs
Original file line number Diff line number Diff line change
Expand Up @@ -78,7 +78,7 @@ internal static DisassemblyResult Parse(IReadOnlyList<string> input, string meth
if (TryParseInstruction(line, out var instruction))
instructions.Add(instruction);

while (instructions.Any() && instructions.Last().Text == "nop")
while (instructions.Count != 0 && instructions.Last().Text == "nop")
instructions.RemoveAt(instructions.Count - 1);

return new DisassemblyResult
Expand Down
4 changes: 2 additions & 2 deletions src/BenchmarkDotNet/Environments/Runtimes/CoreRuntime.cs
Original file line number Diff line number Diff line change
Expand Up @@ -180,7 +180,7 @@ internal static bool TryGetVersionFromProductInfo(string productVersion, string
{
if (productVersion.IsNotBlank() && productName.IsNotBlank())
{
if (productName.IndexOf(".NET Core", StringComparison.OrdinalIgnoreCase) >= 0)
if (productName.Contains(".NET Core", StringComparison.OrdinalIgnoreCase))
{
string parsableVersion = GetParsableVersionPart(productVersion);
if (Version.TryParse(productVersion, out version) || Version.TryParse(parsableVersion, out version))
Expand All @@ -190,7 +190,7 @@ internal static bool TryGetVersionFromProductInfo(string productVersion, string
}

// yes, .NET Core 2.X has a product name == .NET Framework...
if (productName.IndexOf(".NET Framework", StringComparison.OrdinalIgnoreCase) >= 0)
if (productName.Contains(".NET Framework", StringComparison.OrdinalIgnoreCase))
{
const string releaseVersionPrefix = "release/";
int releaseVersionIndex = productVersion.IndexOf(releaseVersionPrefix, StringComparison.Ordinal);
Expand Down
10 changes: 5 additions & 5 deletions src/BenchmarkDotNet/Extensions/ReflectionExtensions.cs
Original file line number Diff line number Diff line change
Expand Up @@ -201,7 +201,7 @@ internal static bool ContainsRunnableBenchmarks(this Type type)
if (typeInfo.IsAbstract || typeInfo.IsGenericType && !IsRunnableGenericType(typeInfo))
return false;

return typeInfo.GetBenchmarks().Any();
return typeInfo.GetBenchmarks().Length != 0;
}

private static MethodInfo[] GetBenchmarks(this TypeInfo typeInfo)
Expand Down Expand Up @@ -254,11 +254,11 @@ internal static bool IsStackOnlyWithImplicitCast(this Type argumentType, [NotNul

var instanceType = argumentInstance.GetType();

var implicitCastsDefinedInArgumentInstance = instanceType.GetMethods().Where(method => method.Name == "op_Implicit" && method.GetParameters().Any()).ToArray();
var implicitCastsDefinedInArgumentInstance = instanceType.GetMethods().Where(method => method.Name == "op_Implicit" && method.GetParameters().Length != 0).ToArray();
if (implicitCastsDefinedInArgumentInstance.Any(implicitCast => implicitCast.ReturnType == argumentType && implicitCast.GetParameters().All(p => p.ParameterType == instanceType)))
return true;

var implicitCastsDefinedInArgumentType = argumentType.GetMethods().Where(method => method.Name == "op_Implicit" && method.GetParameters().Any()).ToArray();
var implicitCastsDefinedInArgumentType = argumentType.GetMethods().Where(method => method.Name == "op_Implicit" && method.GetParameters().Length != 0).ToArray();
if (implicitCastsDefinedInArgumentType.Any(implicitCast => implicitCast.ReturnType == argumentType && implicitCast.GetParameters().All(p => p.ParameterType == instanceType)))
return true;

Expand All @@ -267,10 +267,10 @@ internal static bool IsStackOnlyWithImplicitCast(this Type argumentType, [NotNul

private static bool IsRunnableGenericType(TypeInfo typeInfo)
=> // if it is an open generic - there must be GenericBenchmark attributes
(!typeInfo.IsGenericTypeDefinition || typeInfo.GenericTypeArguments.Any() || typeInfo.GetCustomAttributes(true).OfType<GenericTypeArgumentsAttribute>().Any())
(!typeInfo.IsGenericTypeDefinition || typeInfo.GenericTypeArguments.Length != 0 || typeInfo.GetCustomAttributes(true).OfType<GenericTypeArgumentsAttribute>().Any())
&& typeInfo.DeclaredConstructors.Any(ctor => ctor.IsPublic && ctor.GetParameters().Length == 0); // we need public parameterless ctor to create it

internal static bool IsLinqPad(this Assembly assembly) => assembly.FullName!.IndexOf("LINQPAD", StringComparison.OrdinalIgnoreCase) >= 0;
internal static bool IsLinqPad(this Assembly assembly) => assembly.FullName!.Contains("LINQPAD", StringComparison.OrdinalIgnoreCase);

internal static bool IsByRefLike(this Type type)
#if NETSTANDARD2_0
Expand Down
2 changes: 1 addition & 1 deletion src/BenchmarkDotNet/Helpers/GenericBenchmarksBuilder.cs
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@ internal static Type[] GetRunnableBenchmarks(IEnumerable<Type> types)
.Select(x => x.GenericTypeArguments)
.ToArray();

if (typeArguments.Any())
if (typeArguments.Length != 0)
return BuildGenericTypes(type, typeArguments);

return [(true, type)];
Expand Down
2 changes: 1 addition & 1 deletion src/BenchmarkDotNet/Helpers/SectionsHelper.cs
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@ public static Dictionary<string, string> ParseSection(string? content, char sepa
var list = content?.Split(['\r', '\n'], StringSplitOptions.RemoveEmptyEntries);
if (list != null)
foreach (string line in list)
if (line.IndexOf(separator) != -1)
if (line.Contains(separator))
{
var lineParts = line.Split(separator);
if (lineParts.Length >= 2)
Expand Down
2 changes: 1 addition & 1 deletion src/BenchmarkDotNet/Helpers/UserInteractionHelper.cs
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,7 @@ internal static class UserInteractionHelper
/// </remarks>
public static string EscapeCommandExample(string input)
{
return !OsDetector.IsWindows() && input.IndexOf('*') >= 0 ? $"'{input}'" : input;
return !OsDetector.IsWindows() && input.Contains('*') ? $"'{input}'" : input;
}
}
}
2 changes: 1 addition & 1 deletion src/BenchmarkDotNet/Loggers/ConsoleLogger.cs
Original file line number Diff line number Diff line change
Expand Up @@ -71,7 +71,7 @@ private void Write(LogKind logKind, Action<string> write, string text)
}

private ConsoleColor GetColor(LogKind logKind) =>
colorScheme.ContainsKey(logKind) ? colorScheme[logKind] : DefaultColor;
colorScheme.TryGetValue(logKind, out ConsoleColor value) ? value : DefaultColor;

private static Dictionary<LogKind, ConsoleColor> CreateColorfulScheme() =>
new Dictionary<LogKind, ConsoleColor>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -157,7 +157,7 @@ public string ToString(Func<double, string> formatter, bool showLevel = true)
builder.Append(formatter(Lower));
builder.Append("; ");
builder.Append(formatter(Upper));
builder.Append("]");
builder.Append(']');
builder.Append(GetLevelHint(showLevel));
return builder.ToString();
}
Expand Down
2 changes: 1 addition & 1 deletion src/BenchmarkDotNet/Mathematics/PercentileValues.cs
Original file line number Diff line number Diff line change
Expand Up @@ -52,7 +52,7 @@ public string ToString(Func<double, string> formatter)
builder.Append(formatter(P50));
builder.Append("]; [P100: ");
builder.Append(formatter(P100));
builder.Append("]");
builder.Append(']');
return builder.ToString();
}

Expand Down
Loading