Untuk tugas kuliah manajemen informasi, aku mempelajari bagaimana cara menyisipkan kode assembly ke dalam kode bahasa C. Nah, sudah sering terdengar bahwa penulisan kode assembly secara inline pada C biasanya digunakan untuk melakukan optimasi performasi dari program. Secara teoritis, bahasa C di’terjemah’kan oleh compiler menjadi bahasa assembly kemudian menjadi bahasa mesin, sedangkan bahasa assembly ditulis langsung. Jika setiap baris program bahasa C diterjemahkan menjadi satu atau lebih instruksi assembly, tentu saja jumlah instruksinya akan lebih banyak dibandingkan dengan langsung menuliskannya dalam assembly.
Tetapi, saat ini hampir di semua compiler bahasa C yang banyak digunakan terdapat code optimizer yang dapat mengoptimasi hasil kompilasi. Aku iseng mencoba membandingkan performa bahasa C dengan inline assembly untuk kasus yang sederhana. Potongan kode C berikut ini adalah potongan untuk menjumlahkan 1 sebanyak f kali:
int test1(int f) {
int res = 1;
while(f>1) {
res++;
f--;
}
return res;
}
Kode yang melakukan hal yang tidak berguna, bukan? Kemudian aku membuat tandingannya, dalam bentuk inline assembly (informasi mengenai inline assembly dapat dilihat di sini:
int test2(int f) {
// pake assembly
__asm__ (
"mov %1, %%eax \\n"
"SSSstart: \\n\\t"
"cmp %1, %2 \\n\\t"
"jle SSSend\\n\\t"
"inc %%eax \\n\\t"
"dec %2 \\n\\t"
"jmp SSSstart\\n"
"SSSend:\\n\\t"
"mov %%eax, %0"
: "=g" (f)
: "g" (1), "r" (f)
: "%eax"
);
return f;
}
Kedua subrutin tersebut dieksekusi oleh main() seperti ini:
#include <stdio.h>
#include <time.h>
int main() {
int t = time(0), t2;
long i;
t = time(0);
for(i=0;i<100000000;i++) {
test1(100);
}
t2 = time(0);
printf("current time=%d, delta=%d\\n", t2, t2-t);
t = time(0);
for(i=0;i<10000000;i++) {
test2(100);
}
t2 = time(0);
printf("current time=%d, delta=%d\\n", t2, t2-t);
return 0;
}
Kemudian, aku compile dengan menggunakan gcc-mingw. Hasilnya seperti ini:
F:\>gcc testasm.c -Wall -O9 F:\kuliah\s2\Manajemen Informasi\kel 1>a.exe current time=1191116269, delta=13 current time=1191116269, delta=0 F:\kuliah\s2\Manajemen Informasi\kel 1>gcc testasm.c -Wall F:\kuliah\s2\Manajemen Informasi\kel 1>a.exe current time=1191116338, delta=49 current time=1191116341, delta=3
Wow.. Beda jauh banget ya, kalau tanpa optimasi.. Ketika ditambahkan optimasi, dengan optimasi yang paling tinggi yang didukung gcc, tetap saja berbeda jauh…



0 Tanggapan ke “performansi inline assembly”