GraphLab: Distributed Graph-Parallel API  2.1
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Macros Groups Pages
dht_performance_test.cpp
1 #include <iostream>
2 #include <graphlab/util/timer.hpp>
3 #include <graphlab/util/mpi_tools.hpp>
4 #include <graphlab/util/generics/any.hpp>
5 #include <graphlab/rpc/dc.hpp>
6 #include <graphlab/rpc/dc_init_from_mpi.hpp>
7 #include <graphlab/rpc/dht.hpp>
9 using namespace graphlab;
10 
11 std::string randstring(size_t len) {
12  std::string str;
13  str.resize(len);
14  const char *charset="ab";
15  size_t charsetlen = 64;
16  for (size_t i = 0;i < len; ++i) {
17  str[i] = charset[rand() % charsetlen];
18  }
19  return str;
20 }
21 
22 int main(int argc, char ** argv) {
23  mpi_tools::init(argc, argv);
25 
26  std::cout << "I am machine id " << dc.procid()
27  << " in " << dc.numprocs() << " machines"<<std::endl;
29 
30  std::vector<std::pair<std::string, std::string> > data;
31  const size_t NUMSTRINGS = 10000;
32  const size_t strlen[4] = {16, 128, 1024, 10240};
33  // fill rate
34  for (size_t l = 0; l < 4; ++l) {
35  timer ti;
36  if (dc.procid() == 0) {
37  std::cout << "String Length = " << strlen[l] << std::endl;
38  data.clear();
39  for (size_t i = 0;i < NUMSTRINGS; ++i) {
40  data.push_back(std::make_pair(randstring(8), randstring(strlen[l])));
41  }
42  std::cout << "10k random strings generated" << std::endl;
43  std::cout << "Starting set" << std::endl;
44  ti.start();
45  for (size_t i = 0;i < NUMSTRINGS; ++i) {
46  testdht.set(data[i].first, data[i].second);
47  if (i % 100000 == 0) {
48  std::cout << ".";
49  std::cout.flush();
50  }
51  }
52  std::cout << "10k insertions in " << ti.current_time();
53  }
54  dc.full_barrier();
55  if (dc.procid() == 0) std::cout << "\t" << ti.current_time() << " " << double(strlen[l]*NUMSTRINGS)/ti.current_time()/1024/1024 << std::endl;
56  // dc.barrier();
57  // get rate
58  if (dc.procid() == 0) {
59  std::cout << "Starting get" << std::endl;
60 
61  timer ti;
62  ti.start();
63  for (size_t i = 0;i < NUMSTRINGS; ++i) {
64  std::pair<bool, std::string> ret = testdht.get(data[i].first);
65  assert(ret.first);
66  if (i % 100 == 0) {
67  std::cout << ".";
68  std::cout.flush();
69  }
70  }
71  std::cout << "10k reads in " << ti.current_time() << std::endl;
72  }
73 
74  if (dc.procid() == 0) {
75  std::cout << "Starting background gets" << std::endl;
76 
77  timer ti;
78  std::vector<request_future<std::pair<bool, std::string> > > futures;
79  futures.resize(NUMSTRINGS);
80  ti.start();
81  for (size_t i = 0;i < NUMSTRINGS; ++i) {
82  futures[i] = testdht.get_future(data[i].first);
83  }
84  std::cout << "gets issued." << std::endl;
85  for (size_t i = 0;i < NUMSTRINGS; ++i) {
86  std::pair<bool, std::string> ret = futures[i]();
87  if (i % 100 == 0) {
88  std::cout << ".";
89  std::cout.flush();
90  }
91  }
92  std::cout << "10k reads in " << ti.current_time() << std::endl;
93  }
94 
95  testdht.clear();
96  }
97  dc.barrier();
98  testdht.print_stats();
99  mpi_tools::finalize();
100 }