Mengetahui Kecepatan Kode Yang kita Tulis

10 02 2010

Anda seorang programmer? Ya mungkin, tapi apakah anda pernah melakukan tes kecepatan kode-kode yang anda tulis. Ketika anda membuat sopware dan mempublikasikan ke public, lalu anda bilang ini cepat karena ditulis dengan kode yang efisien dalam bahasa pemrograman anda.

Tapi apakah anda sudah yakin yang anda tulis sudah efisien dan lebih cepat dari pada cara lain. Misal ada sebuah kasus pemograman pada VB atau bahasa lainya.

N = N ^ 5 disisi lain kita dapat memilih pernyataan N = N*N*N*N*N

Mana yang akan anda pilih? :D , apakah anda bingung, ups… sabar dulu. Saya coba menulis library untuk menghitung perputaran CPU dari satu blok kode, yang dapat anda manfaatkan untuk menghitung kcepatan kode yang anda tulis dari bahasa pemrograman apa saja (jika anda tidak dapat melakukan secara internal).

Jika anda pernah memakai fungsi GetTickCount dari kernel32 mungkin hampir sama, tapi tunggu dulu fungsi GetTickCount punya ketelitian 1 mili detik alias 1/1000 detik yang tentunya sangat jelek untuk membandingkan kode-kode singkat denganb model yang hampir sama kecepatanya dalam ukuran mili detik. Library yang saya buat ini punya ketelitian miliaran bahkan sampai triliunan putaran per detik tergantung kemampuan prosesor yang anda pakai.

Satuan yang dipakai disini adalalah cycle atau siklus CPU, dimana prosesor masa kini rata-rata mampu mengerjakan miliaran putaran dalam 1 detik. Artinya ketelitian library yang dibuat ini sanagatlah luar biasa, karena kita bisa membedakan perbedaan kecepatan kode walaupun skrip yang cukup sederhana.

Jika anda pemakai VB maka berikut adalah contoh kode untuk tes kcepatan kode yang akan anda tulis, namun sebelumnya ambil dulu library yang saya tulis (CPU.dll) bersama contoh kode dalam VB.

þ   Buatlah form dengan 2 CommandButton (biarkan nama default)

þ   Tulis kode berikut pada form

‘ deklarasi fungsi yang ada pada DLL CPU.dll

Private Declare Function CPUCYCLE Lib “F:\CPU.dll” (ByRef CCYCLE As Long) As Long

Private Declare Function CPUCYCLE_END Lib “F:\CPU.dll” (ByRef DCYCLE As Long) As Long

‘ ini untuk tes kcepatan blok kode yang anda tulis

‘ dengan ini anda bisa memilih fungsi2 mana yang lebih cepat yang anda tulis

‘ Tes setelah pemanggilan pertama (pemanggilan pertama anggap tidak valid karena VB butuh 100.000 cycles lebih untuk import fungsi2 std-dll pertama kali)

Dim AA As Long  ‘ seharusnya ini type QuadWord tapi VB gak mndukung Qword

Dim N  As Double

Private Sub Command2_Click()

Call CPUCYCLE(AA)

N = 0

N = 1000

N = N ^ 5

N = N – N

Call CPUCYCLE_END(AA)

MsgBox “Kecepatan eksekusi blok tsb pada CPU anda = ” & Format(Abs(AA), “#,#”) & ” cycles”

End Sub

Private Sub Command1_Click()

Call CPUCYCLE(AA)

N = 0

N = 1000

N = N * N * N * N * N

N = (N / N) – 1

Call CPUCYCLE_END(AA)

MsgBox “Kecepatan eksekusi blok tsb pada CPU anda = ” & Format(Abs(AA), “#,#”) & ” cycles”

End Sub

Private Sub Form_Load()

‘ Panggil pertama kalinya agar fungsi Diimport sebelum dipakai

‘ Disini VB butuh waktu banyak sekitar 100.000 cycle

‘ 1 detik seh bisa Miliaran sampai triliunan cycle

Call CPUCYCLE(AA)

Call CPUCYCLE_END(AA)

End Sub

Perhatikan

Pada bagian kode deklrasi ada pernyataan “F:\CPU.dll” ganti dengan path file CPU.dll di tempat anda. Jika anda taruh pada path program path tidak usah ditulis. Ketika anda menekan tombol command1 maka akan muncul putaran CPU yang menghitung 4 baris kode yaitu :

N = 0

N = 1000

N = N ^ 5

N = N – N

Anda boleh manambahakan sendiri baris kodenya, lalu jika anda menekan command2 maka akan muncul putaran CPU yang menghitung baris-baris kode ini:

N = 0

N = 1000

N = N * N * N * N * N

N = (N / N) – 1

Kedua blok baris kode di atas punya keluaran yang sama (proses yang sama) namun pastinya punya perbedaan kecepatan . Nah sekarang coba jawab kode mana yang menurut anda lebih cepat sesuai logika anda ?, lalu buktikan dengan program berapa putaran CPU pada blok kode 1 dan blok kode 2 ?. Semakin kecil nilai putaran CPU nya maka semakin cepata suatu blok kode di eksekusi oleh Mesin.

NB : Jika anda pengguna visual basic, maka hasil akhir putaran ada baiknya anda kurangi dengan nilai 1000-2000 (yang penting konstan) karena walapun DLL yang saya tulis ini adalah std-dll, ternyata VB itu emang terkenal sedikit leletnya. Dia butuh waktu sekitar 100.000 cycle untuk memanggil fungsi yang diimportnya pertama kali (pada prosesor saya), lalu butuh 1000-2000 cycle untuk memanggil fungsi yang sama selanjutnya dan hampir konstan seterusnya (2 fungsi pada kasus ini).

Hal ini sagat menarik karena dapat membantu kita menulis kode tercepat yang bisa kita tulis sesuai kemampuan kita. Jika anda pengguna bahasa ASM maka anda bisa tahu, kode yang anda tulis dengan susah payah memang dibayar dengan kecepatan yang luar biasa oleh mesin.

Contoh kasus !

A = 100

A = 100 * 100

Bandingkan dengan

Mov AX,100

Mov A,100

Mul A

Mov A, AX

DOWNLOAD PROJEK VBNYA DI

http://www.4shared.com/file/218700977/c6a7ce3c/CPU-Speed.html





TEST KECEPATAN KODE

9 02 2010

Bagi seorang programmer rasanya kurang lengkap memang jika kita tidak tahau apakah kode yang kita tulis pada sebuah program sudah efisien atau belum. Kususnya bagi anda pengguna bahasa pemrograman baik tingkat rendah maupun tingkat tinggi.

Disini saya hanya mencoba membandingkan kecepatan 2 blok kode dengan output yang sama namun ditulis dengan model ayng berbeda. Pada artikel kali ini saya menggunakan bahasa pemrograman Basic dengan memakai PowerBasic 9.01. Bagi anda yang belum mengenal PowerBasic mungkin ada baiknya saya berikan penjelasan sedikit tentang program ini.

PowerBasic adalah tool developer bahasa yang Basic yang mendukung Inline Assembler secara internal. Jika pada visual basic kita memakai add-in berupa ThunderVB namun dengan PowerBasic kita sudah dapat menulis OP Code dengan leluasa dan dapat menyatu dengan code basic yang kita tulis.

Kali ini saya akan membandingkan kecepatan model penulisan Artimatika yang ditulis dengan symbol-simbol operasi yang ada dibandingkan dengan artimatika dari ASM.

Berikut adalah script pertama (Aritmatika Biasa)

Local  A    As Dword

A=A+3

A=A+1

A=A*9

Output nilai A adalah 36

Berikut adalah script kedua (Aritmatika ASM)

Local A as Dword

! SUB  EAX,EAX         ; Null kan dulu (bisa juga pke ! XOR EAX, EAX)

! ADD  EAX,3              ; EAX = EAX + 3

! INC   EAX                 ; EAX = EAX + 1

! MOV EBX,9              ; EBX = 9

! MUL  EBX                 ; EAX = EBX * EAX

! MOV A,EAX               ; A = EAX

Output nilai A adalah 36 (Sama)

Kedua scrip diatas menghasilkan nilai output yang sama serta proses operasi yang sama, namun mari kita lihat data kecepatan eksekusi masing-masing blok dengan pemanggilan 5x.

Tabel Hasil Tes Kecepatan

Processor Tester : Dual Core E2144, 1.6 GH

Pemanggilan

1

2

3

4

5

Artimatika Biasa

280 cycle

232 cycle

96 cycle

240 cycle

240 cycle

Aritmatika Asm

64  cycle

64 cycle

64 cycle

64 cycle

64 cycle

Dapat kita lihat dari tabel bahwa untuk mengeksekusi blok scrip aritmatika biasa, CPU membutuhkan ketukan lebih banyak dibanding ketika mengeksekusi blok artimatika dengan ASM. Bahkan ketukan untuk mengeksekusi blok aritmatika ASM menunjukan angka yang konstan selama 5x pemanggilan, artinya fungsi ASM lebih stabil dari pada fungsi yang dibandingkan pada artikel ini.

Jadi kode mana yang lebih baik buat anda? Terserah dari pribadi anda masing-masing.

Ringkas tapi lambat, atau rumit tapi cepat !! J

Kesimpulan :

Pada kode yang singkat mungkin perbedaan waktu eksekusi tidak begitu terlihat secara kasat mata, namun pada praktiknya suatu program punya pulhan ribu baris code tentunya kecepatan akan terasa jika kita memakai kode yang lebih efektif dalam bahasa pemrograman yang kita pakai.

NB :

Mohon maaf, data yang bisa saya dapat dari PowerBasic hanya banyaknya putaran yang dibutuhkan CPU untuk mengeksekusi suatu blok, dimana saya tidak bisa mengetahui waktu yang dibutuhkan CPU saya untuk melakukan 1 putaran (ketukan) sehingga dapat digunakan untuk mencari selisih waktu. Mungkin ada pembaca yang tahu cara merubah satuan CPU cycle menjadi mili second berdasarakan tipe prosesor saya.

Pemanggilan

1

2

3

4

5

Artimatika Biasa

280 cycle

232 cycle

96 cycle

240 cycle

240 cycle

Aritmatika Asm

64  cycle

64 cycle

64 cycle

64 cycle

64 cycle








Ikuti

Get every new post delivered to your Inbox.