Purefect Optimization (Bahasan Formal :D)
Sekali-kali mo bahas yang sedikit ilmiah
Purefect Desktop baru aja di re-release. Buat kamu yang mo nyoba purefect yang baru, bisa mengakses ke www.purefect.org. Dalam re-release ini yang baru adalah sudah dimasukknya beberapa teknik optimisasi untuk membuat purefect terlihat lebih cepat diloading. Buat yang sudah pernah nyoba purefect yang lama trus nyoba purefect yang di re-release, pasti ngerasa ada perbedaan besar dalam kecepatan loading. Ya mungkin masih enggak begitu bagus, tapi lumayan lah
:D :D.
Disini saya mo ngebahas optimisasi yang sudah dilakukan secara lebih formal, supaya tehnik ini bisa dipake sama kamu-kamu yang perlu di proyeknya masing-masing (dan sekalian biar saya juga gak lupa :D).
Tehnik yang (telah dan akan) dipakai oleh purefect desktop adalah :
1. Minimalisasi HTTP Request
Dari pengalaman tim klorofil, hal yang paling berpengaruh dalam kecepatan loading adalah banyaknya request yang dilakukan browser ke server untuk menampilkan 1 page.
Maksudnya begini, misal kamu punya page yang perlu 5 image, 1 css dan 3 js file, maka banyaknya request browser ke server adalah 10 (1 untuk page, 5 untuk image, 1 untuk css dan 3 untuk js). Proses request adalah sebagai berikut :
- Browser merequest page kemudian memparsing file htmlnya
- Untuk tiap file yang dibutuhin (image, css, js) dilakukan HTTP request terpisah
Perlu diingat sesuai dengan spesifikasi HTTP, browser mendownload file pendukung maksimal 2 thread per page. Maksudnya dari 5 image tadi diatas, download dilakukan 2 image persatu waktu. Kemudian khusus untuk javascript, beberapa browser mendownload satu-satu untuk menjaga keterurutan kode.
Bisa dilihat kan bagaimana makin banyak HTTP request, makin lambat sebuah page diload. Yang paling berpengaruh tentu overhead request-response (yang dilakukan 2-2 :(). Oleh karena itu, meminimalkan jumlah HTTP request tentu aja sebuah ide yang sangat penting. Yang dilakukan di purefect :
a. Dekomposisi Javascript Kemudian Jadikan Monolitik
Maksudnya gini, usahain klasifikasikan kelas-kelas & fungsi-fungsi javascript berdasarkan kemungkinan perubahan. Jadi nanti kita bisa misahin antara yang gak akan berubah, yang jarang berubah dan sering berubah. Kemudian untuk yang gak pernah berubah, lebih baik dijadikan satu file besar aja, jangan terpisah. Yang jarang berubah diusahain sesedikit mungkin filenya (lakukan penggabungan sebanyak mungkin), yang sering berubah bebas. Tehnik ini nanti juga berpengaruh ke tehnik caching yang saya bahas dibawah.
b. Image Sliding & Image Sprite
Intinya sih gabungin beberapa gambar menjadi satu file. Image sliding cara kerjanya seperti ini, misal saya punya button dengan 3 state, mau pakai 3 gambar supaya kelihatan ada efek animasinya, nah kan ukuran gambarnya sama semua jadi saya bisa menggabungkan ke 1 file trus pake css posisi untuk membuat efek animasi.
Contoh file gambar :
trus untuk state 1 pakai css :
style="{background: url(button.gif) no-repeat top left}"untuk state 2 (dipake di event onMouseMove) :
style="{background: url(button.gif) no-repeat center left}"untuk state 3 (dipake di event onMouseDown) :
style="{background: url(button.gif) no-repeat bottom left}"Untuk image sprite, kita gabungin gambar-gambar menjadi satu file trus untuk menampilkannya pake css posisi dengan point.
contoh file 100×50, 1gambar 50×50 :
Untuk nampilin gambar yang pertama :
style="{width: 50; height: 50; background: url(sprite.gif) no-repeat 0 0}"Untuk nampilin gambar yang kedua :
style="{width: 50; height: 50; background: url(sprite.gif) no-repeat -50 0}"dan seterusnya.
c. Connection KeepAlive
Idenya begini, kalau request dilakukan berulang-ulang maka ada overhead pembukaan koneksi socket antara browser dan server. Pembukaan koneksi adalah aktifitas yang memakan waktu dan resource server. Oleh karena itu kalau ada cara supaya permintaan yang berulang-ulang tersebut bisa hanya memakai 1 pembukaan koneksi pasti akan mempercepat proses download.
Untuk server apache tehnik ini bisa dilakukan dengan merubah setting berikut :
MaxKeepAliveRequests 0
Setting ini membuat semua request dijaga tetap tersambung, jadi bisa dipakai untuk request selanjutnya. Tapi jangan lupa untuk setting :
KeepAliveTimeout 15Setting ini untuk menjaga koneksi yang sudah tidak request bisa langsung ditutup. Memang tehnik ini memerlukan akses ke httpd.conf, mungkin gak semua orang bisa melaksanakan. Untuk server lain cari sendiri ya
![]()
2. Compressing
Inti dari tehnik compressing adalah membuat file yang ditransfer sekecil mungkin supaya waktu transfernya lebih cepat. Yang mungkin dilakukan :
a. Usahain gambar dalam format GIF
gif sepertinya format yang mengkompress gambar paling baik, walau mungkin masalah warna terjadi pengurangan. Tapi kan enggak semua gambar kita perlu kualitas foto kan ?
b. Kalo pake jpeg, pake jpeg2000
jpeg 2000 melakukan kompresi lebih baik dari jpeg yang sebelumnya.
c. Turunin kualitas gambar (kalo bisa)
file jpeg dan png bisa ditentuin kualitas gambarnya, kalo bisa nurunin kualitas dalam batas yang masih ditoleransi, bisa menghemat byte file.
d. Hilangin whitepace di html, css dan javascript
whitespace (spasi, tab dan enter) enggak berpengaruh ke file-file diatas, kalo bisa dihilangin tentu aja menghemat byte yang perlu ditransfer. Tapi inget ada beberapa kasus di javascript yang gak bisa dihilangkan.
contoh
html asli :
body Text
html menjadi :body text
css asli :
.control {
position: absolute;
left: 0;
top: 0;
font-family: Arial;
font-size: 8pt;
}
dijadikan :.control {position: absolute;left:0;top:0;font-family:Arial;font-size:8pt;}
javascript asli :
for (var i = 0; i < 25; i++)
{
obj1.count(i);
}dijadikan :
for (var i=0;i<25;i++){obj1.count(i);}
Tapi kalo dihilangin whitespecenya akan menyulitkan pembacaan kode selanjutnya, makanya pisahin antara kode pengembangan dan kode operasional.kemudian di windows, enter adalah “\r\n” kalo bisa pakai “\n” aja, dibrowser diartikan sama aja
Selanjutnya, sehabis penghilangan whitespace biasanya menghasilkan kode seperti ini :
"satu "+" dua"model ini bisa dioptimisasi jadi
"satu dua"pertama menghemat byte, kedua menghemat proses jadi javascriptnya jadi lebih cepat.
e. Gunain variable sependek mungkin di javascript
misalnya kita pakai nama variable “TemporaryValue”, kalo diubah jadi “tmpVal” kan menghemat beberapa byte tanpa menghilangkan arti semantiknya.
Trus kalau ada kasus seperti ini :
this.button.setLeft(25);
this.button.setWidth(25);
this.button.setHeight(25);
this.button.setWidth(25);bisa dirubah menjadi :
var o = this.button;
o.setLeft(25);
o.setWidth(25);
o.setHeight(25);
o.setWidth(25);
3. Caching
Caching adalah tehnologi yang paling sering disalah artiin sama web developer. Jadi banyak yang menganggap caching menyebabkan aplikasi web mereka jadi gak benar dan kehilangan kontrol terhadap akses ke web mereka. Padahal kalo aturan cache yang dilakukan browser, cache bisa menjadi tools yang sangat berguna bagi web developer.
Aturan cache yang dilakukan oleh browser :
a. file index (index.php / index.html) kemungkinan besar tidak dicache
b. bila di HTTP response ada “Cache-Control: no-cache” maka tidak dicache
c. bila di HTTP response tidak ada “ETag” atau “Last-Modified” tidak akan di cache
d. kalo request memakai method POST sebagian besar browser tidak akan mencache responsenya
e. kala di request dengan methos GET tapi ada query string contoh a.php?v=123 sebagian besar browser tidak mencache
f. SSL pasti tidak dicache
Jadi dengan menggunakan aturan diatas, kita membuat file yang jarang berubah untuk semaksimal mungkin bisa dicache di client.
a. image & css kemungkinan besar di cache
tapi kita bisa memastikan dengan setting apache :
ExpiresActive On
ExpiresByType image/gif “modification plus 1 year”
ExpiresByType image/png “modification plus 1 year”
ExpiresByType text/css “modification plus 1 year”
nb. menurut spesifikasi HTTP cache maksimal 1 tahun
b. js di cache, tapi untuk mengantisipasi perubahan kita memakai format nama file :
abc.ver1.js
jadi di htmlnya :
normalnya js akan dicache, nanti kalau ada perubahan di js, ubah nama filenya jadi :
abc.ver2.js
di htmlnya :
Kalau ada yang takut melakukannya dengan manual, maka bisa diotomatisasi dengan bantuan php :
nama file tetap :
abc.js
di html :
trus kita memakai rewrite engine apache, setting di httpd.conf :
RewriteEngine on
RewriteRule ^(.*\.)ver[0-9.]+\.(js)$ $1$2 [L]mungkin ada yang sudah mengimplementasikan pake abc.js?ver=123, ternyata model tersebut tidak dicache oleh browser, jadi tehnik itu adalah tehnik yang sia-sia.
c. file php yang jarang berubah, untuk mencachenya bisa memakai :
Header("Cache-Control: must-revalidate");
$offset = 60 * 60 * 24 * 3;
$ExpStr = “Expires: ” . gmdate(”D, d M Y H:i:s”, time() + $offset) . ” GMT”;
Header($ExpStr);
?>
d. Usahain gunain method GET untuk file yang jarang berubah
e. Gunain SSL seminimal mungkin
f. Kalo update file di server, update yang berubah saja
Sekian dulu dari saya mudah-mudahan bisa bermanfaat.

January 15th, 2007 at 10:55 pm
salam kenal…
wah konsep nya keren mas…
optimasi di AJAX based web memang perlu sekali kayanya…
tapi kok purefect.org masih suka mbengong kalo dibuka by Dial-Up ya :((
apakah optimasinya blom sepenuhnya di-implement ya..?
sekalian saya mau minta saran dari anda niy mas…
kebetulan saya sedang menyelesaikan (mencari) judul dan materi tugas akhir saya, dan saya sangat tertarik dengan konsep WebOS dan future web feature nantinya. dan saya sudah mencari berbagai referensi di NET karena buku’ di Indo masih kurang berbobot… *tanyakenapa*
Ada saran dari anda ga mas.. saya harus memulai dari mana?
di Indo kayanya susah cari orang yang bisa diajak diskusi soal ini ya…
dan kalo bisa Forum di Klorofil.org dibuat lebih Familiar lagi dong mas..
supaya local people kya saya ga minder ikut diskusi disana, secara bahasanya LinggiS semua..
ok deh, sukses terus buat projectnya…
January 20th, 2007 at 7:45 am
Wah aksesnya dari dialup ya, mungkin memang berat, tapi liat spek komputernya juga, javascript memang saat ini masih lambat.
Soal WebOS di Indonesia memang masih susah, klorofil aja harus ngeraba-raba sendiri, yang dari luar juga belum ada yang bener-bener mature. Tapi kalo diskusi sama saya, bisa saya layanin by email dulu. Untuk forum indonesianya mungkin kita persiapkan dalam waktu dekat
March 10th, 2007 at 2:43 am
met kenal,
nice article here,
ada pertanyaan nih mas, aku lagi bikin aplikasi, ceritanya nampilin list server, terus kalo di klik keluar suatu modal box yg nampilin detail server itu. ( aku gunain Mootols ama Moodalbox)
kalau pake dial up, waktu quey list server lumayan lama ngeload page-nya aku pakein ob_flush, jadi bisa partial keluarnya.
masalahnya waktu klik salah satu list itu ( kondisi page masih loading ) modalboxnya bisa nampil tapi response-nya tadi dijalankan setelah page list itu kelar di load.
ada saran nggak mas buat optimasi apachenya ? pengennya bisa concurrent gitu, requestnya
March 10th, 2007 at 3:24 am
Hello,
sorry, just ignore my previous question.
setelah oprek2 dikit ternya ta bukan di apache masalahnya tetapi di session_start() nya php, kalo di php sebelum session di close (implicit setelah page selesai loading).
maka page request yang ada session_start() nya akan nunggu sampai session_start() yg pertama (list server query) selesai.
jadi solusinya mungkin adalah langsung tutup session setelah di load dengan menggunakan session_write_close(), tapi dengan catatan di page yang di load tidak ada operasi tulis session, karena datanya nanti akan tidak konsisten ( race condition ).
thanks anyway.
January 3rd, 2008 at 11:01 am
Where can i buy ambien for next day delivery….
Ambien buy ambien online starting from per. Buy ambien 10….