Btw jangan confuse "compiler" here as java/c# sebagai IL/bytecode compiler.
Compiler disini mostly refers to JIT compiler

2010/5/28 Hendry Luk <hendrym...@gmail.com>

> Agak susah googlenya, tapi ini contoh yg gw dapet dari quick google:
> http://blogs.msdn.com/b/brada/archive/2005/04/23/411321.aspx
>
> In this case, itu adalah array. Tapi nothing is stopping them buat erase
> out-of-bound checking as long as lu pake pake framework classes mereka
> (List, ArrayList, Hashmap, Tables etc), ato even your own derived classes
> yang gak override default Count() behavior. Optimisation bisa at compile
> time maupun at runtime.
> Contoh laen adalah if-else block. Kalo method lu ada if-else dalam sebuah
> method berdasarkan parameter condition tertentu, compiler lu kadang bakal
> produce 2 (or more) separate methods, each one buat handle kondisi parameter
> tertentu (jika kondisi ini bisa diderive at compile/JIT time), jadi if-else
> block lu bakal completely dihapus. Hence, at runtime, if-else statement lu
> gak pernah diexecute sama sekali.
> Ini adalah the fundamental difference between managed code dan unmanaged.
> Di managed code, what you see isnt necessarily what you get.
>
> Intinya adalah, use framework classes the way they're intended to be used,
> instead of pake clever MacGyver tricks buat outsmart the framework, karna
> chances are, framework designer lu udah meng-optimise specifically for
> "common usage pattern". Jadi ikutin ajah the recommended usage pattern, gak
> perlu think too hard buat optimise pake strange way.
>
> 2010/5/28 Jecki <jecki...@gmail.com>
>
>
>>
>> 2010/5/27 Hendry Luk <hendrym...@gmail.com <hendrymail%40gmail.com>>
>>
>> >
>> > Gak tau kalo di java.. tapi di .net cara 1 lebih efisien.
>> >
>> > First of all, kalo lu akses array/list pake cara 1, compiler gak bakal
>> produce loop block yang terus2an manggil Count() di tiap iteration,
>> melainkan bakal pake temporary variable, exactly the same kayak kalo lu
>> tulis pake cara 2. Jadi lu gak gain anything dengan nulis pake cara 2.
>> >
>>
>> Gw gak ngerti .NET, tapi rasanya ada yang janggal sama statement ini.
>> Bisa kasih reference?
>>
>> Kalau itu adalah array maka masih ada kemungkinan karena sifat array
>> yang immutable dan merupakan language construct yang out of the shelf
>> di-support oleh programming language, dalam arti sangat mungkin
>> mendapat perlakuan khusus.
>>
>> Kalau itu adalah List maka kemungkinannya berkurang karena List itu
>> hanya interface dan implementasinya bisa macem-macem. Berarti si
>> compiler musti tau implementasi List apa yang lagi dipakai, kemudian
>> analisa apakah misalnya list.size() dari implementasi tersebut tidak
>> melakukan perubahan yang menyebabkan pemanggilan list.size()
>> berikutnya berubah nilainya. Kalau compiler dengan seenaknya
>> mengasumsi bahwa list.size() cukup dipanggil sekali dan mengubah logic
>> program dari cara 1 ke cara 2 (seperti yang di-post oleh TS) betapa
>> ngerinya itu karena optimization yang dilakukan malah mengubah logic
>> program. Kalau sampai ini terjadi sih berarti "This compiler
>> optimization is root of all evil".
>>
>> Setau saya yang namanya block program:
>>
>> for (<initial value>:<condition>:<incrementor>) {
>> }
>>
>> itu bagian <condition> akan dipanggil setiap kali perulangan loop
>> terjadi. Bahkan kelebihan sekali. Coba contoh kode berikut:
>>
>> [code]
>> public class App {
>> public static void main(String[] args) {
>> int[] arr = new int[]{1, 2, 3, 4, 5};
>> for (int i = 0; i < getSize(arr); i++) {
>> // do nothing
>> }
>> }
>>
>> public static int getSize(int[] arr) {
>> System.out.println("You've just called getSize(int[])");
>> return arr.length;
>> }
>> }
>> [/code]
>>
>> itu akan print "You've just called getSize(int[])" sebanyak 6 kali,
>> atau N+1. Kalau ada compiler yang mencoba optimasi dan nge-print
>> "You've just called getSize(int[])" sekali doang then that compiler is
>> totally a crap. Compiler optimization should not change program's
>> logic.
>>
>> Ya ya ini ga signifikan. Cuma dipanggil 6 kali dan mungkin bedanya
>> cuma 2 CPU cycle tiap kali pemanggilan. But if you're processing in
>> bulk this might you more time.
>>
>> Intinya ga cuma masalah performance tapi sebagai developer musti tau
>> yang mana yang optimized. Ya memang kita bukan selevel tukang bikin
>> compiler. Tapi tau cara2 optimasi primitif (primitif di sini maksudnya
>> pake mata aja uda keliatan kalo yang satu lebih cepet dari yang laen)
>> kan ga ada salahnya. Biarlah developer compiler yang mikirin optimasi
>> yang njelimet dan perlu analisa yang lebih dalam.
>>
>>
>> > Second of all, lu mesti tau bahwa saat lu akses content dari array ato
>> list, ada routine di runtime buat ngecek apakah lu berusaha ngakses index
>> yang di luar array/list tersebut, in which case lu bakal dapet
>> IndexOutOfBoundException.
>> >
>> > Kalo lu tulis pake cara 1, compiler lu bakal conclude bahwa code block
>> lu dah safe, sehingga compiler bakal optimise the code dengan erase routine
>> yang anticipates index-out-of-bound situation. Hasilnya, gak cuma lu dapet
>> compiled code yang sama dengan cara 2, tapi juga code lu dioptimised dengan
>> ngebuang routine2 yang gak applicable dengan situasi lu.
>> >
>>
>> Ya di java juga ada pengecekan IndexOutOfBoundException. Tapi bisa
>> sertakan reference kalau pengecekan IndexOutOfBoundException akan
>> di-skip kalau pake cara 1?
>>
>> Kalau untuk array sekali lagi sangat besar kemungkinannya compiler
>> melakukan optimization seperti itu. Tapi kalau untuk List (yang
>> implementasinya bisa macem-macem) koq rasa-rasanya kemungkinannya
>> kecil ya?
>>
>>
>> > Foreach syntax, for(xx: list), is even better.
>> >
>>
>> Bisa jadi, terutama untuk tipe data array. Mungkin ada yang bisa
>> berikan pembuktian di sini?
>>
>>
>> > Again, gw gak tau di java, all those are true in .net.
>> > Tapi moral of this story adalah, jangan try too hard buat optimise your
>> code dengan ngeja word-by-word pake smart fine-tuned instructions. Compiler
>> dan jdk ditulis oleh very very smart people, dan sangat jarang lu bisa nulis
>> java code yang outsmarts them. Most of the time optimisation attempt lu
>> actually makes it worse.
>> > Modern language increasingly ngasih more and more syntatic sugars yang
>> bikin code lu makin high-level dan declarative (e.g. syntax kayak for-each,
>> closure, Linq, Parallel/PLinq, dynamic, auto-property, etc), tujuannya
>> *bukan* semata2 buat bikin programmers write less. Melainkan, language
>> abstraction ini plays an important role buat ngasih penulis compiler enough
>> flexibility buat produce optimised solution dari code lu.
>>
>> Agree.
>>
>>
>> > Kalo lu bypass abstraction ini, dan lengsung terjun low-level nge-dikte
>> code lu dengan specific instructions, lu justru gak ngasih compiler lu
>> anymore room buat nyisipin any optimisation logic ke bytecode lu.
>> >
>>
>> IMO Untuk kasus di atas tidak low level sama sekali. This is merely a
>> simple fact that you can build as habit.
>>
>>
>> > 2010/5/27 Jecki <jecki...@gmail.com <jecki.go%40gmail.com>>
>> >>
>> >>
>> >>
>> >> 2010/5/27 Niksen Harjanto 
>> >> <milis.java.ko...@gmail.com<milis.java.kodok%40gmail.com>
>> >
>> >>
>> >> >
>> >> >
>> >> >
>> >> > rekan2 saya mau tanya, diantara 2 statement looping ini, mana yang
>> >> > lebih baik, alasan teknisnya kenapa?
>> >> >
>> >> > Mis saya punya JTable, mau dilooping untuk baca datanya.
>> >> >
>> >> > Cara 1 (cara yang simple) :
>> >> >
>> >> > int x;
>> >> > for (x=0; x<table.getRowCount(); x++) {
>> >> > bla bla bla
>> >> > }
>> >> >
>> >> > Cara 2 (IMHO lebih efisen) :
>> >> >
>> >> > int x;
>> >> > int y;
>> >> > y = table.getRowCount();
>> >> > for (x=0; x<y; x++) {
>> >> > bla bla bla
>> >> > }
>> >> >
>> >> > Saya milih nomor 2 karena takutnya java selalu mengecek apa nilai x <
>> >> > table.getRowCount(). Soalnya di dalem function getRowCount pasti ada
>> >> > banyak statement untuk dapetin jumlah row, yang akan dieksekusi
>> >> > terus2an selama looping. Sedang no 2, function getRowCount() cuma
>> >> > dieksekusi 1x, trus nanti yang dibandingin cuma variable int dengan
>> >> > variable int.
>> >> >
>> >> > bener ga sih analisa gw?
>> >> >
>> >>
>> >> benul, alias benar-benar betul.
>> >>
>> >> bisa juga gini:
>> >>
>> >> for (int x=0, y = table.getRowCount(); x<y; x++) {
>> >> // bla bla bla
>> >> }
>> >>
>> >> biar tetep efisien dan scope dari variable tetep sekecil mungkin.
>> >>
>> >> > makasih
>> >> >
>> >
>>  
>>
>
>

Kirim email ke