#include <array>
#include <cstdint>
#include <iostream>
#include <map>
#include <sys/time.h>
double GetCurrentTime()
{
timeval tv;
gettimeofday(&tv, NULL);
return double (tv.tv_sec) + 0.000001 * tv.tv_usec;
}
double GetCurrentTimeMs()
{
return 1000 * GetCurrentTime();
}
struct Key1 {
Key1(const std::array<uint8_t, 6> & inMAC, uint16_t inEtherType) :
mMAC(inMAC),
mEtherType(inEtherType)
{
}
union {
struct {
std::array<uint8_t, 6> mMAC;
uint16_t mEtherType;
};
uint64_t mValue;
};
friend bool operator==(const Key1 & lhs, const Key1 & rhs)
{ return lhs.mValue == rhs.mValue; }
friend bool operator<(const Key1 & lhs, const Key1 & rhs)
{ return lhs.mValue < rhs.mValue; }
};
typedef std::pair< std::array<uint8_t, 6>, uint16_t> Key2;
typedef std::array<uint8_t, 8> Key3;
//
// Key 1
//
Key1 key1(std::array<uint8_t, 6>(), 0);
void fill(std::map<Key1, int> & mapping)
{
mapping.insert(std::make_pair(key1, 0));
}
void find(std::map<Key1, int> & mapping)
{
mapping.find(key1);
}
//
// Key 2
//
Key2 key2 = Key2();
void fill(std::map<Key2, int> & mapping)
{
mapping.insert(std::make_pair(key2, 0));
}
void find(std::map<Key2, int> & mapping)
{
mapping.find(key2);
}
//
// Key 3
//
Key3 key3 = Key3();
void fill(std::map<Key3, int> & mapping)
{
mapping.insert(std::make_pair(key3, 0));
}
void find(std::map<Key3, int> & mapping)
{
mapping.find(key3);
}
template<typename Key>
void test()
{
std::map<Key, int> mapping;
fill(mapping);
auto begin = GetCurrentTime();
unsigned count = 0;
while (GetCurrentTime() - begin <= 1.0)
{
for (unsigned i = 0; i < 100000; ++i)
{
find(mapping);
count++;
}
}
std::cout << "Count: " << (count / 1000000) << "M in around 1 second." << std::endl;
}
int main()
{
test<Key1>();
test<Key2>();
test<Key3>();
}
CiNpbmNsdWRlIDxhcnJheT4KI2luY2x1ZGUgPGNzdGRpbnQ+CiNpbmNsdWRlIDxpb3N0cmVhbT4KI2luY2x1ZGUgPG1hcD4KI2luY2x1ZGUgPHN5cy90aW1lLmg+CgoKZG91YmxlIEdldEN1cnJlbnRUaW1lKCkKewogICAgdGltZXZhbCB0djsKICAgIGdldHRpbWVvZmRheSgmdHYsIE5VTEwpOwogICAgcmV0dXJuIGRvdWJsZSAodHYudHZfc2VjKSArIDAuMDAwMDAxICogdHYudHZfdXNlYzsKfQoKCmRvdWJsZSBHZXRDdXJyZW50VGltZU1zKCkKewogICAgcmV0dXJuIDEwMDAgKiBHZXRDdXJyZW50VGltZSgpOwp9CgoKc3RydWN0IEtleTEgewogICAgS2V5MShjb25zdCBzdGQ6OmFycmF5PHVpbnQ4X3QsIDY+ICYgaW5NQUMsIHVpbnQxNl90IGluRXRoZXJUeXBlKSA6CiAgICAgICAgbU1BQyhpbk1BQyksCiAgICAgICAgbUV0aGVyVHlwZShpbkV0aGVyVHlwZSkKICAgIHsKICAgIH0KCiAgICB1bmlvbiB7CiAgICAgICAgc3RydWN0IHsKICAgICAgICAgICAgc3RkOjphcnJheTx1aW50OF90LCA2PiBtTUFDOwogICAgICAgICAgICB1aW50MTZfdCBtRXRoZXJUeXBlOwogICAgICAgIH07CiAgICAgICAgdWludDY0X3QgbVZhbHVlOwogICAgfTsKCiAgICBmcmllbmQgYm9vbCBvcGVyYXRvcj09KGNvbnN0IEtleTEgJiBsaHMsIGNvbnN0IEtleTEgJiByaHMpCiAgICB7IHJldHVybiBsaHMubVZhbHVlID09IHJocy5tVmFsdWU7IH0KCiAgICBmcmllbmQgYm9vbCBvcGVyYXRvcjwoY29uc3QgS2V5MSAmIGxocywgY29uc3QgS2V5MSAmIHJocykKICAgIHsgcmV0dXJuIGxocy5tVmFsdWUgPCByaHMubVZhbHVlOyB9Cn07CgoKdHlwZWRlZiBzdGQ6OnBhaXI8IHN0ZDo6YXJyYXk8dWludDhfdCwgNj4sIHVpbnQxNl90PiBLZXkyOwp0eXBlZGVmIHN0ZDo6YXJyYXk8dWludDhfdCwgOD4gS2V5MzsKCgovLwovLyBLZXkgMQovLwpLZXkxIGtleTEoc3RkOjphcnJheTx1aW50OF90LCA2PigpLCAwKTsKdm9pZCBmaWxsKHN0ZDo6bWFwPEtleTEsIGludD4gJiBtYXBwaW5nKQp7CiAgICBtYXBwaW5nLmluc2VydChzdGQ6Om1ha2VfcGFpcihrZXkxLCAwKSk7Cn0KCnZvaWQgZmluZChzdGQ6Om1hcDxLZXkxLCBpbnQ+ICYgbWFwcGluZykKewogICAgbWFwcGluZy5maW5kKGtleTEpOwp9CgoKLy8KLy8gS2V5IDIKLy8KS2V5MiBrZXkyID0gS2V5MigpOwp2b2lkIGZpbGwoc3RkOjptYXA8S2V5MiwgaW50PiAmIG1hcHBpbmcpCnsKICAgIG1hcHBpbmcuaW5zZXJ0KHN0ZDo6bWFrZV9wYWlyKGtleTIsIDApKTsKfQoKdm9pZCBmaW5kKHN0ZDo6bWFwPEtleTIsIGludD4gJiBtYXBwaW5nKQp7CiAgICBtYXBwaW5nLmZpbmQoa2V5Mik7Cn0KCgovLwovLyBLZXkgMwovLwpLZXkzIGtleTMgPSBLZXkzKCk7CnZvaWQgZmlsbChzdGQ6Om1hcDxLZXkzLCBpbnQ+ICYgbWFwcGluZykKewogICAgbWFwcGluZy5pbnNlcnQoc3RkOjptYWtlX3BhaXIoa2V5MywgMCkpOwp9Cgp2b2lkIGZpbmQoc3RkOjptYXA8S2V5MywgaW50PiAmIG1hcHBpbmcpCnsKICAgIG1hcHBpbmcuZmluZChrZXkzKTsKfQoKCnRlbXBsYXRlPHR5cGVuYW1lIEtleT4Kdm9pZCB0ZXN0KCkKewogICAgc3RkOjptYXA8S2V5LCBpbnQ+IG1hcHBpbmc7CiAgICBmaWxsKG1hcHBpbmcpOwoKICAgIGF1dG8gYmVnaW4gPSBHZXRDdXJyZW50VGltZSgpOwogICAgdW5zaWduZWQgY291bnQgPSAwOwogICAgd2hpbGUgKEdldEN1cnJlbnRUaW1lKCkgLSBiZWdpbiA8PSAxLjApCiAgICB7CiAgICAgICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IDEwMDAwMDsgKytpKQogICAgICAgIHsKICAgICAgICAgICAgZmluZChtYXBwaW5nKTsKICAgICAgICAgICAgY291bnQrKzsKICAgICAgICB9CiAgICB9CgogICAgc3RkOjpjb3V0IDw8ICJDb3VudDogIiA8PCAoY291bnQgLyAxMDAwMDAwKSA8PCAiTSBpbiBhcm91bmQgMSBzZWNvbmQuIiA8PCBzdGQ6OmVuZGw7Cn0KCgppbnQgbWFpbigpCnsKICAgIHRlc3Q8S2V5MT4oKTsKICAgIHRlc3Q8S2V5Mj4oKTsKICAgIHRlc3Q8S2V5Mz4oKTsKfQo=