จะรู้ได้ไงว่า function ช้าเร็วกว่ากันใน Flutter — Dart ด้วย Benchmark
จะรู้ได้ไงว่า function ช้าเร็วกว่ากัน ถ้าเอาง่าย ๆ ก็เราแค่สร้าง datetime หัวท้ายลบกันและเทียบกันเลยก็ได้ครับจบการรายงาน แต่ๆๆๆ มันไม่เท่ วันนี้เลยมาลอง lib Benchmark กันดีกว่า ซึ่ง lib มีชื่อว่า benchmark_harness
เราจะมาลอง เขียนเปรียบเทียบ function fibonacci สองแบบระหว่าง NonRecursive กับ WithRecursive
// NonRecursive
int _fibonacci(int n) {
if (n == 0) return 0;
if (n == 1) return 1;
int first = 0;
int second = 1;
int nth = 1;
for (int i = 2; i <= n; i++) {
nth = first + second;
first = second;
second = nth;
}
return nth;
}
// WithRecursive
int _fibonacci(int n) {
if (n < 2) return n;
return _fibonacci(n - 2) + _fibonacci(n - 1);
}
และสร้าง class ขึ้นมา และ extends BenchmarkBase แค่ override function run เป็น code ที่อยาก test ก็ใช้ได้เลย
class Name extends BenchmarkBase {
const Name() : super('Name');
// The benchmark code.
@override
void run() {}
// Not measured setup code executed prior to the benchmark runs.
@override
void setup() {}
// Not measured teardown code executed after the benchmark runs.
@override
void teardown() {}
// Exercises the benchmark. By default invokes [run] 10 times.
@override
void exercise() {
// for (var i = 0; i < 10; i++) {
// run();
// }
}
}
- run โค้ดที่อยากรัน benchmark
- setup ก็ตามชื่อ setup ค่าก่อนรัน
- teardown function ถูกเรียกหลังจาก รันเสร็จแล้ว
- exercise ฟังก์ชั่นที่เอาไว้ปรับลองเรียกฟังก์ชั่นหลายๆ ทีเพราะว่าอิฟังก์ชั่นที่รันมันเร็วไปจนรันครั้งเดียวไม่เห็นผลชัดเจน (default 10 รอบ)
หลังจากนั้น ก็ implement และเรียก function report ได้เลย
class FibonacciNonRecursive extends BenchmarkBase {
const FibonacciNonRecursive() : super('FibonacciNoneRecursive');
int _fibonacci(int n) {
if (n == 0) return 0;
if (n == 1) return 1;
int first = 0;
int second = 1;
int nth = 1;
for (int i = 2; i <= n; i++) {
nth = first + second;
first = second;
second = nth;
}
return nth;
}
@override
void run() => _fibonacci(40);
}
class FibonacciWithRecursive extends BenchmarkBase {
const FibonacciWithRecursive() : super('FibonacciWithRecursive');
int _fibonacci(int n) {
if (n < 2) return n;
return _fibonacci(n - 2) + _fibonacci(n - 1);
}
@override
void run() => _fibonacci(40);
}
void main() {
FibonacciWithRecursive().report();
FibonacciNonRecursive().report();
}
และลอง run program ดูจะได้ผลลัพธ์แล้วเย่
ทั้งนี้ทั้งนั้นนอกจากนี้เรายัง สามารถ implement emitter เผื่อเอาไปทำ report เขียนลงไฟล์ ทำ test ทำ CI/CD ได้เลยเย้