จะรู้ได้ไงว่า function ช้าเร็วกว่ากันใน Flutter — Dart ด้วย Benchmark

Watcha Em
blogEm
Published in
2 min readDec 20, 2023

จะรู้ได้ไงว่า function ช้าเร็วกว่ากัน ถ้าเอาง่าย ๆ ก็เราแค่สร้าง datetime หัวท้ายลบกันและเทียบกันเลยก็ได้ครับจบการรายงาน แต่ๆๆๆ มันไม่เท่ วันนี้เลยมาลอง lib Benchmark กันดีกว่า ซึ่ง lib มีชื่อว่า benchmark_harness

Photo by Ralfs Blumbergs on Unsplash

เราจะมาลอง เขียนเปรียบเทียบ 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 ได้เลยเย้

--

--