Re: [JUG-Indonesia] Pertanyaan Newbie Tentang Looping For

2010-05-29 Terurut Topik Hendry Luk
Contoh laen... just food for thoughts.. Loop di fotran, ada compiler
technique called "loop automatic parallelization", yaitu jika compiler lu
detect bahwa loop block lu safe buat dijalankan secara concurrent, maka
compilernya gak akan generate iterative instruction, melainkan bakal execute
the loop block secara parallel, sehingga optmised buat multi-core machines.
Tapi detection ini requires that code lu ngikutin loop pattern yang waras
supaya compiler lu understand your "high-level intent". Kalo lu pake pattern
yang nyeleneh, compiler lu gak bakal bisa recognize your actual intent, dan
hence gak bisa come up with any optimisation strategy.

2010/5/28 Hendry Luk 

> 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 
>
>
>>
>> 2010/5/27 Hendry Luk >
>>
>> >
>> > 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 (::) {
>> }
>>
>> itu bagian  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.
>>
>>
>> >

Re: [JUG-Indonesia] Pertanyaan Newbie Tentang Looping For

2010-05-28 Terurut Topik Niksen Harjanto
On 5/28/10, Jecki  wrote:
> Setuju kalau optimization jangan sampai membuat aplikasi susah
> di-maintain. Kasus di atas kan sebenarnya simple, sekali liat langsung
> tau. Kemudian bisa disarikan jadi best practice. Setelah itu secara
> otomatis tiap kali tulis code ikutin best practice. Tentunya best
> practice itu musti yang gampang dilakukan. Jangan yang njelimet dan
> error-prone.

Setuju, buat apa cepet tapi susah di maintain, susah dimengerrti



> OK gw ga tau context-nya dia tanya pertanyaan ini. Apakah untuk
> optimize code yang sudah ada, yang sudah running well? Atau sekedar
> mau tau yang mana yang lebih cepat, dan syukur2 dia mau coding kaya
> gitu ke depannya. Kalau untuk optimize code yang sudah ada sih betul
> ini micro optimization yang effort-nya mungkin ga akan sebanding
> dengan peningkatan performance yang akan didapat. Bayangin misal
> program dia sekarang ada 100 file source. Kemudian harus ubah code
> yang pattern-nya seperti ini di ke 100 source files tersebut, tapi
> peningkatan performance cuma misalnya 1%. Ini sama sekali ga worth it.
>
> Beda kalau dia mau tau yang mana yang lebih cepat. Sekarang kan dia
> uda tau tuh cara kedua memang lebih cepat. Setelah itu kalau mau
> coding ya mustinya tau yang mana yang musti dipilih.

Oh gw lagi create modul, bukan optimisasi. Pengalaman di Delphi sama
VB6, tiap ada looping For, function pembanding selalu dieksekusi
setiap looping muter balik. Nah di 2 bahasa itu gw biasain untuk save
nilai function ke variabel dulu (di SP SQL Server jg).


> Setuju, tapi ada tambahan.
>
> Micro optimization kalau:
> - effort-nya kecil
> - tidak mempengaruhi kemudahan maintenance aplikasi
> - sangat mudah dilakukan
>
> sebaiknya dijadikan habit.
>
> Kalau yang model nasi sudah menjadi bubur sih uda deh ga usah lakukan
> micro optimization. Fokus ke optimization yang menghasilkan
> peningkatan performance paling signifikan aja.

Setuju, kalo gampang dilakukan n emang punya efek, dikerjain. Kalo
rumit mending ntar aja deh, kalo kepepet baru optimasi.


Re: [JUG-Indonesia] Pertanyaan Newbie Tentang Looping For

2010-05-28 Terurut Topik Samuel Franklyn
Posting yang bagus dan thread yang bagus.

Berarti sebenarnya ada dua istilah. Ada "performance best practice" dan ada
"micro optimization". Mempraktekkan "performance best practice" itu bagus.
Mempraktekkan "micro optimization" itu jelek. Itu sih yang gua tangkap
dari artikel ini dan jawaban Jecki.

On Fri, May 28, 2010 at 3:08 PM, Nanda Firdausi wrote:

>
>
> Exactly what I'm thinking. See my article here:
> http://satukubik.com/2009/08/10/premature-optimization-vs-best-practice/
>
>  
> Saya
> kopas dibawah.
>




Re: [JUG-Indonesia] Pertanyaan Newbie Tentang Looping For

2010-05-28 Terurut Topik Nanda Firdausi
Exactly what I'm thinking. See my article here:
http://satukubik.com/2009/08/10/premature-optimization-vs-best-practice/

 Saya
kopas dibawah.

Premature optimization vs best
practice

An article
I
wrote about how to traverse a Map more efficiently began the debate about
premature optimization. Watching the debate, I thought some people
misunderstood the intention of the post. I suggest that “we as developers
should try to change our instinct to use the second template (using
entrySet) every time we encounter such problem”. This is for me a huge
difference with a sentence, “change all of your map traversal to use
entrySet.”
 [image: From:
http://www.geekherocomic.com/2009/05/11/premature-optimization/]

From: http://www.geekherocomic.com/2009/05/11/premature-optimization/

What’s the difference? My suggestion is that we should employ the best
practice as much as possible WHEN writing the code, not when optimizing the
code. This is especially my preference if the optimized is not that cryptic
compared with the unoptimized code. Let me copy the example from the linked
article:
   1 for (String k : m.keySet()) {
  2 Integer v = m.get(k);
  3// do something with the key and value
  4 }
   1 for (Entry e : m.entrySet()) {
  2 Integer v = e.getValue();
  3 // do something with the key and value
  4 }

Do you notice a different in readability? My opinion is no, and they who say
‘yes’ usually also agree that the difference is pretty small. In this case
and maybe even if the code SLIGHTLY harder to understand but offer HUGE
performance improvement, I usually prefer the optimized version. ONLY when
the difference in readability is so BIG, I won’t try to use the optimized
version. Mainly because the optimized is unreadable, but also because the
code then will be harder to write, and I’m kind of lazy [image: :)] .

There will be lot of people that don’t agree with my principle. They will
usually use this phrase: ‘avoid premature optimization’, ‘premature
optimization is root of the evil’, etc. The first person that said this is
believed to be C. A. R Hoare .
The quote is then completed and popularized by Donald
Knuth and
is like following: “*We should forget about small efficiencies, say about
97% of the time: premature optimization is the root of all evil*“.

Unfortunately, the quote has lead many programmers to never optimize their
code. Why? Software development is usually a continuous process, and rarely
we have an optimization stage in our schedule. Only when the performance
problem is so big, we will dedicate ourselves to use the profiler. And this
is usually a time consuming process.

I found this article “The Fallacy of Premature
Optimization“,
which describes correctly what is my intention with this article. Let me
quote that article:

… The purpose of this article is to examine how software engineers have
(incorrectly) applied Hoare’s statement as a way of avoiding the effort
necessary to produce a well-performing application. …

Read through… and maybe you will argue that this article is actually
attacking my position. But wait…

… Note, however, that Hoare did not say, “Forget about small efficiencies
all of the time.” Instead, he said “about 97% of the time.” This means that
about 3% of the time we really should worry about small efficiencies.

… Premature optimization is always bad, but the truth is that some concern
about small efficiencies during program development is not premature….

… “A good software developer will do this automatically, having developed a
feel for where performance issues will cause problems. An inexperienced
developer will not bother, misguidedly believing that a bit of fine tuning
at a later stage will fix any problems.” …

… One thing nice about optimization is that if you optimize a section of
code that doesn’t need it, you’ve not done much damage to the application. …

A nice thought:

… A favorite saying of mine, which I learned from Rico Mariani (
http://msdn.microsoft.com/library/en-us/dnpag/html/ScaleNetFword03.asp) is
“Never give up your performance accidentally.” It is amazing how often the
typical software engineer violates this when writing source code. For
example, many programmers don’t have a clue concerning the cost of the
high-level language statements they use in their source code. Most of them
assume, as they were taught in their college Data Structures and Algorithm
Analysis course, that each statement in a program takes one unit of time to
execute. In reality, different statements require differing amounts of
execution time and sometimes the choice of one type of statement over
another can m

Re: [JUG-Indonesia] Pertanyaan Newbie Tentang Looping For

2010-05-27 Terurut Topik abangkis
2010/5/28 Jecki 

>
>
> 2010/5/28 Samuel Franklyn >
>
> >
> > >
> > > Ga perlu baca source code dari getRowCount juga udah ketauan kalau
> > > cara pertama itu cenderung lebih lelet, walaupun mungkin sangat kecil
> > > sekali. Kecuali compiler melakukan optimization.
> >
> > Betul lebih lambat akan tetapi lebih lambat berapa persen?
> > Kalau cuma lebih lambat 0.1 % apakah worthed kita menambahkan
> > baris code. Ingat tiap baris code artinya pertambahan effort
> > untuk memelihara aplikasi.
> >
>
> Penambahan code 1 baris macam deklarasi variable juga ga berpengaruh
> banyak sama effort untuk memelihara aplikasi.
>
> Setuju kalau optimization jangan sampai membuat aplikasi susah
> di-maintain. Kasus di atas kan sebenarnya simple, sekali liat langsung
> tau. Kemudian bisa disarikan jadi best practice. Setelah itu secara
> otomatis tiap kali tulis code ikutin best practice. Tentunya best
> practice itu musti yang gampang dilakukan. Jangan yang njelimet dan
> error-prone.
>
>
> > >
> > > Terobsesi memang ada sisi baik dan buruknya. Tapi belajar memahami apa
> > > yang baik dan tidak itu tidak ada salahnya. Lama-lama juga bosen
> > > sendiri optimize hal2 seperti ini. Atau kalau sudah jadi habit malah
> > > ga kepikiran sama sekali tau-tau codingnya udah optimized.
> >
> > Memahami cara kerja library itu bagus. Tapi apa
> > yang dilakukan oleh Niksen adalah micro optimization.
> > Dari pengalaman gua micro optimization itu distract seseorang
> > dari the bigger picture.
> >
>
> OK gw ga tau context-nya dia tanya pertanyaan ini. Apakah untuk
> optimize code yang sudah ada, yang sudah running well? Atau sekedar
> mau tau yang mana yang lebih cepat, dan syukur2 dia mau coding kaya
> gitu ke depannya. Kalau untuk optimize code yang sudah ada sih betul
> ini micro optimization yang effort-nya mungkin ga akan sebanding
> dengan peningkatan performance yang akan didapat. Bayangin misal
> program dia sekarang ada 100 file source. Kemudian harus ubah code
> yang pattern-nya seperti ini di ke 100 source files tersebut, tapi
> peningkatan performance cuma misalnya 1%. Ini sama sekali ga worth it.
>
> Beda kalau dia mau tau yang mana yang lebih cepat. Sekarang kan dia
> uda tau tuh cara kedua memang lebih cepat. Setelah itu kalau mau
> coding ya mustinya tau yang mana yang musti dipilih.
>
>
---> Oke, mungkin isu-nya jadi sedikit bergeser dari Tuning ke "What better
use of your time". Kata kuncinya sudah ditulis sama samuel, "Distract
seseorang dari bigger picture". Misalnya kita pakai pendekatan quantitatif,
si penanya menemukan 99 hal lain seperti ini. Lau menanyakan ke milis untuk
tiap pertanyaan mendapat kesimpulan setelah 3 hari. Berarti ada 300 mandays
yang dipergunakan untuk seperti ini. Sekarang kalau kita pakai angka diatas,
peningkatan performance-nya 0.1% maka yang didapat adalah peningkatan
perfomance 10% untuk waktu hampir 1 tahun. Cukup berharga kah ?

Dalam realitas saya pesimis 10% itu bisa tercapai dengan cara seperti itu.
Kenapa ? karena tiap aplikasi memiliki natur yang berbeda2, aplikasi batch
processing jauh berbeda dengan webapps. Aplikasi accounting jauh berbeda
dengan apps controller buat mesin. Real time apps berbeda dengan applikasi
buat tower control di bandara, etc. IMO angkanya di sekitar 0.01% bahkan ada
microoptimization yang lebih kecil lagi tergantung jenis aplikasinya. Dengan
angka 0.01% performance yang didapat jadi hanya 1% ? Angka ini hanya sample
dari pengalaman, tapi pointnya sama.

Sekarang dipakai pendekatan lain, si penanya tidak memikirkan masalah
for-loop. Tetapi setelah aplikasinya jadi dia melakukan profiling. Ternyata
dia menemukan ada 3 titik di aplikasinya yang memakan 90% dari total waktu
eksekusi. Dari 100 detik yang dibutuhkan untuk menjalankan aplikasiniya 90
detik ternyata berada 3 titik ini. Lalu misalnya ditemukan, penyebabnya
ternyata karena melakukan banyak parsing langsung dari file csv. Lalu
pendekatan di ubah. Ternyata waktu yang dibutuhkan untuk 3 titik tersebut
hanya 20detik untuk loading file kememory ditambah 10detik untuk proses.
total 30 detik. jadi total eksekusi program sekarang 40detik. 60%
performance improvement. Waktu yang dibutuhkan misalnya 1 minggu buat
profiling, 1 minggu buat fixing, 1 minggu buat testing. 15 working days
dengan 60% performance improvement.


Sekarang dimasukkan kedalam konteks waktu. Misalnya untuk pendekatan
pertama, si penanya bertanya pada saat membuat aplikasi. Otomatis
timelinenya molor 300 mandays (or less). Kalau bertanya setelah aplikasi
selesai, berarti setelah 1 tahun (?) aplikasinya gain 10% performance dengan
banyak perubahan code.

Dengan pendekatan kedua, saat aplikasi dibuat 0 impact, setelah aplikasi
dibuat 15 days dengan 60% performance gain. Lalu si penanya menggunakan 285
hari lainnya untuk membuat aplikasinya lebih modular, lebih mudah untuk di
maintain dan di extends, mereview design awal aplikasi. By the end of 300
days setelah aplikasi dibuat, bisa dikira2 aplikasi mana yang lebih bagus,
dan yang mana ya

Re: [JUG-Indonesia] Pertanyaan Newbie Tentang Looping For

2010-05-27 Terurut Topik Jecki
2010/5/28 Samuel Franklyn 
>
> >
> > Ga perlu baca source code dari getRowCount juga udah ketauan kalau
> > cara pertama itu cenderung lebih lelet, walaupun mungkin sangat kecil
> > sekali. Kecuali compiler melakukan optimization.
>
> Betul lebih lambat akan tetapi lebih lambat berapa persen?
> Kalau cuma lebih lambat 0.1 % apakah worthed kita menambahkan
> baris code. Ingat tiap baris code artinya pertambahan effort
> untuk memelihara aplikasi.
>

Penambahan code 1 baris macam deklarasi variable juga ga berpengaruh
banyak sama effort untuk memelihara aplikasi.

Setuju kalau optimization jangan sampai membuat aplikasi susah
di-maintain. Kasus di atas kan sebenarnya simple, sekali liat langsung
tau. Kemudian bisa disarikan jadi best practice. Setelah itu secara
otomatis tiap kali tulis code ikutin best practice. Tentunya best
practice itu musti yang gampang dilakukan. Jangan yang njelimet dan
error-prone.

> >
> > Terobsesi memang ada sisi baik dan buruknya. Tapi belajar memahami apa
> > yang baik dan tidak itu tidak ada salahnya. Lama-lama juga bosen
> > sendiri optimize hal2 seperti ini. Atau kalau sudah jadi habit malah
> > ga kepikiran sama sekali tau-tau codingnya udah optimized.
>
> Memahami cara kerja library itu bagus. Tapi apa
> yang dilakukan oleh Niksen adalah micro optimization.
> Dari pengalaman gua micro optimization itu distract seseorang
> dari the bigger picture.
>

OK gw ga tau context-nya dia tanya pertanyaan ini. Apakah untuk
optimize code yang sudah ada, yang sudah running well? Atau sekedar
mau tau yang mana yang lebih cepat, dan syukur2 dia mau coding kaya
gitu ke depannya. Kalau untuk optimize code yang sudah ada sih betul
ini micro optimization yang effort-nya mungkin ga akan sebanding
dengan peningkatan performance yang akan didapat. Bayangin misal
program dia sekarang ada 100 file source. Kemudian harus ubah code
yang pattern-nya seperti ini di ke 100 source files tersebut, tapi
peningkatan performance cuma misalnya 1%. Ini sama sekali ga worth it.

Beda kalau dia mau tau yang mana yang lebih cepat. Sekarang kan dia
uda tau tuh cara kedua memang lebih cepat. Setelah itu kalau mau
coding ya mustinya tau yang mana yang musti dipilih.

> > Ga ada salah sama statement Donald Knuth. Maksud dia baik. Jangan
> > optimize terlalu dini. Jangan over optimize sesuatu yang belum tentu
> > tidak optimized.
> >
> > Tapi di sisi lain ada orang yang tipenya ga mau tau soal optimasi sama
> > sekali. Coding maen hajar bleh, terus berlindung di balik statement
> > Donald Knuth "Premature optimization is the root of all evil". Sampai
> > satu titik kita musti optimasi. Nah bingung deh kalo udah gini.
>
> Nggak pernah kejadian tuh sama gua. Pada saat gua butuh melakukan
> optimisasi biasanya itu cuma perlu dilakukan di 1 atau 2 titik saja.
> Itu karena gua fokus membuat aplikasi yang semodular mungkin.
> Kalau ada bagian aplikasi yang lambat maka itu akan terkonsentrasi
> di 1 atau 2 titik saja.
>

Yah beda lah kalau udah se-level Samuel. Gw percaya banget ama kemampuan lu.

Tapi banyak org di luar sana yang coding WORA mirip slogan Java, tapi
Write Once Run (far, far, far) Away, alias tabrak lari. Nah buat orang
kaya gini nih musti diajarin nulis code secara manusiawi.

> >
> > Orang dulu bilang sedikit-sedikit lama-lama menjadi bukit. Kalo hanya
> > ada 1 baris code yang tidak optimize seperti contoh di atas mungkin
> > tidak terlalu banyak impact. Tapi kalau ada seribu baris seperti di
> > atas, tersebar di ratusan source files, akhirnya mempengaruhi
> > performance bukannya tambah repot.
>
> Ini juga pernyataan yang kelihatannya bagus akan tetapi
> tidak benar dalam praktek. Dalam praktek yang sudah
> saya tekuni selama belasan tahun maka saya temui yang namanya
> bottle neck itu tidak pernah tersebar diberbagai tempat.
> Seperti namanya bottle neck itu senantiasa terkonsentrasi
> di 1 atau 2 titik saja. Performance yang tinggi itu bagi saya
> adalah menghilangkan semua bottle neck dan memberikan
> kesan aplikasi responsif kepada user. Kalau dalam aplikasi
> tidak ada bottle neck maka begitu resource hardware atau
> network dinaikkan maka aplikasi akan langsung naik performancenya.
> Aplikasi yang senantiasa memberikan feed back ke user juga
> memberikan kesan lebih cepat padahal adanya code untuk
> feedback itu sebenarnya memperlambat kerja aplikasi.
>

Sekali lagi kasus micro optimization ga mungkin terjadi sama Samuel
(please take that as a compliment)

> >
> > Intinya sih sebagai developer musti ngerti lah do's and don'ts
> > programming dari berbagai aspek. Kalau tau hal2 kecil kaya gini bisa
> > mempengaruhi performance (walaupun musti muncul beribu kali dulu baru
> > berasa) ya lakukan dengan benar.
> >
>
> Bedakan isu memahami cara kerja library dengan isu melakukan
> micro optimization di mana-mana. Memahami cara kerja libray bagus dan perlu.
> Melakukan micro opt dimana-mana itu nggak bagus.

Setuju, tapi ada tambahan.

Micro optimization kalau:
- effort-nya kecil
- tidak mempengaruhi ke

Re: [JUG-Indonesia] Pertanyaan Newbie Tentang Looping For

2010-05-27 Terurut Topik Jecki
Okay it's valid for array case. But still I don't think it's valid for List.

Secara JIT itu di level yang lebih rendah dari Application classes.
Sewajarnya tidak ada pengecekan di level JIT yang kira2 seperti ini:

if (listClassInUse.instanceOf("java.util.ArrayList")) {
// let's optimize this code since it uses our own class
}

Meskipun hal ini bisa saja dilakukan, tapi koq rasanya aneh ya di
layered application platform level yang lebih rendah mengasumsikan
sesuatu yang ada di level atasnya.

But anyway nice reading. Nice to know that compiler optimize to this level.

2010/5/28 Hendry Luk 
>
>
>
> Btw jangan confuse "compiler" here as java/c# sebagai IL/bytecode compiler. 
> Compiler disini mostly refers to JIT compiler
>
> 2010/5/28 Hendry Luk 
>>
>> 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 
>>>
>>>
>>>
>>> 2010/5/27 Hendry Luk 
>>>
>>> >
>>> > 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 (::) {
>>> }
>>>
>>> itu bagian  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 maks

Re: [JUG-Indonesia] Pertanyaan Newbie Tentang Looping For

2010-05-27 Terurut Topik Adelwin Handoyo
Cepetan baca code nya sih ketimbang bikin program lalu debug
Hahahhahahaha


Adelwin Handoyo
- adel...@gmail.com -
Sent from my Mac



From: "Thomas Wiradikusuma (milis)" 
Reply-To: JUG-Indonesia 
Date: Fri, 28 May 2010 10:23:35 +0800
To: JUG-Indonesia 
Subject: Re: [JUG-Indonesia] Pertanyaan Newbie Tentang Looping For

Buset ngapain lo sentuh2 source codenya win, kan bisa tempel
breakpoint atau pake profiler yg include JDK.


On 5/27/10, Adelwin, Adelwin  wrote:
> Kalo menurut gue.. betul dan salah...
>
> Gimana membuktikan nya...
>
> Gini...
>
> JTable ituh bagian dari JDK...
>
> Compile ulang...
>
> Tambahin some debugging line di table.getRowCount...
>
> Jalanin for loop nya...
>
> Liat debugging line di table.getRowCount ituh jalan melulu ato enggak...
>
> G jamin Cuma jalan sekali...
>
> Waktu pertama kali masuk loop nya...
>
> G udah coba debug...
>
> Die kagak jalanin table.getRowCount terus2an tiap iteration...
>
> Sekali doang...
>
> Betul bahwa nomor 2 ituh baik...
>
> Tapi sebenernya 2-2 nya sama ajah...
>
> Oia... g nyoba nya pake list.getSize
>
> Males bikin qhole swing interface
>
>
>
>
>
> Adelwin Handoyo  |  Senior Consultant - Wholesale Bank
> Standard Chartered Bank
> 7, Changi Business Park Cresent, Level 3. Singapore (486028)
>
> T : (65) 659 61395  | E adelwin.adel...@sc.com
>
>
>
>
>
> 
>
> From: jug-indonesia@yahoogroups.com
> [mailto:jug-indone...@yahoogroups.com] On Behalf Of Jecki
> Sent: Thursday, May 27, 2010 4:18 PM
> To: jug-indonesia@yahoogroups.com
> Subject: Re: [JUG-Indonesia] Pertanyaan Newbie Tentang Looping For
>
>
>
>
>
> 2010/5/27 Niksen Harjanto  <mailto: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> bla bla bla
>> }
>>
>> Cara 2 (IMHO lebih efisen) :
>>
>> int x;
>> int y;
>> y = table.getRowCount();
>> for (x=0; 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 // bla bla bla
> }
>
> biar tetep efisien dan scope dari variable tetep sekecil mungkin.
>
>> makasih
>>
>
>
>
>
> This email and any attachments are confidential and may also be privileged.
> If you are not the addressee, do not disclose, copy, circulate or in any
> other way use or rely on the information contained in this email or any
> attachments.  If received in error, notify the sender immediately and delete
> this email and any attachments from your system.  Emails cannot be
> guaranteed to be secure or error free as the message and any attachments
> could be intercepted, corrupted, lost, delayed, incomplete or amended.
> Standard Chartered PLC and its subsidiaries do not accept liability for
> damage caused by this email or any attachments and may monitor email
> traffic.
>
>
>
> Standard Chartered PLC is incorporated in England with limited liability
> under company number 966425 and has its registered office at 1 Aldermanbury
> Square, London, EC2V 7SB.
>
>
>
> Standard Chartered Bank ("SCB") is incorporated in England with limited
> liability by Royal Charter 1853, under reference ZC18.  The Principal Office
> of SCB is situated in England at 1 Aldermanbury Square, London EC2V 7SB. In
> the United Kingdom, SCB is authorised and regulated by the Financial
> Services Authority under FSA register number 114276.
>
>
>
> If you are receiving this email from SCB outside the UK, please click
> http://www.standardchartered.com/global/email_disclaimer.html to refer to
> the information on other jurisdictions.
>


-- 
salam hangat,
Thomas Wiradikusuma
Twitter: http://www.twitter.com/wiradikusuma
Blog: http://www.jroller.com/wiradikusuma





Buktikan Anda peduli pendidikan Indonesia.
Dukung Kurikulum SMK berJava.. kirimkan surat resmi perusahaan dukungan ke
moderator JUG. 
===

Kalau mau keluar dari mailing list ini, caranya kirim sebuah email ke
jug-indonesia-unsubscr...@yahoogroups.com.

Jangan lupa, website JUG Indonesia adalah http://www.jug.or.id

Yahoo! Groups Links






Re: [JUG-Indonesia] Pertanyaan Newbie Tentang Looping For

2010-05-27 Terurut Topik Hendry Luk
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 

>
>
> 2010/5/27 Hendry Luk >
>
> >
> > 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 (::) {
> }
>
> itu bagian  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 u

Re: [JUG-Indonesia] Pertanyaan Newbie Tentang Looping For

2010-05-27 Terurut Topik Adelwin Handoyo
Hahahahha
Yoda conditions...
Bener sekali...
Hahahahha
Mungkin yang bikin character yoda ituh dulu juga programmer kali yah :p
Hahahahhaah


Adelwin Handoyo
- adel...@gmail.com -
Sent from my Mac



From: Arie K 
Reply-To: JUG-Indonesia 
Date: Fri, 28 May 2010 09:42:54 +0700
To: JUG-Indonesia 
Subject: Re: [JUG-Indonesia] Pertanyaan Newbie Tentang Looping For

2010/5/27 Andrian Kurniady 
> Banyak programmer yang kalau nulis comparison string dengan constant begini
> if ("blah".equals(myString)) ...
> rather than
> if (myString.equals("blah")) ...
> Tanya kenapa... :-)

Haha, seringkali disebut "Yoda Conditions":

Using if(constant == variable) instead of if(variable == constant),
like if(4 == foo). Because it's like saying "if blue is the sky" or
"if tall is the man".

:D
--
Arie Karhendana





Buktikan Anda peduli pendidikan Indonesia.
Dukung Kurikulum SMK berJava.. kirimkan surat resmi perusahaan dukungan ke
moderator JUG. 
===

Kalau mau keluar dari mailing list ini, caranya kirim sebuah email ke
jug-indonesia-unsubscr...@yahoogroups.com.

Jangan lupa, website JUG Indonesia adalah http://www.jug.or.id

Yahoo! Groups Links






Re: [JUG-Indonesia] Pertanyaan Newbie Tentang Looping For

2010-05-27 Terurut Topik Adelwin Handoyo
Oia g lupa..
G gak ngerti .net
Tapi g ngerti java
Hahaha
Gini..
Kalo ada 2 thread... 1 thread evaluate the list..
Dan ada 1 thread lagi yang attempt to modify the list... Ntar pasti keluar
exception
G pernah nih...
Attempting to modify a list which is currently being evaluated.
Kalo gak salah gitu deh..
Dengan kata laen.. 
Seharusnya sih thread-safe
G belom pernah baca code nya java-collection sih

Adelwin Handoyo
- adel...@gmail.com -
Sent from my Mac



From: Jecki Go 
Reply-To: JUG-Indonesia 
Date: Fri, 28 May 2010 11:01:02 +0800
To: JUG-Indonesia 
Subject: Re: [JUG-Indonesia] Pertanyaan Newbie Tentang Looping For

2010/5/27 Hendry Luk 
>
> 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 (::) {
}

itu bagian  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

Re: [JUG-Indonesia] Pertanyaan Newbie Tentang Looping For

2010-05-27 Terurut Topik Hendry Luk
Btw jangan confuse "compiler" here as java/c# sebagai IL/bytecode compiler.
Compiler disini mostly refers to JIT compiler

2010/5/28 Hendry Luk 

> 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 
>
>
>>
>> 2010/5/27 Hendry Luk >
>>
>> >
>> > 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 (::) {
>> }
>>
>> itu bagian  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

Re: [JUG-Indonesia] Pertanyaan Newbie Tentang Looping For

2010-05-27 Terurut Topik Samuel Franklyn
2010/5/28 Jecki :
> 2010/5/27 Samuel Franklyn 
>>
>> On 5/27/2010 3:08 PM, Niksen Harjanto wrote:
>> > 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> > bla bla bla
>> > }
>> >
>> > Cara 2 (IMHO lebih efisen) :
>> >
>> > int x;
>> > int y;
>> > y = table.getRowCount();
>> > for (x=0; 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?
>> >
>>
>> Nggak benar. Kecuali lu sudah baca source code dari getRowCount.
>> Bisa saja implementasi dari getRowCount menggunakan cache.
>> Kalau implementasinya menggunakan cache maka overheadnya cuma
>> method call overhead saja dan sangat kecil.
>>
>
> Ga perlu baca source code dari getRowCount juga udah ketauan kalau
> cara pertama itu cenderung lebih lelet, walaupun mungkin sangat kecil
> sekali. Kecuali compiler melakukan optimization.

Betul lebih lambat akan tetapi lebih lambat berapa persen?
Kalau cuma lebih lambat 0.1 % apakah worthed kita menambahkan
baris code. Ingat tiap baris code artinya pertambahan effort
untuk memelihara aplikasi.

>
> Jelas sekali kalau kita tau ada expression yang mustinya bisa
> dijalankan sekali saja maka sebaiknya dipanggil sekali saja dan
> disimpan di variable. Kecuali kasusnya adalah table.getRowCount() itu
> berubah-ubah nilainya, kalau ini sih memang harus dipanggil tiap kali
> iterasi.
>
>> Niksen sekedar nasihat. Pertanyaan kamu menunjukkan kamu
>> terlalu terobsesi dengan kecepatan. Ini obsesi yang berbahaya.
>> Percaya deh lama-lama kamu akan ketemu batunya dan menyesali
>> obsesi kamu.
>>
>
> Terobsesi memang ada sisi baik dan buruknya. Tapi belajar memahami apa
> yang baik dan tidak itu tidak ada salahnya. Lama-lama juga bosen
> sendiri optimize hal2 seperti ini. Atau kalau sudah jadi habit malah
> ga kepikiran sama sekali tau-tau codingnya udah optimized.

Memahami cara kerja library itu bagus. Tapi apa
yang dilakukan oleh Niksen adalah micro optimization.
Dari pengalaman gua micro optimization itu distract seseorang
dari the bigger picture.

>
>> Donald Knuth salah satu empu para programmer bilang begini:
>>
>> We should forget about small efficiencies, say about 97% of the time:
>> premature optimization is the root of all evil
>>
>> http://en.wikipedia.org/wiki/Program_optimization#When_to_optimize
>
> Ga ada salah sama statement Donald Knuth. Maksud dia baik. Jangan
> optimize terlalu dini. Jangan over optimize sesuatu yang belum tentu
> tidak optimized.
>
> Tapi di sisi lain ada orang yang tipenya ga mau tau soal optimasi sama
> sekali. Coding maen hajar bleh, terus berlindung di balik statement
> Donald Knuth "Premature optimization is the root of all evil". Sampai
> satu titik kita musti optimasi. Nah bingung deh kalo udah gini.

Nggak pernah kejadian tuh sama gua. Pada saat gua butuh melakukan
optimisasi biasanya itu cuma perlu dilakukan di 1 atau 2 titik saja.
Itu karena gua fokus membuat aplikasi yang semodular mungkin.
Kalau ada bagian aplikasi yang lambat maka itu akan terkonsentrasi
di 1 atau 2 titik saja.

>
> Orang dulu bilang sedikit-sedikit lama-lama menjadi bukit. Kalo hanya
> ada 1 baris code yang tidak optimize seperti contoh di atas mungkin
> tidak terlalu banyak impact. Tapi kalau ada seribu baris seperti di
> atas, tersebar di ratusan source files, akhirnya mempengaruhi
> performance bukannya tambah repot.

Ini juga pernyataan yang kelihatannya bagus akan tetapi
tidak benar dalam praktek. Dalam praktek yang sudah
saya tekuni selama belasan tahun maka saya temui yang namanya
bottle neck itu tidak pernah tersebar diberbagai tempat.
Seperti namanya bottle neck itu senantiasa terkonsentrasi
di 1 atau 2 titik saja. Performance yang tinggi itu bagi saya
adalah menghilangkan semua bottle neck dan memberikan
kesan aplikasi responsif kepada user. Kalau dalam aplikasi
tidak ada bottle neck maka begitu resource hardware atau
network dinaikkan maka aplikasi akan langsung naik performancenya.
Aplikasi yang senantiasa memberikan feed back ke user juga
memberikan kesan lebih cepat padahal adanya code untuk
feedback itu sebenarnya memperlambat kerja aplikasi.

>
> Intinya sih sebagai developer musti ngerti lah do's and don'ts
> programming dari berbagai aspek. Kalau tau hal2 kecil kaya gini bisa
> mempengaruhi performance (walaupun musti muncul beribu kali dulu baru
> berasa) ya lakukan dengan benar.
>

Bedakan isu memahami cara kerja library dengan isu melakukan
micro optimization di mana-mana. Memahami cara kerja libray bagus dan

Re: [JUG-Indonesia] Pertanyaan Newbie Tentang Looping For

2010-05-27 Terurut Topik Jecki
2010/5/27 Andrian Kurniady 
>
> Coding practice, misal:
> Banyak programmer yang kalau nulis comparison string dengan constant begini
> if ("blah".equals(myString)) ...
> rather than
> if (myString.equals("blah")) ...

Cuma mau komen soal ini. Kalau model pertama itu null-safe, model
kedua tidak null-safe.

Memang keliatan jelek sih (personal opinion). Tapi memang model
pertama tidak akan melemparkan NPE. Kalau mau jadiin model 2 ya musti

if (myString != null && myString.equals("blah"))

Nah dipilih deh yang mana yang anda suka.

Kalau gw sendiri kadang pake model pertama (kalau ga pasti model 2
tidak null), kadang model 2 (kalau ud pasti myString ga bakalan null).


Re: [JUG-Indonesia] Pertanyaan Newbie Tentang Looping For

2010-05-27 Terurut Topik Jecki
2010/5/27 Hendry Luk 
>
> 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 (::) {
}

itu bagian  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 bua

Re: [JUG-Indonesia] Pertanyaan Newbie Tentang Looping For

2010-05-27 Terurut Topik Arie K
2010/5/27 Andrian Kurniady 
> Banyak programmer yang kalau nulis comparison string dengan constant begini
> if ("blah".equals(myString)) ...
> rather than
> if (myString.equals("blah")) ...
> Tanya kenapa... :-)

Haha, seringkali disebut "Yoda Conditions":

Using if(constant == variable) instead of if(variable == constant),
like if(4 == foo). Because it's like saying "if blue is the sky" or
"if tall is the man".

:D
--
Arie Karhendana


Re: [JUG-Indonesia] Pertanyaan Newbie Tentang Looping For

2010-05-27 Terurut Topik bernadus . edwin
Setuju banget, lupakanlah hal2 kecil seperti ini.

Saran nya lebih focus ke arah easy to maintaince dan easy to read.

program banyak makan resource?,
beli memory solusinya.
program ingin lebih cepet?,
upgrade server saja.
Program ingin minimalize bug?,
Itu priceless.


Thx,
Edwin 
Powered by Telkomsel BlackBerry®

-Original Message-
From: Samuel Franklyn 
Sender: jug-indonesia@yahoogroups.com
Date: Thu, 27 May 2010 17:49:33 
To: 
Reply-To: jug-indonesia@yahoogroups.com
Subject: Re: [JUG-Indonesia]  Pertanyaan Newbie Tentang Looping For

On 5/27/2010 3:08 PM, Niksen Harjanto wrote:
> 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 bla bla bla
> }
>
> Cara 2 (IMHO lebih efisen) :
>
> int x;
> int y;
> y = table.getRowCount();
> for (x=0; 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?
>

Nggak benar. Kecuali lu sudah baca source code dari getRowCount.
Bisa saja implementasi dari getRowCount menggunakan cache.
Kalau implementasinya menggunakan cache maka overheadnya cuma
method call overhead saja dan sangat kecil.

Niksen sekedar nasihat. Pertanyaan kamu menunjukkan kamu
terlalu terobsesi dengan kecepatan. Ini obsesi yang berbahaya.
Percaya deh lama-lama kamu akan ketemu batunya dan menyesali
obsesi kamu.

Donald Knuth salah satu empu para programmer bilang begini:

We should forget about small efficiencies, say about 97% of the time:
premature optimization is the root of all evil

http://en.wikipedia.org/wiki/Program_optimization#When_to_optimize



Re: [JUG-Indonesia] Pertanyaan Newbie Tentang Looping For

2010-05-27 Terurut Topik Thomas Wiradikusuma (milis)
Buset ngapain lo sentuh2 source codenya win, kan bisa tempel
breakpoint atau pake profiler yg include JDK.


On 5/27/10, Adelwin, Adelwin  wrote:
> Kalo menurut gue.. betul dan salah...
>
> Gimana membuktikan nya...
>
> Gini...
>
> JTable ituh bagian dari JDK...
>
> Compile ulang...
>
> Tambahin some debugging line di table.getRowCount...
>
> Jalanin for loop nya...
>
> Liat debugging line di table.getRowCount ituh jalan melulu ato enggak...
>
> G jamin Cuma jalan sekali...
>
> Waktu pertama kali masuk loop nya...
>
> G udah coba debug...
>
> Die kagak jalanin table.getRowCount terus2an tiap iteration...
>
> Sekali doang...
>
> Betul bahwa nomor 2 ituh baik...
>
> Tapi sebenernya 2-2 nya sama ajah...
>
> Oia... g nyoba nya pake list.getSize
>
> Males bikin qhole swing interface
>
>
>
>
>
> Adelwin Handoyo  |  Senior Consultant - Wholesale Bank
> Standard Chartered Bank
> 7, Changi Business Park Cresent, Level 3. Singapore (486028)
>
> T : (65) 659 61395  | E adelwin.adel...@sc.com
>
>
>
>
>
> 
>
> From: jug-indonesia@yahoogroups.com
> [mailto:jug-indone...@yahoogroups.com] On Behalf Of Jecki
> Sent: Thursday, May 27, 2010 4:18 PM
> To: jug-indonesia@yahoogroups.com
> Subject: Re: [JUG-Indonesia] Pertanyaan Newbie Tentang Looping For
>
>
>
>
>
> 2010/5/27 Niksen Harjanto  <mailto: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> bla bla bla
>> }
>>
>> Cara 2 (IMHO lebih efisen) :
>>
>> int x;
>> int y;
>> y = table.getRowCount();
>> for (x=0; 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 // bla bla bla
> }
>
> biar tetep efisien dan scope dari variable tetep sekecil mungkin.
>
>> makasih
>>
>
>
>
>
> This email and any attachments are confidential and may also be privileged.
> If you are not the addressee, do not disclose, copy, circulate or in any
> other way use or rely on the information contained in this email or any
> attachments.  If received in error, notify the sender immediately and delete
> this email and any attachments from your system.  Emails cannot be
> guaranteed to be secure or error free as the message and any attachments
> could be intercepted, corrupted, lost, delayed, incomplete or amended.
> Standard Chartered PLC and its subsidiaries do not accept liability for
> damage caused by this email or any attachments and may monitor email
> traffic.
>
>
>
> Standard Chartered PLC is incorporated in England with limited liability
> under company number 966425 and has its registered office at 1 Aldermanbury
> Square, London, EC2V 7SB.
>
>
>
> Standard Chartered Bank ("SCB") is incorporated in England with limited
> liability by Royal Charter 1853, under reference ZC18.  The Principal Office
> of SCB is situated in England at 1 Aldermanbury Square, London EC2V 7SB. In
> the United Kingdom, SCB is authorised and regulated by the Financial
> Services Authority under FSA register number 114276.
>
>
>
> If you are receiving this email from SCB outside the UK, please click
> http://www.standardchartered.com/global/email_disclaimer.html to refer to
> the information on other jurisdictions.
>


-- 
salam hangat,
Thomas Wiradikusuma
Twitter: http://www.twitter.com/wiradikusuma
Blog: http://www.jroller.com/wiradikusuma


RE: [JUG-Indonesia] Pertanyaan Newbie Tentang Looping For

2010-05-27 Terurut Topik Adelwin, Adelwin
Actually for (xx : list) juga udah ada di java sih

Hahahaha

Dan sebenernya Optimization nya di compiler juga udah ok kok buat handle
case2 macam gini...

And true ituh... most often than not, your attempts to optimize your
code actually makes it worse.

For itu tadi tuh Cuma jalan di jdk5 sih setau gue... 

Kalo di jdk1.4 pake nya iterator...

But then again...

This is irrelevant kan...

Table element kan bukan list...

Heheheheh

I mean.. bukan actually a list... tapi yah emang list of something...
tapi bukan List gituh...

Soal optimization attempts... pake 80-20 rule...

Buat apa exert effort 80% demi untuk serve 20%

Mendingan exert effort 20% demi untuk serve 80%

Hehehehe

Get the idea?

Don't worry too much about it.

 

 

Adelwin Handoyo  |  Senior Consultant - Wholesale Bank
Standard Chartered Bank
7, Changi Business Park Cresent, Level 3. Singapore (486028)

T : (65) 659 61395  | E adelwin.adel...@sc.com 

 

 



From: jug-indonesia@yahoogroups.com
[mailto:jug-indone...@yahoogroups.com] On Behalf Of Hendry Luk
Sent: Thursday, May 27, 2010 6:20 PM
To: jug-indonesia@yahoogroups.com
Subject: Re: [JUG-Indonesia] Pertanyaan Newbie Tentang Looping For

 

  

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.

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.

Foreach syntax, for(xx: list), is even better.

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.
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.

2010/5/27 Jecki mailto:jecki...@gmail.com> >

  

2010/5/27 Niksen Harjanto mailto: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 bla bla bla
> }
>
> Cara 2 (IMHO lebih efisen) :
>
> int x;
> int y;
> y = table.getRowCount();
> for (x=0; 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 makasih
>

 




This email and any attachments are confidential and may also be privileged.  If 
you are not the addressee, do not disclose, copy, circulate or in any other way 
use or rely on the information contained in this email or any attachments.  If 
received in error, notify the sender immediately and delete this email and any 
attachments from your system.  Emails cannot be guaranteed to be secure or 
error free as the message and any attachments could be intercepted, corrupted, 
lost, delayed, incomplete or amended.  Standard Chartered PLC and its 
subsidiaries do not accept liability for damage caused by this email or any 
attachments and may monitor email traffic.

 

Standard Chartered

Re: [JUG-Indonesia] Pertanyaan Newbie Tentang Looping For

2010-05-27 Terurut Topik Jecki
2010/5/27 Samuel Franklyn 
>
> On 5/27/2010 3:08 PM, Niksen Harjanto wrote:
> > 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 > bla bla bla
> > }
> >
> > Cara 2 (IMHO lebih efisen) :
> >
> > int x;
> > int y;
> > y = table.getRowCount();
> > for (x=0; 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?
> >
>
> Nggak benar. Kecuali lu sudah baca source code dari getRowCount.
> Bisa saja implementasi dari getRowCount menggunakan cache.
> Kalau implementasinya menggunakan cache maka overheadnya cuma
> method call overhead saja dan sangat kecil.
>

Ga perlu baca source code dari getRowCount juga udah ketauan kalau
cara pertama itu cenderung lebih lelet, walaupun mungkin sangat kecil
sekali. Kecuali compiler melakukan optimization.

Jelas sekali kalau kita tau ada expression yang mustinya bisa
dijalankan sekali saja maka sebaiknya dipanggil sekali saja dan
disimpan di variable. Kecuali kasusnya adalah table.getRowCount() itu
berubah-ubah nilainya, kalau ini sih memang harus dipanggil tiap kali
iterasi.

> Niksen sekedar nasihat. Pertanyaan kamu menunjukkan kamu
> terlalu terobsesi dengan kecepatan. Ini obsesi yang berbahaya.
> Percaya deh lama-lama kamu akan ketemu batunya dan menyesali
> obsesi kamu.
>

Terobsesi memang ada sisi baik dan buruknya. Tapi belajar memahami apa
yang baik dan tidak itu tidak ada salahnya. Lama-lama juga bosen
sendiri optimize hal2 seperti ini. Atau kalau sudah jadi habit malah
ga kepikiran sama sekali tau-tau codingnya udah optimized.

> Donald Knuth salah satu empu para programmer bilang begini:
>
> We should forget about small efficiencies, say about 97% of the time:
> premature optimization is the root of all evil
>
> http://en.wikipedia.org/wiki/Program_optimization#When_to_optimize

Ga ada salah sama statement Donald Knuth. Maksud dia baik. Jangan
optimize terlalu dini. Jangan over optimize sesuatu yang belum tentu
tidak optimized.

Tapi di sisi lain ada orang yang tipenya ga mau tau soal optimasi sama
sekali. Coding maen hajar bleh, terus berlindung di balik statement
Donald Knuth "Premature optimization is the root of all evil". Sampai
satu titik kita musti optimasi. Nah bingung deh kalo udah gini.

Orang dulu bilang sedikit-sedikit lama-lama menjadi bukit. Kalo hanya
ada 1 baris code yang tidak optimize seperti contoh di atas mungkin
tidak terlalu banyak impact. Tapi kalau ada seribu baris seperti di
atas, tersebar di ratusan source files, akhirnya mempengaruhi
performance bukannya tambah repot.

Intinya sih sebagai developer musti ngerti lah do's and don'ts
programming dari berbagai aspek. Kalau tau hal2 kecil kaya gini bisa
mempengaruhi performance (walaupun musti muncul beribu kali dulu baru
berasa) ya lakukan dengan benar.


Re: [JUG-Indonesia] Pertanyaan Newbie Tentang Looping For

2010-05-27 Terurut Topik Ifnu bima
> for (x=0; x bla bla bla
> }

Biasanya saya ga pernah kerja langsung dengan table.getRowCount(),
tapi dengan datamodel di belakang jTable. Misalnya mau membuat table
dari class Person, ya saya  bikin PersonTableModel, kemudian dari
tablemodel tersebut dipass ke table. Misalnya gini

public class Person{

  private String name;
  private String address;
  //getter setter
}

public class PersonTableModel extends AbstractTableModel{

   private List persons;

public PersonTableModel(List persons){
this.persons=persons;
}

public int getRowCount() {
return persons.size();
}
public int getColumnCount() {
return 2;
}
public Object getValueAt(int rowIndex, int columnIndex) {
Person p = persons.get(rowIndex);
switch(columnIndex){
case 0 : return p.getNama();
case 1 : return p.getAlamat();
default: return "";
}
}

}

Cara makenya :

List persons =  //ambil list persons dari database,
biasanya pake Hibernate;
PersonTableModel model = new PersonTableModel(persons);
jTable.setModel(model);

Nah dengan menggunakan model ini jTable.getRowCount() akan memanggil
PersonTableModel.getRowCount() dan pada akhirnya akan memanggil
List.size(), kalau kita lihat implementasinya List.size() sepertinya
aman memanggil getRowCount() berkali-kali tanpa ada penalti dari sisi
kecepatan.


--

regards


Re: [JUG-Indonesia] Pertanyaan Newbie Tentang Looping For

2010-05-27 Terurut Topik Hendry Luk
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.

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.

Foreach syntax, for(xx: list), is even better.

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.
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.

2010/5/27 Jecki 

>
>
> 2010/5/27 Niksen Harjanto 
> 
> >
>
> >
> >
> >
> > 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 > bla bla bla
> > }
> >
> > Cara 2 (IMHO lebih efisen) :
> >
> > int x;
> > int y;
> > y = table.getRowCount();
> > for (x=0; 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 // bla bla bla
> }
>
> biar tetep efisien dan scope dari variable tetep sekecil mungkin.
>
> > makasih
> >
>  
>


RE: [JUG-Indonesia] Pertanyaan Newbie Tentang Looping For

2010-05-27 Terurut Topik Adelwin, Adelwin
Kalo menurut gue.. betul dan salah...

Gimana membuktikan nya...

Gini...

JTable ituh bagian dari JDK...

Compile ulang...

Tambahin some debugging line di table.getRowCount...

Jalanin for loop nya...

Liat debugging line di table.getRowCount ituh jalan melulu ato enggak...

G jamin Cuma jalan sekali...

Waktu pertama kali masuk loop nya...

G udah coba debug...

Die kagak jalanin table.getRowCount terus2an tiap iteration...

Sekali doang...

Betul bahwa nomor 2 ituh baik...

Tapi sebenernya 2-2 nya sama ajah...

Oia... g nyoba nya pake list.getSize

Males bikin qhole swing interface

 

 

Adelwin Handoyo  |  Senior Consultant - Wholesale Bank
Standard Chartered Bank
7, Changi Business Park Cresent, Level 3. Singapore (486028)

T : (65) 659 61395  | E adelwin.adel...@sc.com 

 

 



From: jug-indonesia@yahoogroups.com
[mailto:jug-indone...@yahoogroups.com] On Behalf Of Jecki
Sent: Thursday, May 27, 2010 4:18 PM
To: jug-indonesia@yahoogroups.com
Subject: Re: [JUG-Indonesia] Pertanyaan Newbie Tentang Looping For

 

  

2010/5/27 Niksen Harjanto mailto: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 bla bla bla
> }
>
> Cara 2 (IMHO lebih efisen) :
>
> int x;
> int y;
> y = table.getRowCount();
> for (x=0; 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 makasih
>




This email and any attachments are confidential and may also be privileged.  If 
you are not the addressee, do not disclose, copy, circulate or in any other way 
use or rely on the information contained in this email or any attachments.  If 
received in error, notify the sender immediately and delete this email and any 
attachments from your system.  Emails cannot be guaranteed to be secure or 
error free as the message and any attachments could be intercepted, corrupted, 
lost, delayed, incomplete or amended.  Standard Chartered PLC and its 
subsidiaries do not accept liability for damage caused by this email or any 
attachments and may monitor email traffic.

 

Standard Chartered PLC is incorporated in England with limited liability under 
company number 966425 and has its registered office at 1 Aldermanbury Square, 
London, EC2V 7SB.

 

Standard Chartered Bank ("SCB") is incorporated in England with limited 
liability by Royal Charter 1853, under reference ZC18.  The Principal Office of 
SCB is situated in England at 1 Aldermanbury Square, London EC2V 7SB. In the 
United Kingdom, SCB is authorised and regulated by the Financial Services 
Authority under FSA register number 114276.

 

If you are receiving this email from SCB outside the UK, please click 
http://www.standardchartered.com/global/email_disclaimer.html to refer to the 
information on other jurisdictions.



Re: [JUG-Indonesia] Pertanyaan Newbie Tentang Looping For

2010-05-27 Terurut Topik Niksen Harjanto
ok thanks...

On 5/27/10, Jecki  wrote:
> 2010/5/27 Niksen Harjanto 
>>
>>
>>
>> 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> bla bla bla
>> }
>>
>> Cara 2 (IMHO lebih efisen) :
>>
>> int x;
>> int y;
>> y = table.getRowCount();
>> for (x=0; 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   // bla bla bla
> }
>
> biar tetep efisien dan scope dari variable tetep sekecil mungkin.
>
>> makasih
>>
>
>
> 
>
> 
> Buktikan Anda peduli pendidikan Indonesia.
> Dukung Kurikulum SMK berJava.. kirimkan surat resmi perusahaan dukungan ke
> moderator JUG.
> ===
>
> Kalau mau keluar dari mailing list ini, caranya kirim sebuah email ke
> jug-indonesia-unsubscr...@yahoogroups.com.
>
> Jangan lupa, website JUG Indonesia adalah http://www.jug.or.id
>
> Yahoo! Groups Links
>
>
>
>


Re: [JUG-Indonesia] Pertanyaan Newbie Tentang Looping For

2010-05-27 Terurut Topik Andrian Kurniady
Kalo di C banyak orang yang terjebak bikin looping begini

for (int i=0;i

>
>
> On 5/27/2010 3:08 PM, Niksen Harjanto wrote:
> > 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 > bla bla bla
> > }
> >
> > Cara 2 (IMHO lebih efisen) :
> >
> > int x;
> > int y;
> > y = table.getRowCount();
> > for (x=0; 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?
> >
>
> Nggak benar. Kecuali lu sudah baca source code dari getRowCount.
> Bisa saja implementasi dari getRowCount menggunakan cache.
> Kalau implementasinya menggunakan cache maka overheadnya cuma
> method call overhead saja dan sangat kecil.
>
> Niksen sekedar nasihat. Pertanyaan kamu menunjukkan kamu
> terlalu terobsesi dengan kecepatan. Ini obsesi yang berbahaya.
> Percaya deh lama-lama kamu akan ketemu batunya dan menyesali
> obsesi kamu.
>
> Donald Knuth salah satu empu para programmer bilang begini:
>
> We should forget about small efficiencies, say about 97% of the time:
> premature optimization is the root of all evil
>
> http://en.wikipedia.org/wiki/Program_optimization#When_to_optimize
>
>  
>


Re: [JUG-Indonesia] Pertanyaan Newbie Tentang Looping For

2010-05-27 Terurut Topik Samuel Franklyn
On 5/27/2010 3:08 PM, Niksen Harjanto wrote:
> 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 bla bla bla
> }
>
> Cara 2 (IMHO lebih efisen) :
>
> int x;
> int y;
> y = table.getRowCount();
> for (x=0; 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?
>

Nggak benar. Kecuali lu sudah baca source code dari getRowCount.
Bisa saja implementasi dari getRowCount menggunakan cache.
Kalau implementasinya menggunakan cache maka overheadnya cuma
method call overhead saja dan sangat kecil.

Niksen sekedar nasihat. Pertanyaan kamu menunjukkan kamu
terlalu terobsesi dengan kecepatan. Ini obsesi yang berbahaya.
Percaya deh lama-lama kamu akan ketemu batunya dan menyesali
obsesi kamu.

Donald Knuth salah satu empu para programmer bilang begini:

We should forget about small efficiencies, say about 97% of the time:
premature optimization is the root of all evil

http://en.wikipedia.org/wiki/Program_optimization#When_to_optimize


Re: [JUG-Indonesia] Pertanyaan Newbie Tentang Looping For

2010-05-27 Terurut Topik Jecki
2010/5/27 Niksen Harjanto 
>
>
>
> 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 bla bla bla
> }
>
> Cara 2 (IMHO lebih efisen) :
>
> int x;
> int y;
> y = table.getRowCount();
> for (x=0; 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 makasih
>


[JUG-Indonesia] Pertanyaan Newbie Tentang Looping For

2010-05-27 Terurut Topik Niksen Harjanto
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