使用数组下标赋值和指针赋值效率探索
int main(int argc, char **argv)
{
int arr[100];
int *p;
struct timespec beg, end;
clock_gettime(CLOCK_REALTIME, &beg);
for(p = arr; p < arr; p++){
*p = 0;
}
clock_gettime(CLOCK_REALTIME, &end);
printf("cost time = %ld\n", end.tv_nsec - beg.tv_nsec);
return 0;
}
上面的代码是两种非常常用的数组循环赋值的写法,貌似使用下标赋值的方式可能更容易理解,更加常见。但是这两种写法真的就一样么?
-
但从功能上来说的确是一摸一样,但是从效率上来看,效率一样么?经过实际测试发现,指针的方式效率要更高,而且高很多!
-
使用下标的运行时间(纳秒)
-
使用指针的运行时间(纳秒)
-
为什么指针的方式效率会更高呢?
- 对于采用下标的时候:为了对下标表达式求值,编译器在程序中插入指令,获取到i值,并且把它与整型的长度(4)相乘,因为i值不是固定的所以,每次一for循环都需要做乘法,需要花费一定的时间和空间。
- 采用指针的方式的时候:这里的for循环也需要乘法,即1乘整型的长度(1*4),然后再与指针相加。这与下标的乘不同,执行乘法运算的时候,每次都是两个相同的数(1和4)。结果这个乘法只在编译的时候执行一次,所以现在执行指针偏移的时候就只包含了一条指令,即4与指针相加。程序在运行时并不执行乘法运算。(参考书籍《c和指针》)
-
指针并不一定比数组更有效率,有时指针运用的比较差(代码编写比较差),可能会导致使用指针的方式比直接使用简洁易懂的下标效率更低。
-
实际编程中代码的效率并不是唯一所追求的,有时代码写的简洁、通俗易懂更为重要
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)