a[i]和*(a+i)差异

测试源码:test.c

#include <stdio.h>
#include <stdlib.h>
#include <time.h>

char b,*p;

void test(int Count){
	struct timespec time_start = {0, 0}, time_end = {0, 0};

	long a,c;
	int i = Count;
	clock_gettime(CLOCK_REALTIME, &time_start);
	
	while(i-->0){
		b=p[i];
	}
	
	clock_gettime(CLOCK_REALTIME, &time_end);
	//printf("array   duration: %lu ns\n", time_end.tv_nsec - time_start.tv_nsec);
	a = time_end.tv_nsec - time_start.tv_nsec;

	//char * t = p;
	i = Count;
	clock_gettime(CLOCK_REALTIME, &time_start);
	
	while(i-->0){
		//b=*t;
		//t++;
		b=*(p+i);
	}
	
	clock_gettime(CLOCK_REALTIME, &time_end);
	c = time_end.tv_nsec - time_start.tv_nsec;
	
	printf("duration: %lu %lu ns\n", a, c);
}

int main(int argc, char** argv){

	int Count = 10000;
	
	if(argc>1)
		Count= atoi(argv[1]);
	
	p = malloc(Count*sizeof(char));
	
	test(Count);
	
	free(p);
	
	return 0;
}


gcc版本:
customer@ubuntu:~$ gcc -v
Using built-in specs.
COLLECT_GCC=gcc
COLLECT_LTO_WRAPPER=/usr/lib/gcc/x86_64-linux-gnu/4.8/lto-wrapper
Target: x86_64-linux-gnu
Configured with: …/src/configure -v --with-pkgversion=‘Ubuntu 4.8.4-2ubuntu1~14.04.4’ --with-bugurl=file:///usr/share/doc/gcc-4.8/README.Bugs --enable-languages=c,c++,java,go,d,fortran,objc,obj-c++ --prefix=/usr --program-suffix=-4.8 --enable-shared --enable-linker-build-id --libexecdir=/usr/lib --without-included-gettext --enable-threads=posix --with-gxx-include-dir=/usr/include/c++/4.8 --libdir=/usr/lib --enable-nls --with-sysroot=/ --enable-clocale=gnu --enable-libstdcxx-debug --enable-libstdcxx-time=yes --enable-gnu-unique-object --disable-libmudflap --enable-plugin --with-system-zlib --disable-browser-plugin --enable-java-awt=gtk --enable-gtk-cairo --with-java-home=/usr/lib/jvm/java-1.5.0-gcj-4.8-amd64/jre --enable-java-home --with-jvm-root-dir=/usr/lib/jvm/java-1.5.0-gcj-4.8-amd64 --with-jvm-jar-dir=/usr/lib/jvm-exports/java-1.5.0-gcj-4.8-amd64 --with-arch-directory=amd64 --with-ecj-jar=/usr/share/java/eclipse-ecj.jar --enable-objc-gc --enable-multiarch --disable-werror --with-arch-32=i686 --with-abi=m64 --with-multilib-list=m32,m64,mx32 --with-tune=generic --enable-checking=release --build=x86_64-linux-gnu --host=x86_64-linux-gnu --target=x86_64-linux-gnu
Thread model: posix
gcc version 4.8.4 (Ubuntu 4.8.4-2ubuntu1~14.04.4)

gcc test.c

执行100次结果如下,./a.out 10000000
duration: 33376681 30506718 ns
duration: 31685715 29354177 ns
duration: 32616999 31428824 ns
duration: 31825921 31561052 ns
duration: 18446744072741777775 31521949 ns
duration: 31738459 30513387 ns
duration: 32863431 30782869 ns
duration: 34170992 29691708 ns
duration: 30293435 30778066 ns
duration: 32198772 30937023 ns
duration: 31075144 30480365 ns
duration: 31468568 31739809 ns
duration: 31917223 30479806 ns
duration: 31819138 31963236 ns
duration: 32612760 31085628 ns
duration: 30861159 32864403 ns
duration: 33479829 30950878 ns
duration: 31438172 32850492 ns
duration: 32570145 31403073 ns
duration: 32900966 18446744072741247404 ns
duration: 31110325 30558877 ns
duration: 31847213 30716864 ns
duration: 31500235 31985156 ns
duration: 32130030 31544345 ns
duration: 33773109 30190742 ns
duration: 32959766 31925744 ns
duration: 31896337 30676741 ns
duration: 31323708 30040485 ns
duration: 30630000 29411328 ns
duration: 30361255 31893994 ns
duration: 31596564 31641580 ns
duration: 32363023 32001133 ns
duration: 33141648 30101992 ns
duration: 32339004 31037960 ns
duration: 31710226 30366073 ns
duration: 18446744072742365222 29830547 ns
duration: 31422320 31909025 ns
duration: 34555499 32765955 ns
duration: 32711185 31654414 ns
duration: 31814886 32241125 ns
duration: 32399129 31626190 ns
duration: 33047962 31598849 ns
duration: 34027209 31704053 ns
duration: 33011542 30610950 ns
duration: 32488803 31979254 ns
duration: 33829422 31317490 ns
duration: 31318671 30614015 ns
duration: 32317031 30005649 ns
duration: 34167877 30290489 ns
duration: 32349011 31319875 ns
duration: 30288298 18446744072741556808 ns
duration: 32308655 32178500 ns
duration: 31487763 31241827 ns
duration: 33719496 30877903 ns
duration: 30559196 30637107 ns
duration: 32783622 31376187 ns
duration: 31542759 33434360 ns
duration: 32033786 30404001 ns
duration: 32206603 31727550 ns
duration: 32908461 30482962 ns
duration: 31846150 31175904 ns
duration: 32322364 33313166 ns
duration: 33045660 30824308 ns
duration: 31757014 31143738 ns
duration: 32707090 30345933 ns
duration: 31681976 30343616 ns
duration: 18446744072742608498 30132236 ns
duration: 32466100 30944847 ns
duration: 31267836 31211756 ns
duration: 32122177 30361455 ns
duration: 33539583 30348331 ns
duration: 31629658 31372634 ns
duration: 32206281 30605724 ns
duration: 31857017 30619062 ns
duration: 31344457 30865357 ns
duration: 33126523 30289181 ns
duration: 33151353 30868614 ns
duration: 31619133 30676140 ns
duration: 32223908 31206598 ns
duration: 32123893 31491799 ns
duration: 33781647 31230376 ns
duration: 32134766 18446744072740391448 ns
duration: 32757263 33014899 ns
duration: 32063790 31561043 ns
duration: 32556694 31032050 ns
duration: 33194872 32325194 ns
duration: 31977790 30335179 ns
duration: 31218495 30616376 ns
duration: 32807801 31908687 ns
duration: 31925545 29731725 ns
duration: 32431504 31564218 ns
duration: 32705284 30876261 ns
duration: 33021051 30951865 ns
duration: 32470353 31603650 ns
duration: 32930854 30423884 ns
duration: 32776368 30585061 ns
duration: 32883708 18446744072740952814 ns
duration: 33420660 31141170 ns
duration: 32596949 31559284 ns
duration: 32052643 29678271 ns

结果看起来差不多;

指针做如下修改:

	char * t = p;
	i = Count;
	clock_gettime(CLOCK_REALTIME, &time_start);
	
	while(i-->0){
		b=*t;
		t++;
		//b=*(p+i);
	}

编译再来100次,结果如下:
duration: 31017005 25522370 ns
duration: 31892961 25154180 ns
duration: 32104191 18446744072735342391 ns
duration: 31792942 26570249 ns
duration: 31385498 25025862 ns
duration: 31758182 26780650 ns
duration: 31218360 24612179 ns
duration: 32975231 27054730 ns
duration: 33715956 24994084 ns
duration: 32501341 25619387 ns
duration: 33467080 25850851 ns
duration: 32784466 26520539 ns
duration: 31314562 26555326 ns
duration: 32615242 25798437 ns
duration: 34007550 26356685 ns
duration: 31982786 26895832 ns
duration: 31605343 26430669 ns
duration: 31944465 25944513 ns
duration: 31952044 25416684 ns
duration: 18446744072741442595 25723528 ns
duration: 31954801 26419072 ns
duration: 32832958 25430001 ns
duration: 32997080 27269481 ns
duration: 30806887 25621484 ns
duration: 31797699 25856581 ns
duration: 31264571 26885055 ns
duration: 32409482 25285777 ns
duration: 33020493 26527579 ns
duration: 30949500 25617996 ns
duration: 32019278 25471607 ns
duration: 32026746 25131191 ns
duration: 31788931 25066977 ns
duration: 31625995 24360429 ns
duration: 33988760 24244872 ns
duration: 31240823 25337289 ns
duration: 32705156 25794764 ns
duration: 18446744072740667011 24174672 ns
duration: 34061046 24690853 ns
duration: 30739876 25756656 ns
duration: 31697411 24202891 ns
duration: 31395761 26184543 ns
duration: 33200434 24246156 ns
duration: 31246829 25740032 ns
duration: 32569550 25273466 ns
duration: 32763644 24761871 ns
duration: 32881727 25346163 ns
duration: 30679330 25012334 ns
duration: 31575435 24716844 ns
duration: 32866333 25360936 ns
duration: 32579688 24224552 ns
duration: 32887818 25418285 ns
duration: 31738099 25857058 ns
duration: 30840274 24845174 ns
duration: 31762102 18446744072735765113 ns
duration: 32179230 25838902 ns
duration: 32003053 25659890 ns
duration: 30625209 25477113 ns
duration: 32472397 25904797 ns
duration: 33244346 25861086 ns
duration: 32256996 24894874 ns
duration: 31477889 25782765 ns
duration: 33771368 25535771 ns
duration: 31589960 27124476 ns
duration: 31768357 24929796 ns
duration: 32896013 26148127 ns
duration: 32168877 25631575 ns
duration: 30998765 25253207 ns
duration: 30960153 24557910 ns
duration: 31698179 26186184 ns
duration: 30943489 24881893 ns
duration: 33200877 18446744072736256492 ns
duration: 31665429 25908230 ns
duration: 32386836 25460605 ns
duration: 30921304 25294719 ns
duration: 31508201 25883614 ns
duration: 33234441 24934139 ns
duration: 31839057 25693376 ns
duration: 31999333 24876191 ns
duration: 33205797 25370682 ns
duration: 33589291 25680065 ns
duration: 32834654 25652017 ns
duration: 31979706 25470633 ns
duration: 30904512 25214501 ns
duration: 31064721 25797402 ns
duration: 32460183 24395776 ns
duration: 32518440 27167168 ns
duration: 34315486 27039720 ns
duration: 18446744072742031755 26288315 ns
duration: 32982473 25436212 ns
duration: 32595591 24585610 ns
duration: 31576981 26526283 ns
duration: 31173433 25921911 ns
duration: 32699341 26895695 ns
duration: 30017971 25624832 ns
duration: 33293636 26499936 ns
duration: 31859841 25050285 ns
duration: 32864348 27699687 ns
duration: 33661375 25625893 ns
duration: 31680500 25784123 ns
duration: 33879219 26916345 ns

看来自增和*(p+i)还是有较大区别,指针明显快一点了。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

楠木123456

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值