fork(1) download
  1. #include <iostream>
  2. #include <iomanip>
  3. #include <vector>
  4. #include <sstream>
  5. #include <chrono>
  6.  
  7. class ToHexIterator : public std::iterator<std::input_iterator_tag, int>{
  8. char* it_;
  9. char* end_;
  10. int current_;
  11. bool isHex(const char c){
  12. return (c >= '0' && c <= '9') || (c >= 'a' && c <= 'f') || (c >= 'A' && c <= 'F');
  13. }
  14. char toUpperCase(const char c){
  15. if (c >= 'a' && c <= 'f'){
  16. return (c - 'a') + 'A';
  17. }
  18. return c;
  19. }
  20. int toNibble(const char c){
  21. auto x = toUpperCase(c);
  22. if (x >= '0' && x <= '9'){
  23. return x - '0';
  24. }
  25. else {
  26. return (x - 'A') + 10;
  27. }
  28. }
  29. public:
  30. ToHexIterator() :it_{ nullptr }, end_{ nullptr }, current_{}{} //default constructed means end iterator
  31. ToHexIterator(char* begin, char* end) :it_{ begin }, end_{ end }, current_{}{
  32. while (!isHex(*it_) && it_ != end_){ ++it_; }; //make sure we are pointing to valid stuff
  33. ++(*this);
  34. }
  35. bool operator==(const ToHexIterator &other){
  36. return it_ == nullptr && end_ == nullptr && other.it_ == nullptr && other.end_ == nullptr;
  37. }
  38. bool operator!=(const ToHexIterator &other){
  39. return !(*this == other);
  40. }
  41. int operator*(){
  42. return current_;
  43. }
  44. ToHexIterator & operator++(){
  45. current_ = 0;
  46. if (it_ != end_) {
  47. while (isHex(*it_) && it_ != end_){
  48. current_ <<= 4;
  49. current_ += toNibble(*it_);
  50. ++it_;
  51. };
  52. while (!isHex(*it_) && it_ != end_){ ++it_; };
  53. }
  54. else {
  55. it_ = nullptr;
  56. end_ = nullptr;
  57. }
  58. return *this;
  59. }
  60. ToHexIterator operator++(int){
  61. ToHexIterator temp(*this);
  62. ++(*this);
  63. return temp;
  64. }
  65. };
  66.  
  67. void __attribute__ ((noinline)) test1(std::vector<int> &v){
  68. char in[] = "1,3,8,b,e,ff,10";
  69. std::copy(ToHexIterator{ std::begin(in), std::end(in) }, ToHexIterator{}, std::back_inserter(v));
  70. }
  71.  
  72. void __attribute__ ((noinline)) test2(std::vector<int> &v){
  73. std::istringstream iss("1,3,8,b,e,ff,10");
  74. unsigned int num = 0;
  75. while(iss >> std::hex >> num || !iss.eof())
  76. {
  77. if(iss.fail())
  78. {
  79. iss.clear();
  80. char dummy;
  81. iss >> dummy;
  82. continue;
  83. }
  84. if(num <= 0xff) {
  85. v.push_back(num);
  86. }
  87. else {
  88. // Error single byte value expected
  89. }
  90. }
  91. }
  92.  
  93. int main() {
  94.  
  95. std::vector<int> dataValues;
  96. std::vector<int> dataValues2;
  97.  
  98. std::chrono::nanoseconds time[2]{{},{}};
  99.  
  100. for(int i=0;i<100;i++){
  101. const auto t1 = std::chrono::high_resolution_clock::now();
  102. test2(dataValues2);
  103. const auto t2 = std::chrono::high_resolution_clock::now();
  104. time[0] += t2 - t1;
  105. const auto t3 = std::chrono::high_resolution_clock::now();
  106. test1(dataValues);
  107. const auto t4 = std::chrono::high_resolution_clock::now();
  108. time[1] += t4 - t3;
  109. }
  110.  
  111. typedef std::chrono::nanoseconds output_time;
  112. const char* const out_unit = " ns";
  113.  
  114. std::cout << "1: " << std::chrono::duration_cast<output_time>(time[0]).count() << out_unit << "\n";
  115. std::cout << "2: " << std::chrono::duration_cast<output_time>(time[1]).count() << out_unit << "\n";
  116.  
  117. std::cout << std::hex << std::setfill('0');
  118. for(int i:dataValues) {
  119. std::cout << "0x" << std::setw(2) << static_cast<unsigned int>(i) << std::endl;
  120. }
  121. for(int i:dataValues2) {
  122. std::cout << "0x" << std::setw(2) << static_cast<unsigned int>(i) << std::endl;
  123. }
  124.  
  125. return 0;
  126. }
Success #stdin #stdout 0s 3480KB
stdin
Standard input is empty
stdout
1: 452860 ns
2: 45095 ns
0x01
0x03
0x08
0x0b
0x0e
0xff
0x10
0x01
0x03
0x08
0x0b
0x0e
0xff
0x10
0x01
0x03
0x08
0x0b
0x0e
0xff
0x10
0x01
0x03
0x08
0x0b
0x0e
0xff
0x10
0x01
0x03
0x08
0x0b
0x0e
0xff
0x10
0x01
0x03
0x08
0x0b
0x0e
0xff
0x10
0x01
0x03
0x08
0x0b
0x0e
0xff
0x10
0x01
0x03
0x08
0x0b
0x0e
0xff
0x10
0x01
0x03
0x08
0x0b
0x0e
0xff
0x10
0x01
0x03
0x08
0x0b
0x0e
0xff
0x10
0x01
0x03
0x08
0x0b
0x0e
0xff
0x10
0x01
0x03
0x08
0x0b
0x0e
0xff
0x10
0x01
0x03
0x08
0x0b
0x0e
0xff
0x10
0x01
0x03
0x08
0x0b
0x0e
0xff
0x10
0x01
0x03
0x08
0x0b
0x0e
0xff
0x10
0x01
0x03
0x08
0x0b
0x0e
0xff
0x10
0x01
0x03
0x08
0x0b
0x0e
0xff
0x10
0x01
0x03
0x08
0x0b
0x0e
0xff
0x10
0x01
0x03
0x08
0x0b
0x0e
0xff
0x10
0x01
0x03
0x08
0x0b
0x0e
0xff
0x10
0x01
0x03
0x08
0x0b
0x0e
0xff
0x10
0x01
0x03
0x08
0x0b
0x0e
0xff
0x10
0x01
0x03
0x08
0x0b
0x0e
0xff
0x10
0x01
0x03
0x08
0x0b
0x0e
0xff
0x10
0x01
0x03
0x08
0x0b
0x0e
0xff
0x10
0x01
0x03
0x08
0x0b
0x0e
0xff
0x10
0x01
0x03
0x08
0x0b
0x0e
0xff
0x10
0x01
0x03
0x08
0x0b
0x0e
0xff
0x10
0x01
0x03
0x08
0x0b
0x0e
0xff
0x10
0x01
0x03
0x08
0x0b
0x0e
0xff
0x10
0x01
0x03
0x08
0x0b
0x0e
0xff
0x10
0x01
0x03
0x08
0x0b
0x0e
0xff
0x10
0x01
0x03
0x08
0x0b
0x0e
0xff
0x10
0x01
0x03
0x08
0x0b
0x0e
0xff
0x10
0x01
0x03
0x08
0x0b
0x0e
0xff
0x10
0x01
0x03
0x08
0x0b
0x0e
0xff
0x10
0x01
0x03
0x08
0x0b
0x0e
0xff
0x10
0x01
0x03
0x08
0x0b
0x0e
0xff
0x10
0x01
0x03
0x08
0x0b
0x0e
0xff
0x10
0x01
0x03
0x08
0x0b
0x0e
0xff
0x10
0x01
0x03
0x08
0x0b
0x0e
0xff
0x10
0x01
0x03
0x08
0x0b
0x0e
0xff
0x10
0x01
0x03
0x08
0x0b
0x0e
0xff
0x10
0x01
0x03
0x08
0x0b
0x0e
0xff
0x10
0x01
0x03
0x08
0x0b
0x0e
0xff
0x10
0x01
0x03
0x08
0x0b
0x0e
0xff
0x10
0x01
0x03
0x08
0x0b
0x0e
0xff
0x10
0x01
0x03
0x08
0x0b
0x0e
0xff
0x10
0x01
0x03
0x08
0x0b
0x0e
0xff
0x10
0x01
0x03
0x08
0x0b
0x0e
0xff
0x10
0x01
0x03
0x08
0x0b
0x0e
0xff
0x10
0x01
0x03
0x08
0x0b
0x0e
0xff
0x10
0x01
0x03
0x08
0x0b
0x0e
0xff
0x10
0x01
0x03
0x08
0x0b
0x0e
0xff
0x10
0x01
0x03
0x08
0x0b
0x0e
0xff
0x10
0x01
0x03
0x08
0x0b
0x0e
0xff
0x10
0x01
0x03
0x08
0x0b
0x0e
0xff
0x10
0x01
0x03
0x08
0x0b
0x0e
0xff
0x10
0x01
0x03
0x08
0x0b
0x0e
0xff
0x10
0x01
0x03
0x08
0x0b
0x0e
0xff
0x10
0x01
0x03
0x08
0x0b
0x0e
0xff
0x10
0x01
0x03
0x08
0x0b
0x0e
0xff
0x10
0x01
0x03
0x08
0x0b
0x0e
0xff
0x10
0x01
0x03
0x08
0x0b
0x0e
0xff
0x10
0x01
0x03
0x08
0x0b
0x0e
0xff
0x10
0x01
0x03
0x08
0x0b
0x0e
0xff
0x10
0x01
0x03
0x08
0x0b
0x0e
0xff
0x10
0x01
0x03
0x08
0x0b
0x0e
0xff
0x10
0x01
0x03
0x08
0x0b
0x0e
0xff
0x10
0x01
0x03
0x08
0x0b
0x0e
0xff
0x10
0x01
0x03
0x08
0x0b
0x0e
0xff
0x10
0x01
0x03
0x08
0x0b
0x0e
0xff
0x10
0x01
0x03
0x08
0x0b
0x0e
0xff
0x10
0x01
0x03
0x08
0x0b
0x0e
0xff
0x10
0x01
0x03
0x08
0x0b
0x0e
0xff
0x10
0x01
0x03
0x08
0x0b
0x0e
0xff
0x10
0x01
0x03
0x08
0x0b
0x0e
0xff
0x10
0x01
0x03
0x08
0x0b
0x0e
0xff
0x10
0x01
0x03
0x08
0x0b
0x0e
0xff
0x10
0x01
0x03
0x08
0x0b
0x0e
0xff
0x10
0x01
0x03
0x08
0x0b
0x0e
0xff
0x10
0x01
0x03
0x08
0x0b
0x0e
0xff
0x10
0x01
0x03
0x08
0x0b
0x0e
0xff
0x10
0x01
0x03
0x08
0x0b
0x0e
0xff
0x10
0x01
0x03
0x08
0x0b
0x0e
0xff
0x10
0x01
0x03
0x08
0x0b
0x0e
0xff
0x10
0x01
0x03
0x08
0x0b
0x0e
0xff
0x10
0x01
0x03
0x08
0x0b
0x0e
0xff
0x10
0x01
0x03
0x08
0x0b
0x0e
0xff
0x10
0x01
0x03
0x08
0x0b
0x0e
0xff
0x10
0x01
0x03
0x08
0x0b
0x0e
0xff
0x10
0x01
0x03
0x08
0x0b
0x0e
0xff
0x10
0x01
0x03
0x08
0x0b
0x0e
0xff
0x10
0x01
0x03
0x08
0x0b
0x0e
0xff
0x10
0x01
0x03
0x08
0x0b
0x0e
0xff
0x10
0x01
0x03
0x08
0x0b
0x0e
0xff
0x10
0x01
0x03
0x08
0x0b
0x0e
0xff
0x10
0x01
0x03
0x08
0x0b
0x0e
0xff
0x10
0x01
0x03
0x08
0x0b
0x0e
0xff
0x10
0x01
0x03
0x08
0x0b
0x0e
0xff
0x10
0x01
0x03
0x08
0x0b
0x0e
0xff
0x10
0x01
0x03
0x08
0x0b
0x0e
0xff
0x10
0x01
0x03
0x08
0x0b
0x0e
0xff
0x10
0x01
0x03
0x08
0x0b
0x0e
0xff
0x10
0x01
0x03
0x08
0x0b
0x0e
0xff
0x10
0x01
0x03
0x08
0x0b
0x0e
0xff
0x10
0x01
0x03
0x08
0x0b
0x0e
0xff
0x10
0x01
0x03
0x08
0x0b
0x0e
0xff
0x10
0x01
0x03
0x08
0x0b
0x0e
0xff
0x10
0x01
0x03
0x08
0x0b
0x0e
0xff
0x10
0x01
0x03
0x08
0x0b
0x0e
0xff
0x10
0x01
0x03
0x08
0x0b
0x0e
0xff
0x10
0x01
0x03
0x08
0x0b
0x0e
0xff
0x10
0x01
0x03
0x08
0x0b
0x0e
0xff
0x10
0x01
0x03
0x08
0x0b
0x0e
0xff
0x10
0x01
0x03
0x08
0x0b
0x0e
0xff
0x10
0x01
0x03
0x08
0x0b
0x0e
0xff
0x10
0x01
0x03
0x08
0x0b
0x0e
0xff
0x10
0x01
0x03
0x08
0x0b
0x0e
0xff
0x10
0x01
0x03
0x08
0x0b
0x0e
0xff
0x10
0x01
0x03
0x08
0x0b
0x0e
0xff
0x10
0x01
0x03
0x08
0x0b
0x0e
0xff
0x10
0x01
0x03
0x08
0x0b
0x0e
0xff
0x10
0x01
0x03
0x08
0x0b
0x0e
0xff
0x10
0x01
0x03
0x08
0x0b
0x0e
0xff
0x10
0x01
0x03
0x08
0x0b
0x0e
0xff
0x10
0x01
0x03
0x08
0x0b
0x0e
0xff
0x10
0x01
0x03
0x08
0x0b
0x0e
0xff
0x10
0x01
0x03
0x08
0x0b
0x0e
0xff
0x10
0x01
0x03
0x08
0x0b
0x0e
0xff
0x10
0x01
0x03
0x08
0x0b
0x0e
0xff
0x10
0x01
0x03
0x08
0x0b
0x0e
0xff
0x10
0x01
0x03
0x08
0x0b
0x0e
0xff
0x10
0x01
0x03
0x08
0x0b
0x0e
0xff
0x10
0x01
0x03
0x08
0x0b
0x0e
0xff
0x10
0x01
0x03
0x08
0x0b
0x0e
0xff
0x10
0x01
0x03
0x08
0x0b
0x0e
0xff
0x10
0x01
0x03
0x08
0x0b
0x0e
0xff
0x10
0x01
0x03
0x08
0x0b
0x0e
0xff
0x10
0x01
0x03
0x08
0x0b
0x0e
0xff
0x10
0x01
0x03
0x08
0x0b
0x0e
0xff
0x10
0x01
0x03
0x08
0x0b
0x0e
0xff
0x10
0x01
0x03
0x08
0x0b
0x0e
0xff
0x10
0x01
0x03
0x08
0x0b
0x0e
0xff
0x10
0x01
0x03
0x08
0x0b
0x0e
0xff
0x10
0x01
0x03
0x08
0x0b
0x0e
0xff
0x10
0x01
0x03
0x08
0x0b
0x0e
0xff
0x10
0x01
0x03
0x08
0x0b
0x0e
0xff
0x10
0x01
0x03
0x08
0x0b
0x0e
0xff
0x10
0x01
0x03
0x08
0x0b
0x0e
0xff
0x10
0x01
0x03
0x08
0x0b
0x0e
0xff
0x10
0x01
0x03
0x08
0x0b
0x0e
0xff
0x10
0x01
0x03
0x08
0x0b
0x0e
0xff
0x10
0x01
0x03
0x08
0x0b
0x0e
0xff
0x10
0x01
0x03
0x08
0x0b
0x0e
0xff
0x10
0x01
0x03
0x08
0x0b
0x0e
0xff
0x10
0x01
0x03
0x08
0x0b
0x0e
0xff
0x10
0x01
0x03
0x08
0x0b
0x0e
0xff
0x10
0x01
0x03
0x08
0x0b
0x0e
0xff
0x10
0x01
0x03
0x08
0x0b
0x0e
0xff
0x10
0x01
0x03
0x08
0x0b
0x0e
0xff
0x10
0x01
0x03
0x08
0x0b
0x0e
0xff
0x10
0x01
0x03
0x08
0x0b
0x0e
0xff
0x10
0x01
0x03
0x08
0x0b
0x0e
0xff
0x10
0x01
0x03
0x08
0x0b
0x0e
0xff
0x10
0x01
0x03
0x08
0x0b
0x0e
0xff
0x10
0x01
0x03
0x08
0x0b
0x0e
0xff
0x10
0x01
0x03
0x08
0x0b
0x0e
0xff
0x10
0x01
0x03
0x08
0x0b
0x0e
0xff
0x10
0x01
0x03
0x08
0x0b
0x0e
0xff
0x10
0x01
0x03
0x08
0x0b
0x0e
0xff
0x10
0x01
0x03
0x08
0x0b
0x0e
0xff
0x10
0x01
0x03
0x08
0x0b
0x0e
0xff
0x10
0x01
0x03
0x08
0x0b
0x0e
0xff
0x10
0x01
0x03
0x08
0x0b
0x0e
0xff
0x10
0x01
0x03
0x08
0x0b
0x0e
0xff
0x10
0x01
0x03
0x08
0x0b
0x0e
0xff
0x10
0x01
0x03
0x08
0x0b
0x0e
0xff
0x10
0x01
0x03
0x08
0x0b
0x0e
0xff
0x10
0x01
0x03
0x08
0x0b
0x0e
0xff
0x10
0x01
0x03
0x08
0x0b
0x0e
0xff
0x10
0x01
0x03
0x08
0x0b
0x0e
0xff
0x10
0x01
0x03
0x08
0x0b
0x0e
0xff
0x10
0x01
0x03
0x08
0x0b
0x0e
0xff
0x10
0x01
0x03
0x08
0x0b
0x0e
0xff
0x10
0x01
0x03
0x08
0x0b
0x0e
0xff
0x10
0x01
0x03
0x08
0x0b
0x0e
0xff
0x10
0x01
0x03
0x08
0x0b
0x0e
0xff
0x10
0x01
0x03
0x08
0x0b
0x0e
0xff
0x10
0x01
0x03
0x08
0x0b
0x0e
0xff
0x10
0x01
0x03
0x08
0x0b
0x0e
0xff
0x10
0x01
0x03
0x08
0x0b
0x0e
0xff
0x10
0x01
0x03
0x08
0x0b
0x0e
0xff
0x10
0x01
0x03
0x08
0x0b
0x0e
0xff
0x10
0x01
0x03
0x08
0x0b
0x0e
0xff
0x10
0x01
0x03
0x08
0x0b
0x0e
0xff
0x10
0x01
0x03
0x08
0x0b
0x0e
0xff
0x10
0x01
0x03
0x08
0x0b
0x0e
0xff
0x10
0x01
0x03
0x08
0x0b
0x0e
0xff
0x10
0x01
0x03
0x08
0x0b
0x0e
0xff
0x10