2013-01-07 00:57:43 +00:00
|
|
|
#include <iostream>
|
|
|
|
#include <iomanip>
|
2013-01-09 11:27:29 +00:00
|
|
|
#include <map>
|
2013-01-07 00:57:43 +00:00
|
|
|
|
|
|
|
#include <DB/Core/Field.h>
|
2014-04-28 01:48:24 +00:00
|
|
|
#include <DB/Common/HashTable/HashMap.h>
|
2013-01-07 00:57:43 +00:00
|
|
|
#include <DB/Common/AutoArray.h>
|
2013-06-21 20:34:19 +00:00
|
|
|
#include <DB/IO/WriteHelpers.h>
|
2013-01-07 00:57:43 +00:00
|
|
|
|
2015-10-05 00:44:40 +00:00
|
|
|
#include <DB/Common/Stopwatch.h>
|
2013-01-07 00:57:43 +00:00
|
|
|
|
|
|
|
|
|
|
|
int main(int argc, char ** argv)
|
|
|
|
{
|
|
|
|
{
|
|
|
|
size_t n = 10;
|
2016-05-28 10:35:44 +00:00
|
|
|
using T = std::string;
|
2013-01-07 00:57:43 +00:00
|
|
|
DB::AutoArray<T> arr(n);
|
|
|
|
|
|
|
|
for (size_t i = 0; i < arr.size(); ++i)
|
2013-06-21 20:34:19 +00:00
|
|
|
arr[i] = "Hello, world! " + DB::toString(i);
|
2013-01-07 00:57:43 +00:00
|
|
|
|
|
|
|
for (size_t i = 0; i < arr.size(); ++i)
|
|
|
|
std::cerr << arr[i] << std::endl;
|
|
|
|
}
|
|
|
|
|
|
|
|
std::cerr << std::endl;
|
|
|
|
|
|
|
|
{
|
|
|
|
size_t n = 10;
|
2016-05-28 10:35:44 +00:00
|
|
|
using T = std::string;
|
2013-01-09 12:06:21 +00:00
|
|
|
DB::AutoArray<T> arr(n, DB::DontInitElemsTag());
|
2013-01-07 00:57:43 +00:00
|
|
|
|
|
|
|
for (size_t i = 0; i < arr.size(); ++i)
|
2013-06-21 20:34:19 +00:00
|
|
|
new (arr.place(i)) std::string("Hello, world! " + DB::toString(i));
|
2013-01-07 00:57:43 +00:00
|
|
|
|
|
|
|
for (size_t i = 0; i < arr.size(); ++i)
|
|
|
|
std::cerr << arr[i] << std::endl;
|
|
|
|
}
|
|
|
|
|
|
|
|
std::cerr << std::endl;
|
|
|
|
|
|
|
|
{
|
|
|
|
size_t n = 10;
|
2016-05-28 10:35:44 +00:00
|
|
|
using T = std::string;
|
|
|
|
using Arr = DB::AutoArray<T>;
|
2013-01-07 00:57:43 +00:00
|
|
|
Arr arr;
|
|
|
|
|
|
|
|
arr.resize(n);
|
|
|
|
for (size_t i = 0; i < arr.size(); ++i)
|
2013-06-21 20:34:19 +00:00
|
|
|
arr[i] = "Hello, world! " + DB::toString(i);
|
2013-01-07 00:57:43 +00:00
|
|
|
|
|
|
|
for (size_t i = 0; i < arr.size(); ++i)
|
|
|
|
std::cerr << arr[i] << std::endl;
|
|
|
|
|
|
|
|
std::cerr << std::endl;
|
|
|
|
|
2014-03-26 14:08:00 +00:00
|
|
|
Arr arr2 = std::move(arr);
|
2013-01-07 00:57:43 +00:00
|
|
|
|
|
|
|
std::cerr << arr.size() << ", " << arr2.size() << std::endl;
|
|
|
|
|
|
|
|
for (size_t i = 0; i < arr2.size(); ++i)
|
|
|
|
std::cerr << arr2[i] << std::endl;
|
|
|
|
}
|
|
|
|
|
2013-01-09 11:27:29 +00:00
|
|
|
std::cerr << std::endl;
|
|
|
|
|
|
|
|
{
|
|
|
|
size_t n = 10;
|
|
|
|
size_t keys = 10;
|
2016-05-28 10:35:44 +00:00
|
|
|
using T = std::string;
|
|
|
|
using Arr = DB::AutoArray<T>;
|
|
|
|
using Map = std::map<Arr, T>;
|
2013-01-09 11:27:29 +00:00
|
|
|
Map map;
|
|
|
|
|
|
|
|
for (size_t i = 0; i < keys; ++i)
|
|
|
|
{
|
|
|
|
Arr key(n);
|
|
|
|
for (size_t j = 0; j < n; ++j)
|
2013-06-21 20:34:19 +00:00
|
|
|
key[j] = DB::toString(rand());
|
2013-01-09 11:27:29 +00:00
|
|
|
|
2014-03-26 14:45:50 +00:00
|
|
|
map[std::move(key)] = "Hello, world! " + DB::toString(i);
|
2013-01-09 11:27:29 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
for (Map::const_iterator it = map.begin(); it != map.end(); ++it)
|
|
|
|
{
|
|
|
|
std::cerr << "[";
|
|
|
|
for (size_t j = 0; j < n; ++j)
|
|
|
|
std::cerr << (j == 0 ? "" : ", ") << it->first[j];
|
|
|
|
std::cerr << "]";
|
|
|
|
|
|
|
|
std::cerr << ":\t" << it->second << std::endl;
|
|
|
|
}
|
|
|
|
|
|
|
|
std::cerr << std::endl;
|
|
|
|
|
2014-03-26 14:45:50 +00:00
|
|
|
Map map2 = std::move(map);
|
2013-01-09 11:27:29 +00:00
|
|
|
|
|
|
|
for (Map::const_iterator it = map2.begin(); it != map2.end(); ++it)
|
|
|
|
{
|
|
|
|
std::cerr << "[";
|
|
|
|
for (size_t j = 0; j < n; ++j)
|
|
|
|
std::cerr << (j == 0 ? "" : ", ") << it->first[j];
|
|
|
|
std::cerr << "]";
|
|
|
|
|
|
|
|
std::cerr << ":\t" << it->second << std::endl;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
std::cerr << std::endl;
|
|
|
|
|
|
|
|
{
|
|
|
|
size_t n = 10;
|
|
|
|
size_t keys = 10;
|
2016-05-28 10:35:44 +00:00
|
|
|
using T = std::string;
|
|
|
|
using Arr = DB::AutoArray<T>;
|
|
|
|
using Vec = std::vector<Arr>;
|
2013-01-09 11:27:29 +00:00
|
|
|
Vec vec;
|
|
|
|
|
|
|
|
for (size_t i = 0; i < keys; ++i)
|
|
|
|
{
|
|
|
|
Arr key(n);
|
|
|
|
for (size_t j = 0; j < n; ++j)
|
2013-06-21 20:34:19 +00:00
|
|
|
key[j] = DB::toString(rand());
|
2013-01-09 11:27:29 +00:00
|
|
|
|
2014-03-26 14:45:50 +00:00
|
|
|
vec.push_back(std::move(key));
|
2013-01-09 11:27:29 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
for (Vec::const_iterator it = vec.begin(); it != vec.end(); ++it)
|
|
|
|
{
|
|
|
|
std::cerr << "[";
|
|
|
|
for (size_t j = 0; j < n; ++j)
|
|
|
|
std::cerr << (j == 0 ? "" : ", ") << (*it)[j];
|
|
|
|
std::cerr << "]" << std::endl;
|
|
|
|
}
|
|
|
|
|
|
|
|
std::cerr << std::endl;
|
|
|
|
|
2014-03-26 14:45:50 +00:00
|
|
|
Vec vec2 = std::move(vec);
|
2013-01-09 11:27:29 +00:00
|
|
|
|
|
|
|
for (Vec::const_iterator it = vec2.begin(); it != vec2.end(); ++it)
|
|
|
|
{
|
|
|
|
std::cerr << "[";
|
|
|
|
for (size_t j = 0; j < n; ++j)
|
|
|
|
std::cerr << (j == 0 ? "" : ", ") << (*it)[j];
|
|
|
|
std::cerr << "]" << std::endl;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2013-01-07 00:57:43 +00:00
|
|
|
size_t n = 5;
|
|
|
|
size_t map_size = 1000000;
|
2016-05-28 10:35:44 +00:00
|
|
|
using T = DB::Field;
|
2013-01-07 00:57:43 +00:00
|
|
|
T field = std::string("Hello, world");
|
|
|
|
|
|
|
|
if (argc == 2 && !strcmp(argv[1], "1"))
|
|
|
|
{
|
2016-05-28 10:35:44 +00:00
|
|
|
using Arr = DB::AutoArray<T>;
|
|
|
|
using Map = HashMap<UInt64, Arr>;
|
2013-01-07 00:57:43 +00:00
|
|
|
|
|
|
|
Stopwatch watch;
|
|
|
|
|
|
|
|
Map map;
|
|
|
|
for (size_t i = 0; i < map_size; ++i)
|
|
|
|
{
|
|
|
|
Map::iterator it;
|
|
|
|
bool inserted;
|
|
|
|
|
|
|
|
map.emplace(rand(), it, inserted);
|
|
|
|
if (inserted)
|
|
|
|
{
|
2013-01-09 12:06:21 +00:00
|
|
|
new(&it->second) Arr(n, DB::DontInitElemsTag());
|
2013-01-07 00:57:43 +00:00
|
|
|
|
|
|
|
for (size_t j = 0; j < n; ++j)
|
|
|
|
new (it->second.place(j)) T(field);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
std::cerr << std::fixed << std::setprecision(2)
|
|
|
|
<< "AutoArray. Elapsed: " << watch.elapsedSeconds()
|
|
|
|
<< " (" << map_size / watch.elapsedSeconds() << " rows/sec., "
|
|
|
|
<< "sizeof(Map::value_type) = " << sizeof(Map::value_type)
|
|
|
|
<< std::endl;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (argc == 2 && !strcmp(argv[1], "2"))
|
|
|
|
{
|
2016-05-28 10:35:44 +00:00
|
|
|
using Arr = std::vector<T>;
|
|
|
|
using Map = HashMap<UInt64, Arr>;
|
2013-01-07 00:57:43 +00:00
|
|
|
|
|
|
|
Stopwatch watch;
|
|
|
|
|
|
|
|
Map map;
|
|
|
|
for (size_t i = 0; i < map_size; ++i)
|
|
|
|
{
|
|
|
|
Map::iterator it;
|
|
|
|
bool inserted;
|
|
|
|
|
|
|
|
map.emplace(rand(), it, inserted);
|
|
|
|
if (inserted)
|
|
|
|
{
|
|
|
|
new(&it->second) Arr(n);
|
|
|
|
|
|
|
|
for (size_t j = 0; j < n; ++j)
|
|
|
|
it->second[j] = field;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
std::cerr << std::fixed << std::setprecision(2)
|
|
|
|
<< "Vector: Elapsed: " << watch.elapsedSeconds()
|
|
|
|
<< " (" << map_size / watch.elapsedSeconds() << " rows/sec., "
|
|
|
|
<< "sizeof(Map::value_type) = " << sizeof(Map::value_type)
|
|
|
|
<< std::endl;
|
|
|
|
}
|
|
|
|
|
2013-02-01 18:56:09 +00:00
|
|
|
{
|
|
|
|
size_t n = 10000;
|
2016-05-28 10:35:44 +00:00
|
|
|
using Arr = DB::AutoArray<std::string>;
|
2013-02-01 18:56:09 +00:00
|
|
|
Arr arr1(n);
|
|
|
|
Arr arr2(n);
|
|
|
|
|
|
|
|
for (size_t i = 0; i < n; ++i)
|
|
|
|
{
|
2013-06-21 20:34:19 +00:00
|
|
|
arr1[i] = "Hello, world! " + DB::toString(i);
|
|
|
|
arr2[i] = "Goodbye, world! " + DB::toString(i);
|
2013-02-01 18:56:09 +00:00
|
|
|
}
|
|
|
|
|
2014-03-26 14:45:50 +00:00
|
|
|
arr2 = std::move(arr1);
|
2013-02-01 18:56:09 +00:00
|
|
|
arr1.resize(n);
|
|
|
|
|
|
|
|
std::cerr
|
|
|
|
<< "arr1.size(): " << arr1.size() << ", arr2.size(): " << arr2.size() << std::endl
|
|
|
|
<< "&arr1[0]: " << &arr1[0] << ", &arr2[0]: " << &arr2[0] << std::endl
|
|
|
|
<< "arr1[0]: " << arr1[0] << ", arr2[0]: " << arr2[0] << std::endl;
|
|
|
|
}
|
|
|
|
|
2013-01-07 00:57:43 +00:00
|
|
|
return 0;
|
|
|
|
}
|