BenchMarkDotNet ช่วยให้คุณเปลี่ยนวิธีการเป็นมาตรฐานติดตามประสิทธิภาพของพวกเขาและแบ่งปันการทดลองวัดที่ทำซ้ำได้ มันไม่ยากไปกว่าการเขียนการทดสอบหน่วย! ภายใต้ประทุนมันมีเวทมนตร์มากมายที่รับประกันผลลัพธ์ที่เชื่อถือได้และแม่นยำด้วยเครื่องยนต์สถิติ perfolizer BenchMarkDotNet ปกป้องคุณจากความผิดพลาดในการเปรียบเทียบที่เป็นที่นิยมและเตือนคุณหากมีบางอย่างผิดปกติกับการออกแบบมาตรฐานหรือการวัดที่ได้รับ ผลลัพธ์จะถูกนำเสนอในรูปแบบที่ใช้งานง่ายซึ่งเน้นข้อเท็จจริงที่สำคัญทั้งหมดเกี่ยวกับการทดลองของคุณ BenchMarkDotNet ได้รับการยอมรับจากโครงการ GitHub มากกว่า 22,000 โครงการรวมถึง. NET Runtime, .NET Compiler, .NET Performance และอื่น ๆ อีกมากมาย
เป็นเรื่องง่ายที่จะเริ่มเขียนมาตรฐานตรวจสอบตัวอย่างต่อไปนี้ (เวอร์ชันคัดลอกได้อยู่ที่นี่):
[ SimpleJob ( RuntimeMoniker . Net472 , baseline : true ) ]
[ SimpleJob ( RuntimeMoniker . NetCoreApp30 ) ]
[ SimpleJob ( RuntimeMoniker . NativeAot70 ) ]
[ SimpleJob ( RuntimeMoniker . Mono ) ]
[ RPlotExporter ]
public class Md5VsSha256
{
private SHA256 sha256 = SHA256 . Create ( ) ;
private MD5 md5 = MD5 . Create ( ) ;
private byte [ ] data ;
[ Params ( 1000 , 10000 ) ]
public int N ;
[ GlobalSetup ]
public void Setup ( )
{
data = new byte [ N ] ;
new Random ( 42 ) . NextBytes ( data ) ;
}
[ Benchmark ]
public byte [ ] Sha256 ( ) => sha256 . ComputeHash ( data ) ;
[ Benchmark ]
public byte [ ] Md5 ( ) => md5 . ComputeHash ( data ) ;
}BenchMarkDotNet เรียกใช้มาตรฐานโดยอัตโนมัติในทุกช่วงเวลารวมการวัดและพิมพ์ตารางสรุปด้วยข้อมูลที่สำคัญที่สุด:
BenchmarkDotNet=v0.12.0, OS=Windows 10.0.17763.805 (1809/October2018Update/Redstone5)
Intel Core i7-7700K CPU 4.20GHz (Kaby Lake), 1 CPU, 8 logical and 4 physical cores
[ Host ] : .NET Framework 4.7.2 (4.7.3468.0), X64 RyuJIT
Net472 : .NET Framework 4.7.2 (4.7.3468.0), X64 RyuJIT
NetCoreApp30 : .NET Core 3.0.0 (CoreCLR 4.700.19.46205, CoreFX 4.700.19.46214), X64 RyuJIT
NativeAot70 : .NET 7.0.0-preview.4.22172.7, X64 NativeAOT
Mono : Mono 6.4.0 (Visual Studio), X64
| Method | Runtime | N | Mean | Error | StdDev | Ratio |
| ------- | -------------- | ------ | -----------: | ----------: | ----------: | ------: |
| Sha256 | .NET 4.7.2 | 1000 | 7.735 us | 0.1913 us | 0.4034 us | 1.00 |
| Sha256 | .NET Core 3.0 | 1000 | 3.989 us | 0.0796 us | 0.0745 us | 0.50 |
| Sha256 | NativeAOT 7.0 | 1000 | 4.091 us | 0.0811 us | 0.1562 us | 0.53 |
| Sha256 | Mono | 1000 | 13.117 us | 0.2485 us | 0.5019 us | 1.70 |
| | | | | | | |
| Md5 | .NET 4.7.2 | 1000 | 2.872 us | 0.0552 us | 0.0737 us | 1.00 |
| Md5 | .NET Core 3.0 | 1000 | 1.848 us | 0.0348 us | 0.0326 us | 0.64 |
| Md5 | NativeAOT 7.0 | 1000 | 1.817 us | 0.0359 us | 0.0427 us | 0.63 |
| Md5 | Mono | 1000 | 3.574 us | 0.0678 us | 0.0753 us | 1.24 |
| | | | | | | |
| Sha256 | .NET 4.7.2 | 10000 | 74.509 us | 1.5787 us | 4.6052 us | 1.00 |
| Sha256 | .NET Core 3.0 | 10000 | 36.049 us | 0.7151 us | 1.0025 us | 0.49 |
| Sha256 | NativeAOT 7.0 | 10000 | 36.253 us | 0.7076 us | 0.7571 us | 0.49 |
| Sha256 | Mono | 10000 | 116.350 us | 2.2555 us | 3.0110 us | 1.58 |
| | | | | | | |
| Md5 | .NET 4.7.2 | 10000 | 17.308 us | 0.3361 us | 0.4250 us | 1.00 |
| Md5 | .NET Core 3.0 | 10000 | 15.726 us | 0.2064 us | 0.1930 us | 0.90 |
| Md5 | NativeAOT 7.0 | 10000 | 15.627 us | 0.2631 us | 0.2461 us | 0.89 |
| Md5 | Mono | 10000 | 30.205 us | 0.5868 us | 0.6522 us | 1.74 |
ข้อมูลที่วัดได้สามารถส่งออกไปยังรูปแบบที่แตกต่างกัน (MD, HTML, CSV, XML, JSON ฯลฯ ) รวมถึงแปลง:
Runtimes ที่รองรับ: .NET 5+, .NET Framework 4.6.1+, .NET Core 3.1+, Mono, Nativeaot
ภาษาที่รองรับ: C#, F#, Visual Basic
ระบบปฏิบัติการที่รองรับ: Windows, Linux, MacOS
สถาปัตยกรรมที่ได้รับการสนับสนุน: x86, x64, ARM, ARM64, WASM และ LOONGARCH64
BenchMarkDotNet มีคุณสมบัติมากมายที่จำเป็นในการตรวจสอบประสิทธิภาพที่ครอบคลุม สี่ด้านกำหนดการออกแบบคุณสมบัติเหล่านี้: ความเรียบง่าย ระบบอัตโนมัติ ความน่าเชื่อถือ และ ความเป็นมิตร
คุณไม่ควรเป็นวิศวกรประสิทธิภาพที่มีประสบการณ์หากคุณต้องการเขียนมาตรฐาน คุณสามารถออกแบบการทดลองประสิทธิภาพที่ซับซ้อนมากในรูปแบบการประกาศโดยใช้ APIs อย่างง่าย
ตัวอย่างเช่นหากคุณต้องการกำหนดเกณฑ์มาตรฐานของคุณให้ทำเครื่องหมายฟิลด์หรือคุณสมบัติที่มี [Params(1, 2, 3)] : BenchmarkDotNet จะระบุค่าที่ระบุทั้งหมดและเรียกใช้มาตรฐานสำหรับแต่ละกรณี หากคุณต้องการเปรียบเทียบเกณฑ์มาตรฐานกับกันและกันให้ทำเครื่องหมายหนึ่งในเกณฑ์มาตรฐานเป็นพื้นฐานผ่าน [Benchmark(Baseline = true)] : BenchMarkDotNet จะเปรียบเทียบกับเกณฑ์มาตรฐานอื่น ๆ ทั้งหมด หากคุณต้องการเปรียบเทียบประสิทธิภาพในสภาพแวดล้อมที่แตกต่างกันให้ใช้งาน ตัวอย่างเช่นคุณสามารถเรียกใช้มาตรฐานทั้งหมดบน. NET Core 3.1 และ Mono ผ่าน [SimpleJob(RuntimeMoniker.NetCoreApp31)] และ [SimpleJob(RuntimeMoniker.Mono)]
หากคุณไม่ชอบแอตทริบิวต์คุณสามารถโทรหา API ส่วนใหญ่ผ่านสไตล์ที่คล่องแคล่วและเขียนรหัสเช่นนี้:
ManualConfig . CreateEmpty ( ) // A configuration for our benchmarks
. AddJob ( Job . Default // Adding first job
. WithRuntime ( ClrRuntime . Net472 ) // .NET Framework 4.7.2
. WithPlatform ( Platform . X64 ) // Run as x64 application
. WithJit ( Jit . LegacyJit ) // Use LegacyJIT instead of the default RyuJIT
. WithGcServer ( true ) // Use Server GC
) . AddJob ( Job . Default // Adding second job
. AsBaseline ( ) // It will be marked as baseline
. WithEnvironmentVariable ( "Key" , "Value" ) // Setting an environment variable
. WithWarmupCount ( 0 ) // Disable warm-up stage
) ;หากคุณต้องการประสบการณ์บรรทัดคำสั่งคุณสามารถกำหนดค่ามาตรฐานของคุณผ่านอาร์กิวเมนต์คอนโซลในแอปพลิเคชันคอนโซลใด ๆ (ไม่รองรับแอปพลิเคชันประเภทอื่น ๆ )
เกณฑ์มาตรฐานที่เชื่อถือได้มักจะมีรหัสหม้อไอน้ำจำนวนมาก
ลองคิดดูว่าคุณควรทำอะไรในกรณีทั่วไป ก่อนอื่นคุณควรทำการทดลองนำร่องและกำหนดจำนวนวิธีการที่ดีที่สุด ถัดไปคุณควรดำเนินการวนซ้ำหลายครั้งและตรวจสอบให้แน่ใจว่าเกณฑ์มาตรฐานของคุณประสบความสำเร็จในสถานะที่มั่นคง หลังจากนั้นคุณควรดำเนินการซ้ำหลักและคำนวณสถิติพื้นฐานบางอย่าง หากคุณคำนวณค่าบางอย่างในเกณฑ์มาตรฐานของคุณคุณควรใช้มันเพื่อป้องกันการกำจัดรหัสที่ตายแล้ว หากคุณใช้ลูปคุณควรใส่ใจเกี่ยวกับผลกระทบของลูปคลายต่อผลลัพธ์ของคุณ (ซึ่งอาจขึ้นอยู่กับสถาปัตยกรรมโปรเซสเซอร์) เมื่อคุณได้รับผลลัพธ์คุณควรตรวจสอบคุณสมบัติพิเศษบางอย่างของการกระจายประสิทธิภาพที่ได้รับเช่น multimodality หรือค่าผิดปกติที่สูงมาก คุณควรประเมินค่าใช้จ่ายของโครงสร้างพื้นฐานและหักจากผลลัพธ์ของคุณ หากคุณต้องการทดสอบสภาพแวดล้อมหลายอย่างคุณควรทำการวัดในแต่ละสภาพแวดล้อมและรวมผลลัพธ์ด้วยตนเอง
หากคุณเขียนรหัสนี้ตั้งแต่เริ่มต้นมันง่ายที่จะทำผิดพลาดและทำให้เสียการวัดของคุณ โปรดทราบว่าเป็นรายการตรวจสอบเต็มรูปแบบที่สั้นลงที่คุณควรทำตามในระหว่างการเปรียบเทียบ: มีข้อผิดพลาดที่ซ่อนอยู่อีกมากมายที่ควรจัดการอย่างเหมาะสม โชคดีที่คุณไม่ควรกังวลเพราะ BenchmarkDotnet จะทำสิ่งที่น่าเบื่อและใช้เวลานานสำหรับคุณ
ยิ่งไปกว่านั้นห้องสมุดสามารถช่วยคุณในงานขั้นสูงที่คุณอาจต้องการดำเนินการในระหว่างการสอบสวน ตัวอย่างเช่น BenchMarkDotNet สามารถวัดปริมาณการใช้งานหน่วยความจำที่ได้รับการจัดการและการพิมพ์รายชื่อการถอดชิ้นส่วนสำหรับเกณฑ์มาตรฐานของคุณ
เกณฑ์มาตรฐานที่เขียนด้วยมือจำนวนมากสร้างตัวเลขที่ไม่ถูกต้องซึ่งนำไปสู่การตัดสินใจทางธุรกิจที่ไม่ถูกต้อง BenchMarkDotNet ปกป้องคุณจากข้อผิดพลาดส่วนใหญ่และช่วยให้บรรลุความแม่นยำในการวัดที่สูง
คุณไม่ควรกังวลเกี่ยวกับการเรียกใช้วิธีการที่สมบูรณ์แบบจำนวนการอุ่นเครื่องและการทำซ้ำที่เกิดขึ้นจริง: BenchmarkDotnet พยายามเลือกพารามิเตอร์การเปรียบเทียบที่ดีที่สุดและได้รับการแลกเปลี่ยนที่ดีระหว่างการคาดการณ์การวัดและระยะเวลาทั้งหมดของการทำงานมาตรฐานทั้งหมด ดังนั้นคุณไม่ควรใช้หมายเลขเวทย์มนตร์ใด ๆ (เช่น "เราควรทำการวนซ้ำ 100 ครั้งที่นี่") ห้องสมุดจะทำเพื่อคุณตามค่าของการวัดทางสถิติ
BenchMarkDotNet ยังป้องกันการเปรียบเทียบการเปรียบเทียบของแอสเซมบลีที่ไม่เหมาะสมที่สร้างขึ้นโดยใช้โหมดการดีบักเนื่องจากผลลัพธ์ที่สอดคล้องกันจะไม่น่าเชื่อถือ ห้องสมุดจะพิมพ์คำเตือนหากคุณมีดีบักเกอร์ที่แนบมาหากคุณใช้ไฮเปอร์ไวเซอร์ (Hyperv, VMware, VirtualBox) หรือหากคุณมีปัญหาอื่น ๆ กับสภาพแวดล้อมปัจจุบัน
ในช่วง 6 ปีของการพัฒนาเราประสบปัญหาต่าง ๆ มากมายที่อาจทำให้การวัดของคุณเสีย ภายใน BenchmarkDotnet มีฮิวริสติกจำนวนมากตรวจสอบแฮ็กและกลเม็ดที่ช่วยให้คุณเพิ่มความน่าเชื่อถือของผลลัพธ์
การวิเคราะห์ข้อมูลประสิทธิภาพเป็นกิจกรรมที่ใช้เวลานานซึ่งต้องใช้ความเอาใจใส่ความรู้และประสบการณ์ BenchMarkDotNet ดำเนินการส่วนหลักของการวิเคราะห์นี้สำหรับคุณและนำเสนอผลลัพธ์ในรูปแบบที่ใช้งานง่าย
หลังจากการทดลองคุณจะได้รับตารางสรุปที่มีข้อมูลที่เป็นประโยชน์มากมายเกี่ยวกับเกณฑ์มาตรฐานที่ดำเนินการ โดยค่าเริ่มต้นจะมีเฉพาะคอลัมน์ที่สำคัญที่สุด แต่สามารถปรับแต่งได้ง่าย ชุดคอลัมน์มีการปรับตัวและขึ้นอยู่กับคำจำกัดความมาตรฐานและค่าที่วัดได้ ตัวอย่างเช่นหากคุณทำเครื่องหมายหนึ่งในเกณฑ์มาตรฐานเป็นพื้นฐานคุณจะได้รับคอลัมน์เพิ่มเติมที่จะช่วยให้คุณเปรียบเทียบเกณฑ์มาตรฐานทั้งหมดกับพื้นฐาน โดยค่าเริ่มต้นมันจะแสดงคอลัมน์เฉลี่ยเสมอ แต่ถ้าเราตรวจพบความแตกต่างอย่างมากระหว่างค่าเฉลี่ยและค่ามัธยฐานทั้งสองคอลัมน์จะถูกนำเสนอ
BenchMarkDotNet พยายามค้นหาคุณสมบัติที่ผิดปกติของการแจกแจงประสิทธิภาพของคุณและพิมพ์ข้อความดีๆเกี่ยวกับเรื่องนี้ ตัวอย่างเช่นมันจะเตือนคุณในกรณีที่มีการกระจายหลายรูปแบบหรือค่าผิดปกติสูง ในกรณีนี้คุณสามารถเลื่อนผลลัพธ์ขึ้นและตรวจสอบฮิสโตแกรมสไตล์ ascii สำหรับการแจกแจงแต่ละครั้งหรือสร้างพล็อต PNG ที่สวยงามโดยใช้ [RPlotExporter]
BenchMarkDotNet ไม่ได้มีข้อมูลมากเกินไป มันแสดงเฉพาะข้อมูลที่สำคัญขึ้นอยู่กับผลลัพธ์ของคุณ: ช่วยให้คุณสามารถสรุปสรุปขนาดเล็กสำหรับกรณีดั้งเดิมและขยายออกสำหรับกรณีที่ซับซ้อนเท่านั้น แน่นอนคุณสามารถขอสถิติและการสร้างภาพข้อมูลเพิ่มเติมได้ด้วยตนเอง หากคุณไม่ปรับแต่งมุมมองสรุปการนำเสนอเริ่มต้นจะเป็นมิตรกับผู้ใช้มากที่สุด -
BenchMarkDotNet ไม่ใช่กระสุนเงินที่ทำให้เกณฑ์มาตรฐานทั้งหมดของคุณถูกต้องและวิเคราะห์การวัดสำหรับคุณอย่างน่าอัศจรรย์ แม้ว่าคุณจะใช้ไลบรารีนี้คุณก็ยังควรรู้วิธีการออกแบบการทดลองมาตรฐานและวิธีการสรุปที่ถูกต้องตามข้อมูลดิบ หากคุณต้องการทราบข้อมูลเพิ่มเติมเกี่ยวกับวิธีการเปรียบเทียบและแนวทางปฏิบัติที่ดีขอแนะนำให้อ่านหนังสือโดย Andrey Akinshin (BenchmarkDotnet Project Project): "Pro .NET Benchmarking" ใช้คู่มือเชิงลึกนี้เพื่อออกแบบมาตรฐานอย่างถูกต้องวัดตัวชี้วัดประสิทธิภาพที่สำคัญของแอปพลิเคชัน. NET และวิเคราะห์ผลลัพธ์ หนังสือเล่มนี้นำเสนอกรณีศึกษาหลายสิบกรณีเพื่อช่วยให้คุณเข้าใจหัวข้อการเปรียบเทียบที่ซับซ้อน คุณจะหลีกเลี่ยงข้อผิดพลาดทั่วไปควบคุมความถูกต้องของการวัดของคุณและปรับปรุงประสิทธิภาพของซอฟต์แวร์ของคุณ
BenchMarkDotNet เป็นห้องสมุดที่มีคุณสมบัติเต็มรูปแบบที่มีความเสถียรซึ่งช่วยให้สามารถตรวจสอบประสิทธิภาพในระดับมืออาชีพได้ และมันยังคงพัฒนาต่อไป! เราเพิ่มคุณสมบัติใหม่ตลอดเวลา แต่เรามีความคิดที่ยอดเยี่ยมมากเกินไป ความช่วยเหลือใด ๆ จะได้รับการชื่นชม คุณสามารถพัฒนาคุณสมบัติใหม่แก้ไขข้อบกพร่องปรับปรุงเอกสารหรือทำสิ่งดีๆอื่น ๆ
หากคุณต้องการมีส่วนร่วมให้ตรวจสอบคู่มือที่มีส่วนร่วมและปัญหาที่เพิ่มขึ้น หากคุณมีแนวคิดใหม่หรือต้องการบ่นเกี่ยวกับข้อบกพร่องอย่าลังเลที่จะสร้างปัญหาใหม่ มาสร้างเครื่องมือที่ดีที่สุดสำหรับการเปรียบเทียบกัน!
โครงการนี้ได้นำจรรยาบรรณที่กำหนดโดยพันธสัญญาผู้สนับสนุนเพื่อชี้แจงพฤติกรรมที่คาดหวังในชุมชนของเรา สำหรับข้อมูลเพิ่มเติมโปรดดูจรรยาบรรณ. NET
BenchMarkDotNet ได้รับการสนับสนุนโดย AWS Open Software Software Fund