BenchmarkDotNet के साथ Benchmarking
BenchmarkDotNet के साथ सटीक micro-benchmarks लिखें, throughput और allocations का विश्लेषण करें तथा सामान्य समस्याओं से बचें।
BenchmarkDotNet के साथ Benchmarking, CoddyKit पर C# अकादमी का एक निःशुल्क पाठ है। यह 4 में से 4वाँ पाठ है। आप नीचे पूरा पाठ निःशुल्क पढ़ सकते हैं—फिर अंतर्निहित कोड संपादक और 24/7 एआई ट्यूटर के साथ ब्राउज़र में इसका व्यावहारिक अभ्यास कर सकते हैं। यह C# अकादमी सीखने के मार्ग का हिस्सा है और आपकी प्रगति वेब तथा CoddyKit ऐप पर सिंक होती रहती है। C# अकादमी पाठ्यक्रम में कुल 4 पाठ शामिल हैं।
BenchmarkDotNet क्यों
माइक्रो-बेंचमार्किंग आश्चर्यजनक रूप से कठिन है: JIT वार्म-अप, GC विराम, CPU कैश और OS शेड्यूलिंग सभी शोर उत्पन्न करते हैं। BenchmarkDotNet यह सब अपने-आप संभालता है और सांख्यिकीय रूप से विश्वसनीय परिणाम देता है।
इंस्टॉलेशन और पहला बेंचमार्क
NuGet पैकेज जोड़ें, [Benchmark] विधियों वाली एक क्लास बनाएँ और BenchmarkRunner.Run के साथ चलाएँ। बेंचमार्क हमेशा Release मोड में चलाएँ।
// dotnet add package BenchmarkDotNet
using BenchmarkDotNet.Attributes;
using BenchmarkDotNet.Running;
[MemoryDiagnoser] // report allocations
[RankColumn] // rank methods by speed
public class StringBenchmarks
{
[Benchmark(Baseline = true)]
public string Concatenation()
{
var s = "";
for (int i = 0; i < 100; i++) s += i;
return s;
}
[Benchmark]
public string StringBuilder()
{
var sb = new System.Text.StringBuilder();
for (int i = 0; i < 100; i++) sb.Append(i);
return sb.ToString();
}
}
// Program.cs (must run as Release):
BenchmarkRunner.Run<StringBenchmarks>();परिणाम तालिका पढ़ना
BenchmarkDotNet औसत समय, त्रुटि, मानक विचलन, अनुपात और मेमोरी आवंटन वाली परिणाम तालिका प्रिंट करता है। प्रत्येक कॉलम की व्याख्या इस प्रकार करें।
// Example output:
// | Method | Mean | Error | StdDev | Ratio | Alloc |
// |-------------- |---------:|--------:|--------:|------:|------:|
// | Concatenation | 4,210 ns | 81 ns | 76 ns | 1.00 | 6.4KB |
// | StringBuilder | 312 ns | 4 ns | 4 ns | 0.07 | 1.6KB |
// Mean: average time per operation
// Error: half of 99.9% confidence interval
// StdDev: standard deviation — high value = noisy environment
// Ratio: relative to Baseline=true method (1.00)
// Alloc: managed heap allocated per operation
// Rule of thumb:
// Error should be < 5% of Mean for reliable results
// Run on an isolated machine (no background tasks)पैरामीटरयुक्त बेंचमार्क
कई इनपुट आकारों पर बेंचमार्क चलाने के लिए [Params] का उपयोग करें। BenchmarkDotNet हर संयोजन को चलाता है और प्रत्येक पैरामीटर मान के लिए अलग पंक्ति बनाता है।
[MemoryDiagnoser]
public class SearchBenchmarks
{
[Params(10, 100, 1000, 10000)]
public int N;
private int[] _data = Array.Empty<int>();
[GlobalSetup]
public void Setup()
=> _data = Enumerable.Range(0, N).ToArray();
[Benchmark]
public bool LinearSearch()
=> Array.IndexOf(_data, N - 1) >= 0;
[Benchmark]
public bool BinarySearch()
=> Array.BinarySearch(_data, N - 1) >= 0;
}सेटअप और सफ़ाई
एक बार का सेटअप या प्रत्येक पुनरावृत्ति का सेटअप/सफ़ाई चलाने के लिए जीवनचक्र एट्रिब्यूट्स का उपयोग करें। इससे सेटअप की लागत मापे गए बेंचमार्क समय में शामिल नहीं होती।
[MemoryDiagnoser]
public class DbQueryBenchmarks
{
private NpgsqlConnection _conn = null!;
private NpgsqlCommand _cmd = null!;
[GlobalSetup] // runs once before all benchmarks
public void Setup()
{
_conn = new NpgsqlConnection("...");
_conn.Open();
_cmd = new NpgsqlCommand("SELECT id FROM orders LIMIT 100", _conn);
}
[IterationSetup] // runs before EACH benchmark iteration
public void IterationSetup() { /* per-iteration prep */ }
[Benchmark]
public int QueryOrders() => (int)_cmd.ExecuteScalar()!;
[GlobalCleanup] // runs once after all benchmarks
public void Cleanup() { _cmd.Dispose(); _conn.Dispose(); }
}मेमोरी निदान
[MemoryDiagnoser] प्रत्येक ऑपरेशन के लिए प्रबंधित हीप के आवंटन की रिपोर्ट करता है। बेंचमार्क के दौरान GC के व्यवहार को नियंत्रित करने के लिए इसे [GcForce] विकल्पों के साथ उपयोग करें।
[MemoryDiagnoser] // adds Alloc column to results
public class AllocationBenchmarks
{
[Benchmark]
public int[] AllocateArray() => new int[1000];
[Benchmark]
public Span<int> UseStackalloc()
{
Span<int> span = stackalloc int[1000];
return span; // WARN: for illustration; don't return stackalloc
}
[Benchmark]
public int[] ArrayPoolRent()
{
var arr = System.Buffers.ArrayPool<int>.Shared.Rent(1000);
System.Buffers.ArrayPool<int>.Shared.Return(arr);
return arr;
}
}निदानकर्ता: ETW और डिसअसेंबली
BenchmarkDotNet कई निदानकर्ताओं का समर्थन करता है। DisassemblyDiagnoser वास्तविक नेटिव असेंबली आउटपुट दिखाता है, जो JIT अनुकूलनों की जाँच के लिए बिल्कुल उपयुक्त है।
using BenchmarkDotNet.Diagnosers;
[DisassemblyDiagnoser( // show generated ASM
maxDepth: 2,
printSource: true,
exportGithubMarkdown: true)]
[MemoryDiagnoser]
public class VectorizationBenchmarks
{
private float[] _data = new float[1024];
[Benchmark]
public float SumScalar()
{
float sum = 0;
foreach (var v in _data) sum += v;
return sum;
}
[Benchmark]
public float SumVectorized()
=> System.Numerics.Vector<float>.Count > 1
? VectorSum(_data)
: SumScalar();
}जॉब कॉन्फ़िगरेशन
जॉब बेंचमार्क के निष्पादन वातावरण को नियंत्रित करते हैं — वार्म-अप पुनरावृत्तियों की संख्या, प्रत्येक पुनरावृत्ति में आह्वानों की संख्या, .NET रनटाइम संस्करण और JIT सेटिंग्स। पहले से परिभाषित या कस्टम जॉब का उपयोग करें।
using BenchmarkDotNet.Jobs;
// Compare JIT vs Native AOT performance:
[SimpleJob(RuntimeMoniker.Net90)] // .NET 9 JIT
[SimpleJob(RuntimeMoniker.NativeAot90)] // .NET 9 AOT
[MemoryDiagnoser]
public class RuntimeComparison
{
[Benchmark]
public string SerializeJson()
{
var obj = new { Name = "Alice", Age = 30 };
return System.Text.Json.JsonSerializer.Serialize(obj);
}
}
// Custom job for more warmup:
[Config(typeof(MyConfig))]
public class PreciseBenchmarks
{
private class MyConfig : ManualConfig
{
public MyConfig()
=> AddJob(Job.Default.WithWarmupCount(5).WithIterationCount(20));
}
}परिणाम निर्यात करना
BenchmarkDotNet परिणामों को कई फ़ॉर्मैट में निर्यात करता है — Markdown (GitHub PR के लिए), CSV (स्प्रेडशीट के लिए), JSON और HTML चार्ट। निर्यात विकल्प जॉब कॉन्फ़िगरेशन में सेट किए जाते हैं।
using BenchmarkDotNet.Exporters;
using BenchmarkDotNet.Exporters.Csv;
[Config(typeof(ExportConfig))]
public class MyBenchmarks { /* ... */ }
public class ExportConfig : ManualConfig
{
public ExportConfig()
{
AddExporter(MarkdownExporter.GitHub);
AddExporter(CsvExporter.Default);
AddExporter(HtmlExporter.Default);
// Results in: BenchmarkDotNet.Artifacts/results/
}
}
// CLI usage to run specific benchmarks:
// dotnet run -c Release -- --filter "*StringBenchmarks*"
// dotnet run -c Release -- --list all (list all benchmarks)वास्तविक उदाहरण: अनुकूलन से पहले और बाद में
प्रदर्शन अनुकूलन की पुष्टि करने के लिए BenchmarkDotNet का उपयोग — सरल, पूल-आधारित और Span-आधारित तरीकों की तुलना।
[MemoryDiagnoser]
[RankColumn]
public class ParsingBenchmarks
{
private const string Input = "2025-06-15T08:30:00Z";
[Benchmark(Baseline = true)]
public DateTime ParseViaString()
=> DateTime.Parse(Input);
[Benchmark]
public DateTime ParseExact()
=> DateTime.ParseExact(Input,
"yyyy-MM-ddTHH:mm:ssZ",
System.Globalization.CultureInfo.InvariantCulture);
[Benchmark]
public bool TryParse()
=> DateTime.TryParseExact(Input.AsSpan(),
"yyyy-MM-ddTHH:mm:ssZ",
System.Globalization.CultureInfo.InvariantCulture,
System.Globalization.DateTimeStyles.None,
out _);
}त्वरित जाँच
BenchmarkDotNet बेंचमार्क को dotnet run -c Release के साथ चलाना क्यों आवश्यक है?
पुनरावलोकन: BenchmarkDotNet के साथ बेंचमार्किंग
मुख्य बातें:
- NuGet के माध्यम से इंस्टॉल करें; विधियों को
[Benchmark]से चिह्नित करें;dotnet run -c Releaseके साथ चलाएँ [MemoryDiagnoser]: आवंटन कॉलम जोड़ता है;[RankColumn]: गति के आधार पर क्रम निर्धारित करता है[Params]: एल्गोरिदम की जटिलता जानने के लिए कई इनपुट आकारों पर चलाएँ[GlobalSetup]/[GlobalCleanup]: मापे गए समय के बाहर होने वाला एक बार का सेटअप[DisassemblyDiagnoser]: JIT अनुकूलनों की जाँच के लिए बनाए गए नेटिव ASM का निरीक्षण करें- .NET 9 JIT, Native AOT और अलग-अलग पुनरावृत्ति संख्याओं की तुलना करने के लिए जॉब का उपयोग करें
एआई शिक्षक के साथ C# सीखें — निःशुल्क
अपने ब्राउज़र में वास्तविक कोड लिखें और चलाएँ, चौबीसों घंटे एआई शिक्षक से तुरंत सहायता पाएँ, और वेब या ऐप पर वहीं से शुरू करें जहाँ आपने छोड़ा था।
- पाठ्यक्रम
- 93
- पाठ
- 346
अक्सर पूछे जाने वाले प्रश्न
क्या “BenchmarkDotNet के साथ Benchmarking” पाठ निःशुल्क है?
हाँ—“BenchmarkDotNet के साथ Benchmarking” का पूरा पाठ यहाँ वेब पर निःशुल्क पढ़ा जा सकता है। इंटरैक्टिव अभ्यास (अंतर्निहित कोड संपादक और 24/7 एआई ट्यूटर) करने और C# अकादमी पाठ्यक्रम का बाकी हिस्सा अनलॉक करने के लिए CoddyKit PRO लें। C# अकादमी पाठ्यक्रम में कुल 4 पाठ शामिल हैं।
“BenchmarkDotNet के साथ Benchmarking” में मैं क्या सीखूँगा?
BenchmarkDotNet के साथ सटीक micro-benchmarks लिखें, throughput और allocations का विश्लेषण करें तथा सामान्य समस्याओं से बचें। आप ब्राउज़र में सीधे चलाए जाने वाले व्यावहारिक कोड के साथ C# अकादमी का अभ्यास करते हैं, और पाठ पूरा करते समय 24/7 एआई ट्यूटर आपके प्रश्नों के उत्तर देता है।
क्या C# अकादमी शुरू करने के लिए मुझे किसी अनुभव की आवश्यकता है?
पहले के अनुभव की आवश्यकता नहीं है। CoddyKit पर C# अकादमी शुरुआती से लेकर उन्नत शिक्षार्थियों तक सभी के लिए व्यवस्थित किया गया है, इसलिए आप यहीं से या शुरुआत से सीखना शुरू कर सकते हैं और अपनी गति से आगे बढ़ सकते हैं। यह 4 में से 4वाँ पाठ है।
“BenchmarkDotNet के साथ Benchmarking” पाठ पूरा करने में कितना समय लगता है?
CoddyKit का अधिकांश पाठ लगभग 5–10 मिनट में पूरा हो जाता है। हर पाठ छोटा और संवादात्मक है, इसलिए आप लगातार प्रगति करते हैं और वेब या ऐप पर वहीं से सीखना जारी रख सकते हैं जहाँ आपने छोड़ा था।
क्या मैं इस C# अकादमी पाठ में कोड लिख और चला सकता हूँ?
हाँ। हर C# अकादमी पाठ में एक अंतर्निर्मित कोड संपादक शामिल है, जिससे आप सीधे अपने ब्राउज़र में वास्तविक कोड लिख और चला सकते हैं और तुरंत एआई प्रतिक्रिया पा सकते हैं—स्थानीय सेटअप की आवश्यकता नहीं है।
इस पाठ्यक्रम के सभी पाठ
- Native AOT Compilation
- Trimming और Reflection की सीमाएँ
- ReadyToRun और Tiered Compilation
- BenchmarkDotNet के साथ Benchmarking