Информация об изменениях

Сообщение 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);
}