应该说内存地址连续第访问, 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%
这是怎么回事?