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