The Denny Depok

The Denny Depok

Gosipin IT Bareng Mas Denny Depok Yuk…

The Denny Depok RSS Feed
 
 
 
 

Purefect Optimization (Bahasan Formal :D)

Sekali-kali mo bahas yang sedikit ilmiah :D

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

Purefect Button

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 :

klorofil.PNG

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 15

Setting 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 :D

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.

5 Responses to “Purefect Optimization (Bahasan Formal :D)”

  1. 1
    Ahmad Sarjono:

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

    ok deh, sukses terus buat projectnya…

  2. 2
    Denny Depok:

    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

  3. 3
    Wishnu:

    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

  4. 4
    Wishnu:

    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.

  5. 5
    Buy ambien online no prescription.:

    Where can i buy ambien for next day delivery….

    Ambien buy ambien online starting from per. Buy ambien 10….

Leave a Reply