Programming adalah aktivitas yang menyenangkan, kemampuan programming juga harus senantiasa di asah agar kemampuaan membuat kode program kita dari hari ke hari semakin membaik. Teringat dulu semasa kuliah pada saat mengerjakan tugas akhir, saya membuat program tidak berpikir sama sekali tentang optimasi dari kode program yang kita buat. wis pokoknya program itu bisa jalan, ga error itu udah bagus banget. Pada saat kerja di dunia programming ternyata tantangan nya bukan itu saja. Kita di hadapkan pada kenyataan bahwa kita mengembangkan sebuah sistem perangkat lunak yang besar dan akan terus berkembang. Oleh karena itu selain kode program tidak boleh error kita juga harus dapat mengoptimasi kode program yang kita buat, agar kinerja program kita cepat dan tidak bertele tele.
Sebetulnya banyak sekali teori yang membahas bagaimana mengoptimasi kinerja sebuah sistem dari kode program, mulai dari mengurangi kompleksitas di dalam kode program hingga pada level arsitektur perangkat lunak seperti Design Pattern. Tetapi pada tulisan kali ini saya coba untuk memberikan explanation yang sederhana bagaimana mengurangi kompleksitas dari kode program, mudah mudahan nanti ada kesempatan untuk menulis lebih banyak lagi tentang optimasi perangkat lunak pada Java. Coba perhatikan contoh kode program di bawah ini :
package OptimizeCode; import java.util.Iterator; import java.util.LinkedList; import java.util.List; public class OptimizeBoolean { public static void main(String[]args){ List<String> list = new LinkedList<String>(); list.add("satu"); list.add("dua"); list.add("tiga"); list.add("empat"); list.add("lima"); list.add("enam"); list.add("tujuh"); list.add("delapan"); list.add("sembilan"); list.add("sepuluh"); if(isValidLima(list)){ System.out.println("Di dalam list terdapat elemen lima"); } } private static boolean isValidLima(List<String> list){ boolean b = false; for(Iterator i = list.iterator(); i.hasNext();){ String val = (String)i.next(); System.out.println("--> mencari apakah isi dari list adalah lima : "+val); if(val.equalsIgnoreCase("lima")){ b = true; } } return b; } }
Pada contoh program diatas kita mempunyai sebuah list yang berisi String angka dalam bentuk kata (satu, dua, dst) kemudian kita punya method bertype boolean untuk mengecek apakah list tersebut memiliki elemen kata “lima” dia mencari nya dengan cara melooping isi list tersebut ketika isi list tersebut bernilai “lima” boolean akan bernilai true, hasil eksekusi dari program diatas adalah sebagai berikut :
--> mencari apakah isi dari list adalah lima : satu --> mencari apakah isi dari list adalah lima : dua --> mencari apakah isi dari list adalah lima : tiga --> mencari apakah isi dari list adalah lima : empat --> mencari apakah isi dari list adalah lima : lima --> mencari apakah isi dari list adalah lima : enam --> mencari apakah isi dari list adalah lima : tujuh --> mencari apakah isi dari list adalah lima : delapan --> mencari apakah isi dari list adalah lima : sembilan --> mencari apakah isi dari list adalah lima : sepuluh Di dalam list terdapat elemen lima
Kode program ini kurang simple, kita bisa mengoptimasi method
isValidLima diatas, ada dua yang bisa kita optimasi yaitu cara dia melooping isi List, dan cara dia menjadikan boolean itu menjadi true. Simak kode yang telah di optimasi di bawah ini
package OptimizeCode; import java.util.LinkedList; import java.util.List; public class OptimizeBoolean { public static void main(String[]args){ List<String> list = new LinkedList<String>(); list.add("satu"); list.add("dua"); list.add("tiga"); list.add("empat"); list.add("lima"); list.add("enam"); list.add("tujuh"); list.add("delapan"); list.add("sembilan"); list.add("sepuluh"); if(isValidLima(list)){ System.out.println("Di dalam list terdapat elemen lima"); } } private static boolean isValidLima(List<String> list){ for(String val : list){ System.out.println("--> mencari apakah isi dari list adalah lima : "+val); if(val.equalsIgnoreCase("lima")){ return true; } } return false; } }
Dan hasil output program nya adalah sebagai berikut :
--> mencari apakah isi dari list adalah lima : satu --> mencari apakah isi dari list adalah lima : dua --> mencari apakah isi dari list adalah lima : tiga --> mencari apakah isi dari list adalah lima : empat --> mencari apakah isi dari list adalah lima : lima Di dalam list terdapat elemen lima
Dari cara dia melooping isi List bisa kita lihat ada optimasi, kita telah mengetahui bahwa list yang dimasukkan dalam parameter tersebut berisi String, oleh karena itu kita tidak perlu lagi melakukan parsing object seperti yang dilakukan sebelumnya, cukup dengan melakukan foreach sesuai dengan object di dalam list tersebut. Kemudian optimasi selanjutnya adalah pada deklarasi boolean, pada kode yang telah di optimasi ketika isi list tersebut adalah kata “lima” maka proses looping segera di hentikan, program tidak perlu menghabiskan sisa looping yang ada, karena value yang kita inginkan sudah kita dapatkan.
Oke pada contoh berikutnya kita akan mengoptimasi kode program tetapi bukan pada java.util.List tetapi kita akan menggunakan java.util.Map, sebagaimana kita mengetahui bahwa Map adalah collection pada Java yang memiliki Key dan Value (bentuk asli map adalah Map
package OptimizeCode; import java.util.HashMap; import java.util.Map; public class OptimizeHashMap { public static void main(String[]args){ Map<Integer, String> map = new HashMap<Integer, String>(); map.put(1, "satu"); map.put(2, "dua"); map.put(3, "tiga"); map.put(4, "empat"); map.put(5, "lima"); map.put(6, "enam"); map.put(7, "tujuh"); map.put(8, "delapan"); map.put(9, "sembilan"); map.put(10, "sepuluh"); if(isValidLima(map)){ System.out.println("Di dalam hashmap terdapat lima"); } } private static boolean isValidLima(Map<Integer, String> map){ for(Integer key : map.keySet()){ String val = map.get(key); System.out.println("--> Mencari val lima pada hashmap : "+val); if(val.equalsIgnoreCase("lima")){ return true; } } return false; } }
Dan kalau kita lihat output programnya terlihat sudah cukup optimal
--> Mencari val lima pada hashmap : satu --> Mencari val lima pada hashmap : dua --> Mencari val lima pada hashmap : tiga --> Mencari val lima pada hashmap : empat --> Mencari val lima pada hashmap : lima Di dalam hashmap terdapat lima
Pada kode program diatas boolean nya sudah di optimasi, cara melooping nya pun sudah tidak memparsing object alias sudah melakukan foreach pada object itu sendiri, tetapi sebenarnya kita bisa lebih mengoptimasi lagi kode program diatas, bandingkan dengan kode program di bawah ini :
package OptimizeCode; import java.util.HashMap; import java.util.Map; public class OptimizeHashMap { public static void main(String[]args){ Map<Integer, String> map = new HashMap<Integer, String>(); map.put(1, "satu"); map.put(2, "dua"); map.put(3, "tiga"); map.put(4, "empat"); map.put(5, "lima"); map.put(6, "enam"); map.put(7, "tujuh"); map.put(8, "delapan"); map.put(9, "sembilan"); map.put(10, "sepuluh"); if(isValidLima(map)){ System.out.println("Di dalam hashmap terdapat lima"); } } private static boolean isValidLima(Map<Integer, String> map){ String val = map.get(5); if(val != null){ return true; } return false; } }
Dan hasil output program nya adalah sebagai berikut :
Di dalam hashmap terdapat lima
Hehehe bisa kita liat, disini saya menghilangkan looping nya, yup sebagaimana sifat hashmap dia dipanggil berdasarkan key nya, kalau kita sudah mengetahui key nya tidak perlu melooping satu per satu elemen di dalam map tersebut kita bisa langsung panggil map tersebut berdasarkan key nya, dan ketika hasil value nya ada (alias tidak sama dengan null) maka segera kita return kepada boolean true. Demikian semoga bisa membantu, selamat belajar Java dan rasakan manfaatnya
Salam, Mas
Saya ingin menambahkan sedikit untuk masalah performa. Khususnya pada object List. Jika kita menggunakan metode foreach “for (Object item : list)”, aplikasi akan berjalan lebih lambat. Maka dari itu, untuk object List saya sarankan menggunakan standar looping yang dioptimasi, seperti:
1. variable caching
int numOfItems = list.size();
for (int i = 0; i = 0;) { … proses … }
Looping List dijamin 10 kali lebih cepat dengan kedua metode tersebut. Apalagi jika kita me-loop beribu-ribu data.
Tips:
1. Untuk alasan kerapian dan agar kode lebih mudah dibaca bisa juga memanggil method yang akan memproses List dengan salah satu metode di atas. Akan tetapi metode “panggil method” ini akan sedikit memakan performa.
2. Jika ingin melakukan benchmark kode, gunakan System.nanoTime() atau System.currentTimeMillis() untuk melihat rentang waktu sebuah proses. Bandingkan beberapa metode dan ulang sampai beberapa kali. Ambil rata-rata dari rentang waktu tersebut.
Selamat mencoba dan semoga berbahagia
wih tetangga project sebelah sudi berkunjung .. hehehe oke mas bog tengkiu atas tips dan trik nya …
Wah ga bisa komen pake kode yah?
sengaja … untuk mencegah hal hal yang tidak di inginkan mas bog …