summaryrefslogtreecommitdiffstats
path: root/vppinfra/vppinfra/test_bihash_template.c
diff options
context:
space:
mode:
authorDamjan Marion <damarion@cisco.com>2016-12-19 23:05:39 +0100
committerDamjan Marion <damarion@cisco.com>2016-12-28 12:25:14 +0100
commit7cd468a3d7dee7d6c92f69a0bb7061ae208ec727 (patch)
tree5de62f8dbd3a752f5a676ca600e43d2652d1ff1a /vppinfra/vppinfra/test_bihash_template.c
parent696f1adec0df3b8f161862566dd9c86174302658 (diff)
Reorganize source tree to use single autotools instance
Change-Id: I7b51f88292e057c6443b12224486f2d0c9f8ae23 Signed-off-by: Damjan Marion <damarion@cisco.com>
Diffstat (limited to 'vppinfra/vppinfra/test_bihash_template.c')
-rw-r--r--vppinfra/vppinfra/test_bihash_template.c297
1 files changed, 0 insertions, 297 deletions
diff --git a/vppinfra/vppinfra/test_bihash_template.c b/vppinfra/vppinfra/test_bihash_template.c
deleted file mode 100644
index c505bd83d9a..00000000000
--- a/vppinfra/vppinfra/test_bihash_template.c
+++ /dev/null
@@ -1,297 +0,0 @@
-/*
- * Copyright (c) 2015 Cisco and/or its affiliates.
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at:
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-#include <vppinfra/time.h>
-#include <vppinfra/cache.h>
-#include <vppinfra/error.h>
-
-#include <vppinfra/bihash_8_8.h>
-#include <vppinfra/bihash_template.h>
-
-#include <vppinfra/bihash_template.c>
-
-typedef struct
-{
- u64 seed;
- u32 nbuckets;
- u32 nitems;
- u32 search_iter;
- int careful_delete_tests;
- int verbose;
- int non_random_keys;
- uword *key_hash;
- u64 *keys;
- BVT (clib_bihash) hash;
- clib_time_t clib_time;
-
- unformat_input_t *input;
-
-} test_main_t;
-
-test_main_t test_main;
-
-uword
-vl (void *v)
-{
- return vec_len (v);
-}
-
-static clib_error_t *
-test_bihash (test_main_t * tm)
-{
- int i, j;
- uword *p;
- uword total_searches;
- f64 before, delta;
- BVT (clib_bihash) * h;
- BVT (clib_bihash_kv) kv;
-
- h = &tm->hash;
-
- BV (clib_bihash_init) (h, "test", tm->nbuckets, 3ULL << 30);
-
- fformat (stdout, "Pick %lld unique %s keys...\n",
- tm->nitems, tm->non_random_keys ? "non-random" : "random");
-
- for (i = 0; i < tm->nitems; i++)
- {
- u64 rndkey;
-
- if (tm->non_random_keys == 0)
- {
-
- again:
- rndkey = random_u64 (&tm->seed);
-
- p = hash_get (tm->key_hash, rndkey);
- if (p)
- goto again;
- }
- else
- rndkey = (u64) (i + 1) << 16;
-
- hash_set (tm->key_hash, rndkey, i + 1);
- vec_add1 (tm->keys, rndkey);
- }
-
- fformat (stdout, "Add items...\n");
- for (i = 0; i < tm->nitems; i++)
- {
- kv.key = tm->keys[i];
- kv.value = i + 1;
-
- BV (clib_bihash_add_del) (h, &kv, 1 /* is_add */ );
-
- if (tm->verbose > 1)
- {
- fformat (stdout, "--------------------\n");
- fformat (stdout, "After adding key %llu value %lld...\n",
- tm->keys[i], (u64) (i + 1));
- fformat (stdout, "%U", BV (format_bihash), h,
- 2 /* very verbose */ );
- }
- }
-
- fformat (stdout, "%U", BV (format_bihash), h, 0 /* very verbose */ );
-
- fformat (stdout, "Search for items %d times...\n", tm->search_iter);
-
- before = clib_time_now (&tm->clib_time);
-
- for (j = 0; j < tm->search_iter; j++)
- {
- u64 hash1 = clib_xxhash (tm->keys[0]);
-
- for (i = 0; i < tm->nitems; i++)
- {
- if (i < (tm->nitems - 3))
- {
- clib_bihash_bucket_t *b;
- BVT (clib_bihash_value) * v;
- u64 hash2 = clib_xxhash (tm->keys[i + 3]);
- u32 bucket_index = hash2 & (h->nbuckets - 1);
- b = &h->buckets[bucket_index];
- CLIB_PREFETCH (b, CLIB_CACHE_LINE_BYTES, LOAD);
-
- bucket_index = hash1 & (h->nbuckets - 1);
- b = &h->buckets[bucket_index];
- v = BV (clib_bihash_get_value) (h, b->offset);
- hash1 >>= h->log2_nbuckets;
- hash1 = hash1 & ((1 << b->log2_pages) - 1);
- v += hash1;
- CLIB_PREFETCH (v, CLIB_CACHE_LINE_BYTES, LOAD);
-
- hash1 = hash2;
- }
-
- kv.key = tm->keys[i];
- if (BV (clib_bihash_search) (h, &kv, &kv) < 0)
- clib_warning ("search for key %lld failed unexpectedly\n",
- tm->keys[i]);
- if (kv.value != (u64) (i + 1))
- clib_warning ("search for key %lld returned %lld, not %lld\n",
- tm->keys, kv.value, (u64) (i + 1));
- }
- }
-
- delta = clib_time_now (&tm->clib_time) - before;
- total_searches = (uword) tm->search_iter * (uword) tm->nitems;
-
- if (delta > 0)
- fformat (stdout, "%.f searches per second\n",
- ((f64) total_searches) / delta);
-
- fformat (stdout, "%lld searches in %.6f seconds\n", total_searches, delta);
-
- fformat (stdout, "Standard E-hash search for items %d times...\n",
- tm->search_iter);
-
- before = clib_time_now (&tm->clib_time);
-
- for (j = 0; j < tm->search_iter; j++)
- {
- for (i = 0; i < tm->nitems; i++)
- {
- p = hash_get (tm->key_hash, tm->keys[i]);
- if (p == 0 || p[0] != (uword) (i + 1))
- clib_warning ("ugh, couldn't find %lld\n", tm->keys[i]);
- }
- }
-
- delta = clib_time_now (&tm->clib_time) - before;
- total_searches = (uword) tm->search_iter * (uword) tm->nitems;
-
- fformat (stdout, "%lld searches in %.6f seconds\n", total_searches, delta);
-
- if (delta > 0)
- fformat (stdout, "%.f searches per second\n",
- ((f64) total_searches) / delta);
-
- fformat (stdout, "Delete items...\n");
-
- for (i = 0; i < tm->nitems; i++)
- {
- int j;
- int rv;
-
- kv.key = tm->keys[i];
- kv.value = (u64) (i + 1);
- rv = BV (clib_bihash_add_del) (h, &kv, 0 /* is_add */ );
-
- if (rv < 0)
- clib_warning ("delete key %lld not ok but should be", tm->keys[i]);
-
- if (tm->careful_delete_tests)
- {
- for (j = 0; j < tm->nitems; j++)
- {
- kv.key = tm->keys[j];
- rv = BV (clib_bihash_search) (h, &kv, &kv);
- if (j <= i && rv >= 0)
- {
- clib_warning
- ("i %d j %d search ok but should not be, value %lld",
- i, j, kv.value);
- }
- if (j > i && rv < 0)
- {
- clib_warning ("i %d j %d search not ok but should be",
- i, j);
- }
- }
- }
- }
-
- fformat (stdout, "After deletions, should be empty...\n");
-
- fformat (stdout, "%U", BV (format_bihash), h, 0 /* very verbose */ );
- return 0;
-}
-
-clib_error_t *
-test_bihash_main (test_main_t * tm)
-{
- unformat_input_t *i = tm->input;
- clib_error_t *error;
-
- while (unformat_check_input (i) != UNFORMAT_END_OF_INPUT)
- {
- if (unformat (i, "seed %u", &tm->seed))
- ;
-
- else if (unformat (i, "nbuckets %d", &tm->nbuckets))
- ;
- else if (unformat (i, "non-random-keys"))
- tm->non_random_keys = 1;
- else if (unformat (i, "nitems %d", &tm->nitems))
- ;
- else if (unformat (i, "careful %d", &tm->careful_delete_tests))
- ;
- else if (unformat (i, "verbose %d", &tm->verbose))
- ;
- else if (unformat (i, "search %d", &tm->search_iter))
- ;
- else if (unformat (i, "verbose"))
- tm->verbose = 1;
- else
- return clib_error_return (0, "unknown input '%U'",
- format_unformat_error, i);
- }
-
- error = test_bihash (tm);
-
- return error;
-}
-
-#ifdef CLIB_UNIX
-int
-main (int argc, char *argv[])
-{
- unformat_input_t i;
- clib_error_t *error;
- test_main_t *tm = &test_main;
-
- clib_mem_init (0, 3ULL << 30);
-
- tm->input = &i;
- tm->seed = 0xdeaddabe;
-
- tm->nbuckets = 2;
- tm->nitems = 5;
- tm->verbose = 1;
- tm->search_iter = 1;
- tm->careful_delete_tests = 0;
- tm->key_hash = hash_create (0, sizeof (uword));
- clib_time_init (&tm->clib_time);
-
- unformat_init_command_line (&i, argv);
- error = test_bihash_main (tm);
- unformat_free (&i);
-
- if (error)
- {
- clib_error_report (error);
- return 1;
- }
- return 0;
-}
-#endif /* CLIB_UNIX */
-
-/*
- * fd.io coding-style-patch-verification: ON
- *
- * Local Variables:
- * eval: (c-set-style "gnu")
- * End:
- */