fork(1) download
  1.  
  2. #include <stdlib.h>
  3. #include <time.h>
  4. #include <stdio.h>
  5.  
  6. #define TIMES 200000000
  7.  
  8. int main(){
  9. volatile int a;
  10. volatile int b;
  11. volatile int c;
  12. int i;
  13. clock_t t1 = clock();
  14.  
  15. srand(time(NULL));
  16. a = rand();
  17. b = rand();
  18.  
  19. // # on x86_64 gcc 4.8.1
  20.  
  21. for( i = 0; i < TIMES; i++ ){
  22. c = a;
  23. // movl -36(%rbp), %eax
  24. // movl %eax, -44(%rbp)
  25.  
  26. a = b;
  27. // movl -40(%rbp), %eax
  28. // movl %eax, -36(%rbp)
  29.  
  30. b = c;
  31. // movl -44(%rbp), %eax
  32. // movl %eax, -40(%rbp)
  33. }
  34.  
  35. clock_t t2 = clock();
  36. for( i = 0; i < TIMES; i++ ){
  37. a ^= b;
  38. // movl -36(%rbp), %edx
  39. // movl -40(%rbp), %eax
  40. // xorl %edx, %eax
  41. // movl %eax, -36(%rbp)
  42. b ^= a;
  43. // movl -40(%rbp), %edx
  44. // movl -36(%rbp), %eax
  45. // xorl %edx, %eax
  46. // movl %eax, -40(%rbp)
  47. a ^= b;
  48. // movl -36(%rbp), %edx
  49. // movl -40(%rbp), %eax
  50. // xorl %edx, %eax
  51. // movl %eax, -36(%rbp)
  52. }
  53. clock_t t3 = clock();
  54. double s_var = (double)(t2-t1)/CLOCKS_PER_SEC;
  55. double s_xor = (double)(t3-t2)/CLOCKS_PER_SEC;
  56. double s_all = (double)(t3-t1)/CLOCKS_PER_SEC;
  57.  
  58. printf("swap by var: %.2fs\n",s_var);
  59. printf("swap by xor: %.2fs\n",s_xor);
  60. printf("ratio%% var: %d\n",(int)((s_var/s_all)*100));
  61. printf("ratio%% xor: %d\n",(int)((s_xor/s_all)*100));
  62. printf("xor/var: %.2f\n",(s_xor/s_var));
  63. return 0;
  64. }
Success #stdin #stdout 2.45s 2248KB
stdin
Standard input is empty
stdout
swap by var: 0.72s
swap by xor: 1.73s
ratio% var: 29
ratio% xor: 70
xor/var: 2.40