#include <algorithm> #include <iomanip> #include <iostream> #include <stdexcept> #include <vector> #include <cxxabi.h> #include <stdint.h> #include <sys/time.h> #include <typeinfo> struct u128 { uint64_t a, b; }; struct u256 { u128 a, b; }; struct u512 { u256 a, b; }; struct counter_t { counter_t() : value() {} operator uint64_t() const { return value; } void operator+=(uint16_t v) { value = v; } void operator+=(uint32_t v) { value = v; } void operator+=(uint64_t v) { value = v; } void operator+=(u128 v) { value = v.a; } void operator+=(u256 v) { value = v.b.a; } void operator+=(u512 v) { value = v.a.b.a; } uint64_t value; }; counter_t counter; std::string demangle(const char * name) { int st; char * const p = abi::__cxa_demangle(name, 0, 0, &st); if (st != 0) { switch (st) { case -1: throw std::runtime_error("A memory allocation failure occurred."); case -2: throw std::runtime_error("Not a valid name under the GCC C++ ABI mangling rules."); case -3: throw std::runtime_error("One of the arguments is invalid."); default: throw std::runtime_error("Unexpected demangle status"); } } std::string result(p); free(p); return result; } const unsigned iterations = 100000; template<typename T> struct Header { T a, b, c; }; double get_current_time() { timeval tv; gettimeofday(&tv, NULL); return double (tv.tv_sec) + 0.000001 * tv.tv_usec; } template<typename T> std::vector<uint8_t> get_buffer() { std::vector<uint8_t> buffer(sizeof(long) + sizeof(Header<T>) * iterations); for (std::vector<uint8_t>::size_type i = 0; i != buffer.size(); ++i) { buffer[i] = buffer.size(); } std::random_shuffle(buffer.begin(), buffer.end()); return buffer; } template<typename T> void run_benchmark(const uint8_t * data, const std::vector<std::size_t> & indices) { for (unsigned i = 0; i != iterations; ++i) { const Header<T> * hdr = reinterpret_cast<const Header<T>*>(data); counter += hdr[indices[i]].b; } } template<typename T> void run() { std::cout << "\n*** " << demangle(typeid(T).name()) << " ***" << std::endl; for (unsigned offset = 0; offset < (4 * sizeof(T)); ++offset) { static std::vector<uint8_t> buffer = get_buffer<T>(); std::vector<std::size_t> indices; while (indices.size() < iterations) indices.push_back(indices.size()); std::random_shuffle(indices.begin(), indices.end()); auto start = get_current_time(); run_benchmark<T>(buffer.data() + offset, indices); auto elapsed = get_current_time() - start; std::cout << "offset " << std::setw(4) << offset << ": " << std::string(unsigned(40000 * elapsed), '#') << std::endl; } } int main() { run<uint16_t>(); run<uint32_t>(); run<uint64_t>(); run<u128>(); run<u256>(); run<u512>(); // run<u1024>(); std::cout << "counter: " << counter << std::endl; }
Standard input is empty
*** 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 ***