เปรียบเทียบความเร็วของฟังก์ชันด้วย XUnit + Expecto

wk
1 min readOct 7, 2018

--

โจทย์ คือ มีฟังก์ชัน 2 ฟังก์ชันที่ทำหน้าที่เหมือนกัน คือ ถ้าใส่ Input เดียวกันก็จะได้ Output เดียวกัน ต้องการทดสอบว่าฟังก์ชันแรก เร็วกว่าอีกฟังก์ชันหรือไม่ โดยให้แสดงผลทดสอบพร้อมกับการรัน Unit test

ตัวอย่าง

public class Lib {
public static int ForSum(int x) {
var sum = 0;
for (int i = 0; i < x; i++) {
sum += i;
}
return sum;
}
public static int LinqSum(int x) =>
Enumerable.Range(0, x).Sum();
}

ต้องการทดสอบว่าฟังก์ชัน ForSum เร็วกว่า LinqSum จริงหรือไม่ โดยให้แสดงด้วยว่าฟังก์ชันแรกเร็วกว่ากี่เปอร์เซ็นต์

สร้างโปรเจคและติดตั้ง Package

dotnet new xunit --language C# --ouptut src/SpeedTests
dotnet add src/SpeedTests/SpeedTests.csproj package Expecto

เขียน Unit Test

ให้เขียน Test แบบปกติ คือใช้ Attribute Fact ของ XUnit และทดสอบความเร็วด้วยฟังก์ชัน IsFasterThan ของ Expecto

using Xunit;
using System.Linq;
using Expecto.CSharp;
using Xunit.Abstractions;
public class SpeedTest {
private readonly ITestOutputHelper output;
public SpeedTest(ITestOutputHelper output) {
this.output = output;
}
[Fact]
public void TestSum() {
var result =
Function.IsFasterThan(
() => Lib.ForSum(100),
() => Lib.LinqSum(100),
"For is faster than LINQ",
out var message
);
Assert.True(result, message);
output.WriteLine(message);
}
}

จากโค้ด ในบรรทัดสุดท้ายมีการใช้ ฟังก์ชัน WriteLine ของ ITestOutputHelper เนื่องจากต้องการให้แสดงผลเป็นเปอร์เซ็นต์ ออกมาด้วย

รัน Unit Test

dotnet test src/SpeedTests/SpeedTests.csproj

จะได้ผลลัพทธ์ ดังภาพ มีผลการรัน Unit test และความเร็วของทั้งสองฟังก์ชัน

ForSum เร็วกว่า LinqSum 80%

สามารถโหลดโค้ดในตัวอย่างจากลิงก์นี้ SpeedTests

--

--

No responses yet