Performance VS Error handling

Andi Pangeran
sarccom
Published in
2 min readDec 10, 2017

Beberapa waktu yang lalu di telegram JVM Group Indonesia ada diskusi menarik terkait bagaimana melakukan error handling yang baik. Yang didiskusikan terkait performance impact dan bagaimana kerapian dari code akibat error handling ini.

Golang way to handle error

kelebihan utama dari metode golang diatas adalah memiliki performance yang lebih baik karena tidak terdapat kemungkinan performance bottleneck (check penjelasan exception handling dibawah).

kekurangan metode golang diatas adalah caller function harus melakukan pengechekan ditiap fungsi yang dipanggil apakah success atau error, sehingga akan terdapat banyak pengechekan ini dalam fungsi anda.

Exception Based Error Handling

penggunaan exception dalam menangani error membuat kodingan lebih rapih jika dibandingkan dengan metode golang sebelumnya. Akan tetapi, ini tidak datang dengan gratis… Bahkan kemungkinan menurunkan performance dari system jika tidak dilakukan dengan benar.

Hall ini dibuktikan dari hasil research Aleksey Shipilёv dalam blognya The Exceptional Performance, sang paman dalam kesimpulannya menyebutkan ada dua penyebab yang paling sering mengakibatkan penurunan performance secara significant, yaitu:

  • Stack trace contruction: ketika exception akan diinitialisasi ada proses pengumpulan informasi yang terdapat pada stack frame, waktu yang dibutuhkan pada proses ini sangat dipengaruhi oleh dalam-tidaknya call-stack. Untuk menyisiasati kita bisa meng-override process fillInStackTrace.
  • Stack Unwinding: adalah penghapusan alokasi yang terjadi pada stack ketika fungsi telah selesai dieksekusi atau terjadi exception. Internally system akan melakukan pengechekan pada current stack frame, apakah terdapat handler di exception table yang akan menangani exception tersebut. Jika tidak ditemukan, system akan melakukan pop (dealokasi) current stack frame, kembali ke stack frame sebelumnya dan akan rethrow lagi exception itu sehingga proses pengechekan terjadi lagi, ini akan dilakukan sampai ditemukan handler terhadap exception tersebut. Semakin dekat exception handler dari dimana exception terjadi semakin cepat proses unwinding ini.

metode golang tentu lebih baik dari kacamata performance, sayangnya agak sulit diterapkan oleh programmer java. Selain karena mencintai kerapian, returnning two value dijava itu belum bisa (currently last version is java9) hahahaha. Tpi ada juga loh, java programmer java yang nekat melakukan seperti hallnya di golang dengan membuat object penampung hihiihi..

Functional way

Kabar baiknya untuk menerapkan error handling yang lebih baik dan rapi kita bisa menerapkan konsep Monad Try yang ada pada functional programming. Secara singkat monad try adalah object yang memiliki value either success atau error. Bedanya dengan object penampung diatas, monad try memiliki fungsi composition map dan flatmap yang membuat kodingan menjadi rapi dari pengechekan if error.

pada monad try juga terdapat mapTry dan flatMapTry yang dapat digunakan untuk meminimalisir perlambatan oleh exception dikarenakan stack unwinding dan problem checked exception di java.

adapun functional library yang saya gunakan itu http://vavr.io
sample code diatas bisa dicheck di:
https://github.com/meong1234/monad-try

Conclusion:

ayo gabung JVM group, diskusinya menarik, dan actual..

ayo gabung GOJEK..

#kesimpulanyahmalahpromosi ahahhaha

useful resources:

https://shipilev.net/blog/2014/exceptional-performance/

--

--