Advertisement
Guest User

gen3.cpp

a guest
Jul 16th, 2018
281
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 8.59 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <vector>
  3. #include <iostream>
  4. #include <iomanip>
  5. #include <cstdlib>
  6. #include <ctime>
  7. #include <cassert>
  8.  
  9. struct Input {
  10.  
  11.     FILE* file;
  12.    
  13.     std::vector<char> buffer;
  14.    
  15.     int pos;
  16.    
  17.     Input(FILE* file_, const int size_ = 1024*1024)
  18.         : file(file_)
  19.         , buffer(size_, '\0')
  20.         , pos(0)
  21.     {
  22.         int size = fread(&buffer[0], 1, (int)buffer.size(), file);            
  23.         buffer.resize(size);
  24.     }
  25.    
  26.     inline char get_char() {
  27.         if (pos == (int)buffer.size()) {
  28.             int size = fread(&buffer[0], 1, (int)buffer.size(), file);            
  29.             buffer.resize(size);
  30.             pos = 0;
  31.         }
  32.         if (pos == (int)buffer.size()) {
  33.             return EOF;
  34.         }
  35.         return buffer[pos++];
  36.     }
  37.    
  38.     inline int get_int() {
  39.         char c = '?';
  40.         while (!(c == '-' || ('0' <= c && c <= '9'))) c = get_char();
  41.         bool positive = true;
  42.         if (c == '-') {
  43.             positive = false;
  44.             c = get_char();
  45.         }
  46.         int answ = 0;
  47.         while ('0' <= c && c <= '9') { (answ *= 10) += (c - '0'); c = get_char(); }
  48.         return positive ? answ : -answ;
  49.     }
  50.    
  51.     inline long long get_ll() {
  52.         char c = '?';
  53.         while (!(c == '-' || ('0' <= c && c <= '9'))) c = get_char();
  54.         bool positive = true;
  55.         if (c == '-') {
  56.             positive = false;
  57.             c = get_char();
  58.         }
  59.         long long answ = 0;
  60.         while ('0' <= c && c <= '9') { (answ *= 10) += (c - '0'); c = get_char(); }
  61.         return positive ? answ : -answ;
  62.     }
  63.    
  64.     inline double get_dbl() {
  65.         char c = '?';
  66.         while (!(c == '-' || ('0' <= c && c <= '9'))) c = get_char();
  67.         bool positive = true;
  68.         if (c == '-') {
  69.             positive = false;
  70.             c = get_char();
  71.         }
  72.         long long first = 0;
  73.         while ('0' <= c && c <= '9') { (first *= 10) += (c - '0'); c = get_char(); }
  74.         if (c != '.') {
  75.             return double(positive ? first : -first);
  76.         }
  77.         c = get_char();
  78.         long long second = 0;
  79.         long long pow = 1;
  80.         while ('0' <= c && c <= '9') { (second *= 10) += (c - '0'); c = get_char(); pow *= 10; }
  81.         double answ = first + (double)second / (double)pow;
  82.         return positive ? answ : -answ;
  83.     }
  84. };
  85.  
  86. struct Output {
  87.  
  88.     FILE* file;
  89.    
  90.     std::vector<char> buffer;
  91.    
  92.     int pos;
  93.    
  94.     Output(FILE* file_, const int size_ = 1024*1024)
  95.         : file(file_)
  96.         , buffer(size_, '\0')
  97.         , pos(0)
  98.     { }
  99.    
  100.     inline void flush() {
  101.         put_char(-1);
  102.     }
  103.    
  104.     inline void put_char(char c) {
  105.         if (pos == (int)buffer.size() || c == -1) {
  106.             fwrite(&buffer[0], 1, pos, file);
  107.             pos = 0;
  108.         }
  109.         if (c != -1) {
  110.     buffer[pos++] = c;
  111.         }
  112.     }
  113.    
  114.     inline void put_int(int value, int len = 0) {
  115.         if (value < 0) {
  116.             put_char('-');
  117.             value = -value;
  118.         }
  119.         char buf[12]; int p = 0;
  120.         do {
  121.             buf[p++] = char(value % 10 + '0');
  122.             value /= 10;
  123.         } while (value > 0);
  124.         while (p < len) buf[p++] = '0';
  125.         while (p > 0) put_char(buf[--p]);
  126.     }
  127.    
  128.     inline void put_ll(long long value, int len = 0) {
  129.         if (value < 0) {
  130.             put_char('-');
  131.             value = -value;
  132.         }
  133.         char buf[12]; int p = 0;
  134.         do {
  135.             buf[p++] = char(value % 10 + '0');
  136.             value /= 10;
  137.         } while (value > 0);
  138.         while (p < len) buf[p++] = '0';
  139.         while (p > 0) put_char(buf[--p]);
  140.     }
  141.    
  142.     inline void put_dbl(double value, int precision = 6) {
  143.         if (value < 0) {
  144.             put_char('-');
  145.             value = -value;
  146.         }
  147.        
  148.         put_ll((long long)value);
  149.         value -= (long long)value;
  150.        
  151.         if (precision == 0) {
  152.             return;
  153.         }
  154.        
  155.         put_char('.');
  156.         while (precision >= 6) {
  157.             value *= 1000000;
  158.             put_int((int)value, 6);
  159.             value -= (int)value;
  160.             precision -= 6;
  161.         }
  162.         while (precision >= 3) {
  163.             value *= 1000;
  164.             put_int((int)value, 3);
  165.             value -= (int)value;
  166.             precision -= 3;
  167.         }
  168.         while (precision >= 1) {
  169.             value *= 10;
  170.             put_char(char((int)value+'0'));
  171.             value -= (int)value;
  172.             precision--;
  173.         }
  174.     }
  175.    
  176.     ~Output() {
  177.         flush();
  178.     }
  179. };
  180.  
  181. typedef long long ll;
  182.  
  183. ll get_ll() {
  184.     ll answ = 0;
  185.     for (int i = 0; i < 6; ++i) (answ *= 1000) += std::rand() % 1000;
  186.     assert(0 <= answ && answ <= 1e18L);
  187.     return answ;
  188. }
  189.  
  190. int main() {
  191.    
  192.     const int n = 4*1000*1000;
  193.    
  194.     // Gen vector of 4kk integers:
  195.     std::vector<int> arr_int(n);
  196.     for (auto& it : arr_int) {
  197.         it = int(get_ll() % (int)1e9);
  198.     }
  199.    
  200.     // Gen vector of 4kk long long:
  201.     std::vector<ll> arr_ll(n);
  202.     for (auto& it : arr_ll) {
  203.         it = get_ll();
  204.     }
  205.    
  206.     // Gen vector of 4kk double:
  207.     std::vector<double> arr_dbl(n);
  208.     for (auto& it : arr_dbl) {
  209.         it = (double)get_ll() / 1e9;
  210.     }
  211.    
  212.     double time[2][3] = {};
  213.    
  214.     // fread / fwrite output
  215.    
  216.     {
  217.         double t = clock();
  218.         FILE* file = fopen("file_int.txt", "wt");
  219.        
  220.         Output out(file);
  221.        
  222.         out.put_int(n);
  223.         out.put_char('\n');
  224.        
  225.         for (auto& it : arr_int) {
  226.             out.put_int(it);
  227.             out.put_char(' ');
  228.         }
  229.         out.flush();
  230.         fclose(file);
  231.         time[1][0] = (clock() - t) / CLOCKS_PER_SEC;
  232.     }
  233.    
  234.     {
  235.         double t = clock();
  236.         FILE* file = fopen("file_ll.txt", "wt");
  237.        
  238.         Output out(file);
  239.        
  240.         out.put_int(n);
  241.         out.put_char('\n');
  242.        
  243.         for (auto& it : arr_ll) {
  244.             out.put_ll(it);
  245.             out.put_char(' ');
  246.         }
  247.         out.flush();
  248.         fclose(file);
  249.         time[1][1] = (clock() - t) / CLOCKS_PER_SEC;
  250.     }
  251.    
  252.     {
  253.         double t = clock();
  254.         FILE* file = fopen("file_dbl.txt", "wt");
  255.        
  256.         Output out(file);
  257.        
  258.         out.put_int(n);
  259.         out.put_char('\n');
  260.        
  261.         for (auto& it : arr_dbl) {
  262.             out.put_dbl(it);
  263.             out.put_char(' ');
  264.         }
  265.         out.flush();
  266.         fclose(file);
  267.         time[1][2] = (clock() - t) / CLOCKS_PER_SEC;
  268.     }
  269.    
  270.     // fread / fwrite output
  271.    
  272.     {
  273.         double t = clock();
  274.         FILE* file = fopen("file_int.txt", "rt");
  275.        
  276.         Input in(file);
  277.        
  278.         int size = in.get_int();
  279.         arr_int.resize(size);
  280.        
  281.         for (auto& it : arr_int) {
  282.             it = in.get_int();
  283.         }
  284.        
  285.         fclose(file);
  286.         time[0][0] = (clock() - t) / CLOCKS_PER_SEC;
  287.     }
  288.    
  289.     {
  290.         double t = clock();
  291.         FILE* file = fopen("file_ll.txt", "rt");
  292.        
  293.         Input in(file);
  294.        
  295.         int size = in.get_int();
  296.         arr_ll.resize(size);
  297.        
  298.         for (auto& it : arr_ll) {
  299.             it = in.get_ll();
  300.         }
  301.        
  302.         fclose(file);
  303.         time[0][1] = (clock() - t) / CLOCKS_PER_SEC;
  304.     }
  305.    
  306.     {
  307.         double t = clock();
  308.         FILE* file = fopen("file_ll.txt", "rt");
  309.        
  310.         Input in(file);
  311.        
  312.         int size = in.get_int();
  313.         arr_dbl.resize(size);
  314.        
  315.         for (auto& it : arr_dbl) {
  316.             it = in.get_dbl();
  317.         }
  318.        
  319.         fclose(file);
  320.         time[0][2] = (clock() - t) / CLOCKS_PER_SEC;
  321.     }
  322.    
  323.    
  324.     std::cout << "\n--- fread / fwrite - 4kk I/O speed test ---";
  325.     std::cout << "\n-------------------------------------------";
  326.     std::cout << "\n               type |    fread |    write |";
  327.     std::cout << "\n-------------------------------------------";
  328.     std::cout << "\n                int |"; for (int i = 0; i < 2; ++i) std::cout << std::setprecision(3) << std::setw(9) << std::fixed << time[i][0] << " |";
  329.     std::cout << "\n          long long |"; for (int i = 0; i < 2; ++i) std::cout << std::setprecision(3) << std::setw(9) << std::fixed << time[i][1] << " |";
  330.     std::cout << "\n             double |"; for (int i = 0; i < 2; ++i) std::cout << std::setprecision(3) << std::setw(9) << std::fixed << time[i][2] << " |";
  331.     std::cout << "\n-------------------------------------------";
  332.     std::cout << std::endl;
  333.    
  334.    
  335.    
  336.     return 0;
  337. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement