การทดสอบนี้ อาจจะขึ้นอยู่กับตัวแปรหลายอย่าง เช่น compiler,OS,version หรืออื่นๆ
การทดลองนี้ใช้ Ubunti 12.04LTS โดยใช้ gcc ในการ compile โดยไม่ได้ optimize ใดๆ
#include <stdio.h>
int main()
{
  int *pa, i, a[10];

  for (i = 0; i < 10;i++)
    a[i] = 100;
  for (pa = a; pa < a + 10; pa++)
    *pa = 100;
  return 0;
}
ใช้ gcc ทำการ compile code ออกมาเป็น assembly(AT&T) จะได้
	.file	"test.c"
	.text
	.globl	main
	.type	main, @function
main:
.LFB0:
	.cfi_startproc
	pushl	%ebp
	.cfi_def_cfa_offset 8
	.cfi_offset 5, -8
	movl	%esp, %ebp
	.cfi_def_cfa_register 5
	subl	$48, %esp
	movl	$0, -4(%ebp)
	jmp	.L2
.L3:
	movl	-4(%ebp), %eax
	movl	$100, -48(%ebp,%eax,4)
	addl	$1, -4(%ebp)
.L2:
	cmpl	$9, -4(%ebp)
	jle	.L3
	leal	-48(%ebp), %eax
	movl	%eax, -8(%ebp)
	jmp	.L4
.L5:
	movl	-8(%ebp), %eax
	movl	$100, (%eax)
	addl	$4, -8(%ebp)
.L4:
	leal	-48(%ebp), %eax
	addl	$40, %eax
	cmpl	%eax, -8(%ebp)
	jb	.L5
	movl	$0, %eax
	leave
	.cfi_restore 5
	.cfi_def_cfa 4, 4
	ret
	.cfi_endproc
.LFE0:
	.size	main, .-main
	.ident	"GCC: (Ubuntu/Linaro 4.6.3-1ubuntu5) 4.6.3"
	.section	.note.GNU-stack,"",@progbits
Array
จะเห็นว่า .L2 จะเป็นการเริ่มต้นการทำงานในของลูป
for (i = 0; i < 10;i++)
จะเห็น
cmpl $9, -4(%ebp)
มีการเปรียบเทียบค่าทันที ถ้าน้อยกว่าก็จะทำการ jump ไปที่ .L3 ทันที
 
Pointer
จะเห็นว่า .L4 จะเป็นการเริ่มต้นการทำงานในของลูป  
for (pa = a; pa < a + 10; pa++)
จะเห็น
leal -48(%ebp), %eax
addl $40, %eax
cmpl %eax, -8(%ebp)
ก่อนจะมีการเปรียบเทียบค่า จะมี 2 instruction set ที่ทำงานก่อนที่จะมีการเปรียบเทียบค่า หลังจากที่เปรียบค่า ถ้าจริงก็จะ jump ไปที่ .L5 ทันที
 
สรุป
Array เร็วกว่า Pointer.

อ้างอิงจาก http://stackoverflow.com/questions/2305770/efficiency-arrays-vs-pointers

edit @ 20 Sep 2013 21:27:09 by s4m3l0

Comment

Comment:

Tweet