Raw File
bench-scan.cpp
#include <iostream>

#include <stxxl/vector>

using vector_type = stxxl::vector<uint64_t>;

int main(int argc, char *argv[]) {
  size_t no_iterations = 1;
  size_t max_exp = 30;

  if (argc >= 2)
    max_exp = atoi(argv[1]); // in MiB
  if (argc >= 3)
    no_iterations = atoi(argv[2]);

  std::cout << "Iter,POT,TimeInit,TimeWrite,TimeRead,TimeRead2,BWWrite,BWRead,BWRead2\n";

  uint64_t sum = 0;
  for (size_t iter = 0; iter < no_iterations; ++iter) {
    for (size_t exp = 20; exp < max_exp; exp += 2) {
      const auto size_bytes = (1llu << exp);
      const auto size_elemns =
          size_bytes / sizeof(typename vector_type::value_type);
      foxxll::timer timer;

      // init
      timer.start();
      vector_type vec(size_elemns);
      const auto time_init = timer.mseconds();

      // write
      {
        timer.start();
        vector_type::bufwriter_type writer(vec);
        for (uint64_t i = 0; i < size_elemns; ++i)
          writer << (i % 1024);
        writer.finish();
      }
      const auto time_write = timer.mseconds();

      // read
      {
        timer.start();
        for (vector_type::bufreader_type reader(vec); !reader.empty(); ++reader)
          sum += *reader;
      }
      const auto time_read = timer.mseconds();

      // read again
      {
        timer.start();
        for (vector_type::bufreader_type reader(vec); !reader.empty(); ++reader)
          sum += *reader;
      }
      const auto time_read2 = timer.mseconds();

      const auto bw_write = (size_bytes / time_write) / 1000.0; // MB/s
      const auto bw_read = (size_bytes / time_read) / 1000.0;   // MB/s
      const auto bw_read2 = (size_bytes / time_read2) / 1000.0; // MB/s

      std::cout << iter << ","       //
                << exp << ","        //
                << time_init << ","  //
                << time_write << "," //
                << time_read << ","  //
                << time_read2 << "," //
                << bw_write << ","   //
                << bw_read << ","    //
                << bw_read2 << std::endl;
    }
  }

  return sum == 0x1231324334232llu; // make sure sum is not optimized away
}
back to top