performansi inline assembly

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&lt;100000000;i++) {
		test1(100);
	}
	t2 = time(0);
	printf("current time=%d, delta=%d\\n", t2, t2-t);

	t = time(0);
	for(i=0;i&lt;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…

Tinggalkan Balasan

Isikan data di bawah atau klik salah satu ikon untuk log in:

Logo WordPress.com

You are commenting using your WordPress.com account. Logout / Ubah )

Gambar Twitter

You are commenting using your Twitter account. Logout / Ubah )

Foto Facebook

You are commenting using your Facebook account. Logout / Ubah )

Foto Google+

You are commenting using your Google+ account. Logout / Ubah )

Connecting to %s