Beberapa minggu belakangan ini saat mencari-cari video tentang High Frequency Trading (HFT), saya menemukan video dibawah ini: 5 ways quant developers speed up their code (5 cara quant developer mempercepat kode mereka).

Dalam video itu dibahas mengenai teknik Short Circuiting yang saya baru tahu setelah menonton video ini. Dan karena menarik saya jadi ingin menuliskannya dalam artikel agar tidak lupa.

Short circuiting adalah teknik mengoptimasi kode kita untuk bisa keluar dari logika pengecekan secepat mungkin karena program kita tidak perlu mengecek parameter selanjutnya. Dalam prakteknya, misalkan kita punya dua operasi pengecekan ShortCheck() bool dan LongCheck() bool, dimana ShortCheck() memerlukan waktu yang lebih sedikit dari pada LongCheck(), maka lebih baik kita mengecek ShortCheck() dulu dari pada LongCheck().

// Buat seperti ini
if ShortCheck() && LongCheck() {

}
if ShortCheck() || LongCheck() {

}

// Dari pada 
if LongCheck() && ShortCheck() {

}
if LongCheck() || ShortCheck() {

}

Kenapa begitu? Berikut penjelasannya.

Short Circuiting pada operator AND (&&) dan OR (||)

Mari kita bahas dari operasi AND (&&) dulu. Berikut adalah kemungkinan kombinasi A&&B:

A B A&&B
true true true
true false false
false true false
false false false

Jika kita perhatikan tabel diatas. Jika A sebagai input sebelah kiri adalah true, maka output dari A&&B akan bergantung pada value B. Namun jika A adalah false maka sudah pasti A&&B hasilnya adalah false, baik untuk value B itu true atau false. Dengan kata lain, tidak peduli apa value dari B, jika A = false maka A&&B pasti false.

Kemudian mari kita cek tabel operator OR (||), berikut table kombinasi A||B:

A B A||B
true true true
true false true
false true true
false false false

Mirip namun agak berbeda dengan operator AND, pada operator OR jika input sebelah kiri adalah false maka output dari A||B akan bergantung pada value B. Namun jika A adalah true maka sudah pasti A||B adalah true. Tidak peduli apa value dari B, jika A = true maka A||B pasti true.

Oleh karena logika diataslah, interpreter dan compiler didesain untuk keluar dari operasi pengecekan secepat mungkin jika short circuiting dapat dilakukan. Karena tidak perlu mengecek parameter selanjutnya jika sudah bisa dipastikan hasilnya.

Contoh kode

Mari kita lihat contoh kode berikut:

package main

import (
	"fmt"
	"time"
)

func ShortCheck() bool {
	time.Sleep(1 * time.Second)
	return true
}

func LongCheck() bool {
	time.Sleep(4 * time.Second)
	return false
}

func main() {
	tStart := time.Now()
	if ShortCheck() && LongCheck() {
		fmt.Println("condition fulfilled")
	}

	fmt.Println("done checking: ", time.Since(tStart).Seconds(), " second")
}

Output dari kode diatas adalah:

done checking:  5  second

Kenapa 5 detik? karena ShortCheck() memerlukan waktu 1 detik, dan LongCheck() memerlukan waktu 4 detik. Jadi total waktu yang dibutuhkan adalah 5 detik.

Sekarang mari kita ubah ShortCheck mejadi return false (karena kita tahu bahwa jika A = false maka A&&B pasti false). Berikut kode lengkapnya:

package main

import (
	"fmt"
	"time"
)

func ShortCheck() bool {
	time.Sleep(1 * time.Second)
	return false
}

func LongCheck() bool {
	time.Sleep(4 * time.Second)
	return false
}

func main() {
	tStart := time.Now()
	if ShortCheck() && LongCheck() {
		fmt.Println("condition fulfilled")
	}

	fmt.Println("done checking: ", time.Since(tStart).Seconds(), " second")
}

Output dari kode diatas adalah:

done checking:  1  second

Perhatikan bahwa outputnya adalah 1 detik, bukan 5 detik. Karena ShortCheck() mengembalikan false maka LongCheck() tidak perlu dieksekusi. Oleh karena itu total waktu yang dibutuhkan adalah 1 detik.