swap(&a[i], &a[j]) 和 swap(&a[j],&a[j+1]) 那个快?

应该说内存地址连续第访问, cache命中率会高一些,那么swap(&a[j],&a[j+1]) 应该更快,而且要快得多

#include <stdio.h>
#include <stdlib.h>
#include <signal.h>
#include <string.h>
#include <time.h>
#include <unistd.h>
#include <sys/time.h>

void init(int *num, size_t len)
{
	int i;
	for(i = 0; i<len; i++){
		num[i] = rand() % 1000;
	}
}
void print(int *num, size_t len)
{
	int i, n=1;
	for(i = 0; i<len; i++)
		printf("%4d%s", num[i], n++%30 == 0 ? "\n" : "");
	puts("");

}
void bubble(int *num, size_t len)
{
	int i, j, temp;
	for(i = 0; i<len - 1; i++)
		for(j=i+1; j<len; j++)
			if(num[i] > num[j])
				temp = num[i], num[i] = num[j], num[j] = temp;
}

void bubble2(int *num, size_t len)
{
	int i, j, temp;
	for(i = 0; i< len-1; i++)
		for(j=0; j<len-1-i; j++)
			if(num[j] > num[j+1])
				temp = num[j], num[j] = num[j+1], num[j+1] = temp;
}
int main(int argc, char *argv[])
{
	void (*fun[2])(int *, size_t) = {bubble, bubble2};
	int num[200];
	int num2[200];
	int len = sizeof(num)/sizeof(num[0]);

	long diff1, diff2, sum1 = 0, sum2 = 0;

	printf("%-10s%-10s%s\n", "bubble", "bubble2", "rate");
	puts("---------------------------");
	int i;
	for(i = 0; i < 300; i++){
	//  init num[] num2[]
		struct timeval tv1, tv2;
		gettimeofday(&tv1, NULL);
		srand(tv1.tv_usec);
		init(num,len); 
		memcpy(num2, num, sizeof(num));
	// --------------------------
		gettimeofday(&tv1, NULL);
		fun[0](num, len);
		gettimeofday(&tv2, NULL);

		diff1 = (tv2.tv_sec - tv1.tv_sec) * 1000 * 1000 + tv2.tv_usec - tv1.tv_usec;
	// --------------------------

	// --------------------------
		gettimeofday(&tv1, NULL);
		fun[1](num2, len);
		gettimeofday(&tv2, NULL);

		diff2 = (tv2.tv_sec - tv1.tv_sec) * 1000 * 1000 + tv2.tv_usec - tv1.tv_usec;
		printf("%-10ld%-10ld%5.1f%%\n", diff1, diff2, diff1*100.0/diff2); 
		sum1 += diff1, sum2 += diff2;
	// --------------------------
	}
	puts("---------------------------");
	printf("%-10ld%-10ld%5.1f%%\n", sum1, sum2, sum1*100.0/sum2);
	return 0;
}

  输出:

bubble    bubble2   rate
---------------------------
277       293        94.5%
269       286        94.1%
280       291        96.2%
273       294        92.9%
267       282        94.7%
274       287        95.5%
264       283        93.3%
277       6366        4.4%
271       284        95.4%
265       282        94.0%
269       500        53.8%
276       296        93.2%
274       289        94.8%
270       283        95.4%
278       295        94.2%
281       299        94.0%
285       300        95.0%
273       288        94.8%
280       297        94.3%
284       291        97.6%
274       288        95.1%
272       286        95.1%
278       298        93.3%
274       287        95.5%
11982     290       4131.7%
285       302        94.4%
274       292        93.8%
279       297        93.9%
275       293        93.9%
284       301        94.4%
272       9280        2.9%
278       290        95.9%
280       293        95.6%
277       291        95.2%
275       296        92.9%
275       289        95.2%
277       301        92.0%
266       281        94.7%
280       298        94.0%
286       297        96.3%
283       293        96.6%
278       9401        3.0%
274       296        92.6%
279       298        93.6%
282       293        96.2%
277       300        92.3%
271       286        94.8%
275       287        95.8%
278       296        93.9%
273       288        94.8%
275       293        93.9%
274       294        93.2%
271       3879        7.0%
279       292        95.5%
268       289        92.7%
275       289        95.2%
276       294        93.9%
279       296        94.3%
281       298        94.3%
278       300        92.7%
276       288        95.8%
274       523        52.4%
272       285        95.4%
273       285        95.8%
276       289        95.5%
276       291        94.8%
279       296        94.3%
276       294        93.9%
277       288        96.2%
286       299        95.7%
274       290        94.5%
276       291        94.8%
280       2536       11.0%
271       286        94.8%
280       292        95.9%
279       292        95.5%
279       293        95.2%
276       293        94.2%
273       293        93.2%
277       292        94.9%
278       287        96.9%
277       293        94.5%
277       291        95.2%
270       288        93.8%
281       636        44.2%
279       295        94.6%
271       295        91.9%
273       291        93.8%
273       292        93.5%
267       283        94.3%
276       294        93.9%
274       288        95.1%
278       293        94.9%
280       295        94.9%
833       286       291.3%
268       286        93.7%
282       329        85.7%
278       292        95.2%
269       284        94.7%
276       293        94.2%
276       288        95.8%
286       297        96.3%
275       287        95.8%
267       287        93.0%
280       293        95.6%
271       289        93.8%
272       291        93.5%
284       297        95.6%
272       291        93.5%
281       300        93.7%
357       292       122.3%
278       295        94.2%
269       288        93.4%
264       281        94.0%
271       288        94.1%
277       378        73.3%
280       298        94.0%
270       287        94.1%
283       293        96.6%
279       958        29.1%
268       288        93.1%
281       293        95.9%
317       297       106.7%
274       288        95.1%
265       283        93.6%
276       2696       10.2%
280       302        92.7%
273       294        92.9%
266       280        95.0%
280       295        94.9%
271       286        94.8%
277       494        56.1%
274       291        94.2%
270       289        93.4%
271       289        93.8%
278       291        95.5%
274       289        94.8%
280       299        93.6%
277       289        95.8%
267       284        94.0%
261       588        44.4%
279       293        95.2%
265       287        92.3%
272       287        94.8%
274       323        84.8%
275       287        95.8%
286       296        96.6%
279       297        93.9%
271       289        93.8%
282       300        94.0%
269       287        93.7%
272       282        96.5%
274       290        94.5%
270       292        92.5%
274       286        95.8%
273       287        95.1%
286       300        95.3%
272       286        95.1%
279       299        93.3%
278       298        93.3%
274       287        95.5%
269       290        92.8%
282       294        95.9%
285       303        94.1%
280       299        93.6%
281       298        94.3%
312       290       107.6%
275       294        93.5%
271       290        93.4%
263       283        92.9%
279       290        96.2%
385       298       129.2%
280       290        96.6%
282       291        96.9%
269       288        93.4%
275       295        93.2%
277       291        95.2%
274       289        94.8%
269       280        96.1%
276       294        93.9%
274       293        93.5%
271       287        94.4%
270       287        94.1%
270       283        95.4%
285       376        75.8%
285       296        96.3%
278       296        93.9%
266       280        95.0%
269       290        92.8%
271       288        94.1%
280       301        93.0%
286       301        95.0%
269       595        45.2%
273       289        94.5%
280       298        94.0%
262       276        94.9%
269       285        94.4%
272       287        94.8%
331       302       109.6%
283       296        95.6%
272       283        96.1%
282       296        95.3%
276       293        94.2%
271       289        93.8%
283       298        95.0%
277       293        94.5%
275       291        94.5%
281       294        95.6%
270       283        95.4%
276       295        93.6%
271       285        95.1%
417       287       145.3%
287       309        92.9%
273       287        95.1%
265       283        93.6%
282       297        94.9%
286       302        94.7%
270       285        94.7%
279       350        79.7%
267       281        95.0%
282       295        95.6%
276       291        94.8%
278       294        94.6%
282       294        95.9%
273       430        63.5%
276       295        93.6%
268       285        94.0%
269       282        95.4%
266       282        94.3%
283       302        93.7%
280       297        94.3%
275       289        95.2%
283       291        97.3%
268       282        95.0%
266       283        94.0%
277       290        95.5%
263       286        92.0%
278       296        93.9%
580       296       195.9%
279       297        93.9%
274       287        95.5%
272       292        93.2%
271       286        94.8%
278       297        93.6%
818       279       293.2%
278       289        96.2%
281       297        94.6%
269       283        95.1%
271       292        92.8%
276       290        95.2%
310       285       108.8%
278       287        96.9%
265       283        93.6%
280       290        96.6%
281       293        95.9%
276       287        96.2%
271       284        95.4%
270       288        93.8%
272       286        95.1%
270       295        91.5%
278       294        94.6%
275       295        93.2%
273       289        94.5%
279       384        72.7%
277       299        92.6%
281       301        93.4%
272       288        94.4%
270       287        94.1%
276       292        94.5%
270       310        87.1%
282       295        95.6%
281       299        94.0%
283       295        95.9%
280       296        94.6%
272       284        95.8%
273       290        94.1%
275       292        94.2%
563       299       188.3%
266       289        92.0%
283       303        93.4%
279       295        94.6%
276       288        95.8%
275       296        92.9%
277       287        96.5%
274       289        94.8%
271       287        94.4%
276       294        93.9%
273       291        93.8%
272       288        94.4%
281       289        97.2%
365       289       126.3%
276       293        94.2%
276       290        95.2%
278       291        95.5%
281       291        96.6%
275       509        54.0%
276       289        95.5%
272       284        95.8%
287       300        95.7%
276       292        94.5%
---------------------------
96598     122795     78.7%

在这个例子中,即swap(&a[i], &a[j]) 对应的bubble耗时 是 swap(&a[j],&a[j+1]) 对应的bubble2 耗时的78.7%

这是怎么回事?

原文地址:https://www.cnblogs.com/mathzzz/p/2690871.html