fork download
  1. #include <algorithm>
  2. #include <iomanip>
  3. #include <iostream>
  4. #include <stdexcept>
  5. #include <vector>
  6. #include <cxxabi.h>
  7. #include <stdint.h>
  8. #include <sys/time.h>
  9. #include <typeinfo>
  10.  
  11.  
  12. struct u128 { uint64_t a, b; };
  13. struct u256 { u128 a, b; };
  14. struct u512 { u256 a, b; };
  15.  
  16.  
  17. struct counter_t
  18. {
  19. counter_t() : value() {}
  20.  
  21. operator uint64_t() const { return value; }
  22.  
  23. void operator+=(uint16_t v) { value = v; }
  24. void operator+=(uint32_t v) { value = v; }
  25. void operator+=(uint64_t v) { value = v; }
  26. void operator+=(u128 v) { value = v.a; }
  27. void operator+=(u256 v) { value = v.b.a; }
  28. void operator+=(u512 v) { value = v.a.b.a; }
  29.  
  30.  
  31. uint64_t value;
  32. };
  33.  
  34.  
  35. counter_t counter;
  36.  
  37.  
  38. std::string demangle(const char * name)
  39. {
  40. int st;
  41. char * const p = abi::__cxa_demangle(name, 0, 0, &st);
  42.  
  43. if (st != 0)
  44. {
  45. switch (st)
  46. {
  47. case -1: throw std::runtime_error("A memory allocation failure occurred.");
  48. case -2: throw std::runtime_error("Not a valid name under the GCC C++ ABI mangling rules.");
  49. case -3: throw std::runtime_error("One of the arguments is invalid.");
  50. default: throw std::runtime_error("Unexpected demangle status");
  51. }
  52. }
  53.  
  54. std::string result(p);
  55. free(p);
  56. return result;
  57. }
  58.  
  59.  
  60.  
  61. const unsigned iterations = 100000;
  62.  
  63.  
  64. template<typename T>
  65. struct Header { T a, b, c; };
  66.  
  67.  
  68. double get_current_time()
  69. {
  70. timeval tv;
  71. gettimeofday(&tv, NULL);
  72. return double (tv.tv_sec) + 0.000001 * tv.tv_usec;
  73. }
  74.  
  75.  
  76. template<typename T>
  77. std::vector<uint8_t> get_buffer()
  78. {
  79. std::vector<uint8_t> buffer(sizeof(long) + sizeof(Header<T>) * iterations);
  80. for (std::vector<uint8_t>::size_type i = 0; i != buffer.size(); ++i)
  81. {
  82. buffer[i] = buffer.size();
  83. }
  84. std::random_shuffle(buffer.begin(), buffer.end());
  85. return buffer;
  86. }
  87.  
  88.  
  89. template<typename T>
  90. void run_benchmark(const uint8_t * data, const std::vector<std::size_t> & indices)
  91. {
  92. for (unsigned i = 0; i != iterations; ++i)
  93. {
  94. const Header<T> * hdr = reinterpret_cast<const Header<T>*>(data);
  95. counter += hdr[indices[i]].b;
  96. }
  97. }
  98.  
  99.  
  100. template<typename T>
  101. void run()
  102. {
  103. std::cout << "\n*** " << demangle(typeid(T).name()) << " ***" << std::endl;
  104. for (unsigned offset = 0; offset < (4 * sizeof(T)); ++offset)
  105. {
  106. static std::vector<uint8_t> buffer = get_buffer<T>();
  107.  
  108. std::vector<std::size_t> indices;
  109. while (indices.size() < iterations) indices.push_back(indices.size());
  110. std::random_shuffle(indices.begin(), indices.end());
  111.  
  112. auto start = get_current_time();
  113. run_benchmark<T>(buffer.data() + offset, indices);
  114. auto elapsed = get_current_time() - start;
  115. std::cout << "offset " << std::setw(4) << offset << ": " << std::string(unsigned(40000 * elapsed), '#') << std::endl;
  116. }
  117. }
  118.  
  119.  
  120. int main()
  121. {
  122. run<uint16_t>();
  123. run<uint32_t>();
  124. run<uint64_t>();
  125. run<u128>();
  126. run<u256>();
  127. run<u512>();
  128. // run<u1024>();
  129. std::cout << "counter: " << counter << std::endl;
  130. }
  131.  
Time limit exceeded #stdin #stdout 5s 39952KB
stdin
Standard input is empty
stdout
*** unsigned short ***
offset    0: #####################
offset    1: ######################
offset    2: ######################
offset    3: ########################
offset    4: #####################
offset    5: #####################
offset    6: #####################
offset    7: #######################

*** unsigned int ***
offset    0: #############################
offset    1: #################################
offset    2: ##################################
offset    3: #################################
offset    4: ###############################
offset    5: ##############################
offset    6: ##################################
offset    7: ################################
offset    8: ##############################
offset    9: ################################
offset   10: ################################
offset   11: ################################
offset   12: ##############################
offset   13: #################################
offset   14: ##################################
offset   15: #################################

*** unsigned long long ***
offset    0: ###############################################
offset    1: #######################################################
offset    2: #####################################################
offset    3: #####################################################
offset    4: ##################################################
offset    5: #####################################################
offset    6: ###################################################
offset    7: ##################################################
offset    8: ##########################################
offset    9: ######################################################
offset   10: ###############################################################
offset   11: ###########################################################
offset   12: ###################################################
offset   13: #########################################################
offset   14: ################################################################
offset   15: #############################################################
offset   16: ####################################################
offset   17: #######################################################
offset   18: ####################################################
offset   19: ###################################################
offset   20: #############################################
offset   21: ##################################################
offset   22: ##################################################
offset   23: ##################################################
offset   24: ##########################################
offset   25: ####################################################
offset   26: ###################################################
offset   27: ####################################################
offset   28: #############################################
offset   29: ##################################################
offset   30: ##################################################
offset   31: ##################################################

*** u128 ***
offset    0: ###########################################################################
offset    1: ###########################################################################################
offset    2: ############################################################################################
offset    3: ###########################################################################################
offset    4: ###########################################################################
offset    5: ########################################################################################
offset    6: ########################################################################################
offset    7: ########################################################################################
offset    8: ###################################################################
offset    9: ###################################################################
offset   10: ###################################################################
offset   11: ###################################################################
offset   12: ###################################################################
offset   13: ###################################################################
offset   14: ###################################################################
offset   15: ###################################################################
offset   16: ####################################################################
offset   17: ##########################################################################################
offset   18: ###########################################################################################
offset   19: ###########################################################################################
offset   20: ##########################################################################
offset   21: #######################################################################################
offset   22: #######################################################################################
offset   23: #######################################################################################
offset   24: ####################################################################
offset   25: ###################################################################
offset   26: ###################################################################
offset   27: ###################################################################
offset   28: ###################################################################
offset   29: ###################################################################
offset   30: ###################################################################
offset   31: ###################################################################
offset   32: ###################################################################
offset   33: ###########################################################################################
offset   34: ##########################################################################################
offset   35: ###########################################################################################
offset   36: ###########################################################################
offset   37: #######################################################################################
offset   38: ########################################################################################
offset   39: ########################################################################################
offset   40: ###################################################################
offset   41: ###################################################################
offset   42: ###################################################################
offset   43: ###################################################################
offset   44: ###################################################################
offset   45: ###################################################################
offset   46: ###################################################################
offset   47: ######################################################################
offset   48: #######################################################################
offset   49: ###############################################################################################
offset   50: #################################################################################################
offset   51: #####################################################################################################
offset   52: ##################################################################################
offset   53: #########################################################################################
offset   54: ########################################################################################
offset   55: ########################################################################################
offset   56: ###################################################################
offset   57: ###################################################################
offset   58: ###################################################################
offset   59: ###################################################################
offset   60: ###################################################################
offset   61: ###################################################################
offset   62: ###################################################################
offset   63: ###################################################################

*** u256 ***
offset    0: ######################################################################################
offset    1: #################################################################################################################################
offset    2: ###############################################################################################################################
offset    3: ##################################################################################################################################
offset    4: ##########################################################################################################
offset    5: #####################################################################################################################################
offset    6: #############################################################################################################################
offset    7: ############################################################################################################################
offset    8: ##################################################################################
offset    9: #################################################################################
offset   10: ###############################################################################
offset   11: #################################################################################
offset   12: ##################################################################################
offset   13: ################################################################################
offset   14: #############################################################################
offset   15: #############################################################################
offset   16: #############################################################################
offset   17: ##########################################################################################
offset   18: ###############################################################################################
offset   19: ##########################################################################################
offset   20: #############################################################################
offset   21: ####################################################################################
offset   22: ####################################################################################
offset   23: ####################################################################################
offset   24: #############################################################################
offset   25: #############################################################################
offset   26: #############################################################################
offset   27: ############################################################################
offset   28: #############################################################################
offset   29: #############################################################################
offset   30: #############################################################################
offset   31: #############################################################################
offset   32: #############################################################################
offset   33: ##########################################################################################################################
offset   34: ###########################################################################################################################
offset   35: ###########################################################################################################################
offset   36: #######################################################################################################
offset   37: #############################################################################################################################
offset   38: #############################################################################################################################
offset   39: #############################################################################################################################
offset   40: #############################################################################
offset   41: #############################################################################
offset   42: #############################################################################
offset   43: #############################################################################
offset   44: #############################################################################
offset   45: #############################################################################
offset   46: #############################################################################
offset   47: #############################################################################
offset   48: #############################################################################
offset   49: #########################################################################################
offset   50: ##########################################################################################
offset   51: ##########################################################################################
offset   52: #############################################################################
offset   53: ####################################################################################
offset   54: ####################################################################################
offset   55: ####################################################################################
offset   56: #############################################################################
offset   57: #############################################################################
offset   58: #############################################################################
offset   59: #############################################################################
offset   60: #############################################################################
offset   61: #############################################################################
offset   62: #############################################################################
offset   63: #############################################################################
offset   64: #############################################################################
offset   65: ###########################################################################################################################
offset   66: ####################################################################################################################################
offset   67: ###########################################################################################################################
offset   68: #######################################################################################################
offset   69: #############################################################################################################################
offset   70: #############################################################################################################################
offset   71: #############################################################################################################################
offset   72: ##############################################################################
offset   73: #############################################################################
offset   74: #############################################################################
offset   75: #############################################################################
offset   76: #############################################################################
offset   77: #############################################################################
offset   78: #############################################################################
offset   79: #############################################################################
offset   80: #############################################################################
offset   81: ##########################################################################################
offset   82: #########################################################################################
offset   83: #########################################################################################
offset   84: #############################################################################
offset   85: ####################################################################################
offset   86: ####################################################################################
offset   87: ####################################################################################
offset   88: #############################################################################
offset   89: #############################################################################
offset   90: ###############################################################################
offset   91: ##################################################################################
offset   92: ################################################################################
offset   93: ################################################################################
offset   94: #################################################################################
offset   95: ##################################################################################
offset   96: ################################################################################
offset   97: ###########################################################################################################################
offset   98: ###########################################################################################################################
offset   99: ###########################################################################################################################
offset  100: #######################################################################################################
offset  101: #############################################################################################################################
offset  102: #############################################################################################################################
offset  103: #############################################################################################################################
offset  104: ##############################################################################
offset  105: #############################################################################
offset  106: #############################################################################
offset  107: #############################################################################
offset  108: #############################################################################
offset  109: #############################################################################
offset  110: ##################################################################################
offset  111: ################################################################################
offset  112: ################################################################################
offset  113: ################################################################################################
offset  114: #############################################################################################
offset  115: #################################################################################################
offset  116: #############################################################################
offset  117: ####################################################################################
offset  118: #########################################################################################
offset  119: #########################################################################################
offset  120: ################################################################################
offset  121: ##################################################################################
offset  122: ################################################################################
offset  123: ###################################################################################
offset  124: #############################################################################
offset  125: #############################################################################
offset  126: #############################################################################
offset  127: #############################################################################

*** u512 ***