Сообщение Re: Разумность 16 байтных IP-адресов - ведь глупость сделали от 18.11.2024 8:18
Изменено 18.11.2024 8:21 ononim
Re: Разумность 16 байтных IP-адресов - ведь глупость сделали
Ну давай померяем ужасы, вот программка засекающая время выборки из std::set в котором содержатся 10000000 64битных или 128битных рандомных значений. Вектор значений которые искать надо содержит каждое 32е из исходных значений + в 8 раз больше рандомных значений которых нету в set-е. Время засекается точный таймером, на моей системе получилось 677 msec для 128битных значений и 643 msec для 64хбитных. Собирал gcc v 11.4.0 с -O2
#include <set>
#include <vector>
#include <time.h>
#include <stdio.h>
#include <stdlib.h>
#include <stdint.h>
#define USE128
static void randfill(void *p, size_t l)
{
for (;l >= 2; l-= 2) {
*(unsigned short *)p = rand();
p = (char *)p + 2;
}
for (;l >= 1; l--) {
*(unsigned char *)p = rand();
p = (char *)p + 1;
}
}
#ifdef USE128
struct Value
{
uint64_t v1;
uint64_t v2;
Value()
{
randfill(&v1, sizeof(v1));
randfill(&v2, sizeof(v2));
}
bool operator <(const Value &other) const
{
if (v1 != other.v1)
return v1 < other.v1;
return v2 < other.v2;
}
};
#else
struct Value
{
uint64_t v;
Value()
{
randfill(&v, sizeof(v));
}
bool operator <(const Value &other) const
{
return v < other.v;
}
};
#endif
int main(int argc, char **argv)
{
srand(123);
std::set<Value> values;
std::vector<Value> lookup;
// generating addresses out of time measurements scope
for (unsigned long i = 0; i < 10000000; ++i) {
auto ir = values.emplace();
if ((i % 32) == 0) {
lookup.emplace_back(*ir.first);
if ((i % 4) == 0) {
lookup.emplace_back();
}
}
}
unsigned long found = 0;
struct timespec ts1 = {0};
clock_gettime(CLOCK_MONOTONIC, &ts1);
for (const auto &v : lookup) {
if (values.find(v) != values.end()) {
found++;
}
}
struct timespec ts2 = {0};
clock_gettime(CLOCK_MONOTONIC, &ts2);
unsigned long msec = (unsigned long)((ts2.tv_sec - ts1.tv_sec) * 1000);
msec+= (unsigned long)(ts2.tv_nsec / 1000000);
msec-= (unsigned long)(ts1.tv_nsec / 1000000);
printf("found %lu time %lu msec\n", found, msec);
}
Re: Разумность 16 байтных IP-адресов - ведь глупость сделали
Ну давай померяем ужасы, вот программка засекающая время выборки из std::set в котором содержатся 10000000 64битных или 128битных рандомных значений. Вектор значений которые искать надо содержит каждое 32е из исходных значений + в 8 раз больше рандомных значений которых нету в set-е. Собирал gcc v 11.4.0 с -O2 Время засекается точным таймером, на моей системе получилось 677 msec для 128битных значений и 643 msec для 64хбитных. Пять процентов, Карл! И это без спецоптимизаций которые очень даже возможны и сделают разницу еще меньше.
#include <set>
#include <vector>
#include <time.h>
#include <stdio.h>
#include <stdlib.h>
#include <stdint.h>
#define USE128
static void randfill(void *p, size_t l)
{
for (;l >= 2; l-= 2) {
*(unsigned short *)p = rand();
p = (char *)p + 2;
}
for (;l >= 1; l--) {
*(unsigned char *)p = rand();
p = (char *)p + 1;
}
}
#ifdef USE128
struct Value
{
uint64_t v1;
uint64_t v2;
Value()
{
randfill(&v1, sizeof(v1));
randfill(&v2, sizeof(v2));
}
bool operator <(const Value &other) const
{
if (v1 != other.v1)
return v1 < other.v1;
return v2 < other.v2;
}
};
#else
struct Value
{
uint64_t v;
Value()
{
randfill(&v, sizeof(v));
}
bool operator <(const Value &other) const
{
return v < other.v;
}
};
#endif
int main(int argc, char **argv)
{
srand(123);
std::set<Value> values;
std::vector<Value> lookup;
// generating addresses out of time measurements scope
for (unsigned long i = 0; i < 10000000; ++i) {
auto ir = values.emplace();
if ((i % 32) == 0) {
lookup.emplace_back(*ir.first);
if ((i % 4) == 0) {
lookup.emplace_back();
}
}
}
unsigned long found = 0;
struct timespec ts1 = {0};
clock_gettime(CLOCK_MONOTONIC, &ts1);
for (const auto &v : lookup) {
if (values.find(v) != values.end()) {
found++;
}
}
struct timespec ts2 = {0};
clock_gettime(CLOCK_MONOTONIC, &ts2);
unsigned long msec = (unsigned long)((ts2.tv_sec - ts1.tv_sec) * 1000);
msec+= (unsigned long)(ts2.tv_nsec / 1000000);
msec-= (unsigned long)(ts1.tv_nsec / 1000000);
printf("found %lu time %lu msec\n", found, msec);
}