#define BENCH_NR_ITERS 100 /* number of times to run gathering statistics */
staticvoid gen_test_ips(union tcp_addr *ips, size_t ips_nr, bool use_rand)
{ union tcp_addr net = {};
size_t i, j;
if (inet_pton(TEST_FAMILY, TEST_NETWORK, &net) != 1)
test_error("Can't convert ip address %s", TEST_NETWORK);
if (!use_rand) { for (i = 0; i < ips_nr; i++)
ips[i] = gen_tcp_addr(net, 2 * i + 1); return;
} for (i = 0; i < ips_nr; i++) {
size_t r = (size_t)random() | 0x1;
ips[i] = gen_tcp_addr(net, r);
for (j = i - 1; j > 0 && i > 0; j--) { if (!memcmp(&ips[i], &ips[j], sizeof(union tcp_addr))) {
i--; /* collision */ break;
}
}
}
}
/* Remove the first added */
p = (union tcp_addr *)&ips[0];
tcp_addr_to_sockaddr_in(&ao_del.addr, p, 0);
for (i = 0; i < BENCH_NR_ITERS; i++) {
measure_call(del, delete_mkt, lsk, (void *)&ao_del);
/* Restore it back */
measure_call(add, add_back_mkt, lsk, (void *)p);
/* * Slowest for FILO-linked-list: * on (i) iteration removing ips[i] element. When it gets * added to the list back - it becomes first to fetch, so * on (i + 1) iteration go to ips[i + 1] element.
*/ if (rand_order)
p = (union tcp_addr *)&ips[rand() % ips_nr]; else
p = (union tcp_addr *)&ips[i % ips_nr];
tcp_addr_to_sockaddr_in(&ao_del.addr, p, 0);
}
}
/* The worst case for FILO-list */
bench_delete(lsk, &bt->add_key, &bt->delete_last_key,
test_ips, nr_keys[i], false, false);
test_print_stats("Add a new key",
nr_keys[i], &bt->add_key);
test_print_stats("Delete: worst case",
nr_keys[i], &bt->delete_last_key);
ret = ip_addr_add(veth_name, TEST_FAMILY, taddr, TEST_PREFIX); if (ret && ret != -EEXIST)
test_error("Failed to add ip address");
ret = ip_route_add(veth_name, TEST_FAMILY, taddr, this_ip_dest); if (ret && ret != -EEXIST)
test_error("Failed to add route");
if (bind(sk, &addr, sizeof(addr)))
test_error("bind()");
}
/* * Slowest for FILO-linked-list: * on (i) iteration removing ips[i] element. When it gets * added to the list back - it becomes first to fetch, so * on (i + 1) iteration go to ips[i + 1] element.
*/ if (rand_order)
p = (union tcp_addr *)&ips[rand() % ips_nr]; else
p = (union tcp_addr *)&ips[i % ips_nr];
}
}
staticvoid *client_fn(void *arg)
{
size_t i;
for (i = 0; i < ARRAY_SIZE(nr_keys); i++) { struct bench_tests *bt = &bench_results[i];
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.