Advertisement
Guest User

Untitled

a guest
Mar 22nd, 2019
225
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.98 KB | None | 0 0
  1. #include <cinttypes>
  2. #include <cstdlib>
  3. #include <cstring>
  4. #include <ctime>
  5. #include <iostream>
  6.  
  7. std::uint32_t tbl[0x1000000];
  8. const char b64alpha[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
  9.  
  10. void base64b(const char source[], std::size_t size) {
  11.     std::cout << "Run bitwise \n";
  12.     auto result = new char[size*4/3];
  13.     struct timespec start;
  14.     clock_gettime(CLOCK_MONOTONIC, &start);
  15.     for (auto counter = 0; counter < 100; ++counter) {
  16.       for (auto i = 0, j = 0; i < size; i +=3, j += 4) {
  17.         auto block = (std::uint8_t(source[i]) << 16) |
  18.                       (std::uint8_t(source[i+1]) << 8) |
  19.                       std::uint8_t(source[i+2]);
  20.         result[j+0] = b64alpha[(block>>18)&0x3f];
  21.         result[j+1] = b64alpha[(block>>12)&0x3f];
  22.         result[j+2] = b64alpha[(block>>6)&0x3f];
  23.         result[j+3] = b64alpha[block&0x3f];
  24.       }
  25.       asm volatile("" :: "m"(result));
  26.     }
  27.     struct timespec finish;
  28.     clock_gettime(CLOCK_MONOTONIC, &finish);
  29.     auto delta = std::int64_t(finish.tv_nsec) + std::int64_t(finish.tv_sec) * 1000000000 -
  30.                  std::int64_t(start.tv_nsec) - std::int64_t(start.tv_sec) * 1000000000;
  31.     std::cout << (double(delta) / 1000000000) << "s \n";
  32.     (std::cout << "Base64: ").write(result, 40) << "\n";
  33.     delete[] result;
  34. }
  35.  
  36. void base64t(const char source[], std::size_t size) {
  37.     std::cout << "Run tabular \n";
  38.     auto result = new char[size*4/3];
  39.     struct timespec start;
  40.     clock_gettime(CLOCK_MONOTONIC, &start);
  41.     for (auto counter = 0; counter < 100; ++counter) {
  42.       for (auto i = 0, j = 0; i < size; i +=3, j += 4) {
  43.         uint32_t block;
  44.         std::memcpy(&block, &source[i], sizeof(block));
  45.         block &= 0xffffff;
  46.         std::memcpy(&result[j], &tbl[block], sizeof(uint32_t));
  47.       }
  48.       asm volatile("" :: "m"(result));
  49.     }
  50.     struct timespec finish;
  51.     clock_gettime(CLOCK_MONOTONIC, &finish);
  52.     auto delta = std::int64_t(finish.tv_nsec) + std::int64_t(finish.tv_sec) * 1000000000 -
  53.                  std::int64_t(start.tv_nsec) - std::int64_t(start.tv_sec) * 1000000000;
  54.     std::cout << (double(delta) / 1000000000) << "s \n";
  55.     (std::cout << "Base64: ").write(result, 40) << "\n";
  56.     delete[] result;
  57. }
  58.  
  59. char source[3*10*1024*1024];
  60. int main() {
  61.   std::cout << "Prepare table\n";
  62.   for (auto i = 0; i < 0x1000000; i++) {
  63.     auto block = ((i & 0xff) << 16) | (i & 0xff00) | (i >> 16);
  64.  
  65.     tbl[i] = std::uint32_t(b64alpha[(block>>18)&0x3f]) |
  66.              std::uint32_t(b64alpha[(block>>12)&0x3f])<<8 |
  67.              std::uint32_t(b64alpha[(block>>6)&0x3f])<<16 |
  68.              std::uint32_t(b64alpha[block&0x3f])<<24;
  69.   }
  70.  
  71.   const char alpha[] = "abcdefghijklmnopqrstuvwxyz0123456789 {}\":";
  72.   for (auto i = 0; i < sizeof(source); ++i) {
  73.     source[i] = alpha[rand() % (sizeof(alpha) - 1)];
  74.   }
  75.   (std::cout << "Text source data:").write(source, 30) << "\n";
  76.   base64b(source, sizeof(source));
  77.   base64t(source, sizeof(source));
  78. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement