Subversion Repositories HelenOS

Rev

Rev 2450 | Go to most recent revision | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 2450 Rev 2461
Line 27... Line 27...
27
 */
27
 */
28
 
28
 
29
#include <test.h>
29
#include <test.h>
30
#include <print.h>
30
#include <print.h>
31
#include <adt/avl.h>
31
#include <adt/avl.h>
-
 
32
#include <adt/favl.h>
32
#include <adt/extavl.h>
33
#include <adt/extavl.h>
33
#include <adt/extavlrel.h>
34
#include <adt/extavlrel.h>
34
#include <debug.h>
35
#include <debug.h>
35
#include <arch/types.h>
36
#include <arch/types.h>
36
#include <arch/cycle.h>
37
#include <arch/cycle.h>
Line 50... Line 51...
50
 
51
 
51
/*
52
/*
52
 * Wrapper tree data structures.
53
 * Wrapper tree data structures.
53
 */
54
 */
54
static avltree_t avltree;
55
static avltree_t avltree;
-
 
56
static favltree_t favltree;
55
static extavltree_t extavltree;
57
static extavltree_t extavltree;
56
static extavlreltree_t extavlreltree;
58
static extavlreltree_t extavlreltree;
57
 
59
 
58
/*
60
/*
59
 * Slab cache variables.
61
 * Slab cache variables.
60
 */
62
 */
61
static slab_cache_t *avl_slab;
63
static slab_cache_t *avl_slab;
-
 
64
static slab_cache_t *favl_slab;
62
static slab_cache_t *extavl_slab;
65
static slab_cache_t *extavl_slab;
63
static slab_cache_t *extavlrel_slab;
66
static slab_cache_t *extavlrel_slab;
64
 
67
 
65
/*
68
/*
66
 * Head of free nodes' list:
69
 * Head of free nodes' list:
67
 */
70
 */
68
static avltree_node_t *avl_ffn = NULL;
71
static avltree_node_t *avl_ffn = NULL;
-
 
72
static favltree_node_t *favl_ffn = NULL;
69
static extavltree_node_t *extavl_ffn = NULL;
73
static extavltree_node_t *extavl_ffn = NULL;
70
static extavlreltree_node_t *extavlrel_ffn = NULL;
74
static extavlreltree_node_t *extavlrel_ffn = NULL;
71
 
75
 
72
 
76
 
73
static void keys_prepare(int node_count, int type)
77
static void keys_prepare(int node_count, int type)
74
{
78
{
75
    unsigned int i;
79
    unsigned int i;
76
    uint16_t s;
80
    uint16_t s;
77
    avltree_node_t *a = avl_ffn;
81
    avltree_node_t *a = avl_ffn;
-
 
82
    favltree_node_t *b = favl_ffn;
78
    extavltree_node_t *b = extavl_ffn;
83
    extavltree_node_t *c = extavl_ffn;
79
    extavlreltree_node_t *c = extavlrel_ffn;
84
    extavlreltree_node_t *d = extavlrel_ffn;
80
   
85
   
81
    switch (type) {
86
    switch (type) {
82
        case 0:
87
        case 0:
83
            s = (uint16_t) get_cycle();
88
            s = (uint16_t) get_cycle();
84
            for (i = 0; i < node_count; i++) {
89
            for (i = 0; i < node_count; i++) {
85
                a->key = s;
90
                a->key = s;
86
                b->key = s;
91
                b->key = s;
87
                c->key = s;
92
                c->key = s;
-
 
93
                d->key = s;
88
                s += GEN_NUM;
94
                s += GEN_NUM;
89
                a = a->par;
95
                a = a->par;
90
                b = b->par;
96
                b = b->par;
91
                c = c->par;
97
                c = c->par;
-
 
98
                d = d->par;
92
            }
99
            }
93
            break;
100
            break;
94
        case 1:
101
        case 1:
95
            for (i = 1; i <= node_count; i++) {
102
            for (i = 1; i <= node_count; i++) {
96
                a->key = i;
103
                a->key = i;
97
                b->key = i;
104
                b->key = i;
98
                c->key = i;
105
                c->key = i;
-
 
106
                d->key = i;
99
                a = a->par;
107
                a = a->par;
100
                b = b->par;
108
                b = b->par;
101
                c = c->par;
109
                c = c->par;
-
 
110
                d = d->par;
102
            }
111
            }
103
            break;
112
            break;
104
        case 2:
113
        case 2:
105
            for (i = node_count; i > 0; i--) {
114
            for (i = node_count; i > 0; i--) {
106
                a->key = i;
115
                a->key = i;
107
                b->key = i;
116
                b->key = i;
108
                c->key = i;
117
                c->key = i;
-
 
118
                d->key = i;
109
                a = a->par;
119
                a = a->par;
110
                b = b->par;
120
                b = b->par;
-
 
121
                c = c->par;
111
                c = c->par;        
122
                d = d->par;        
112
            }
123
            }
113
            break;
124
            break;
114
    }
125
    }
115
}
126
}
116
 
127
 
Line 119... Line 130...
119
{
130
{
120
    int i;
131
    int i;
121
    avltree_node_t *a;
132
    avltree_node_t *a;
122
    extavltree_node_t *b;
133
    extavltree_node_t *b;
123
    extavlreltree_node_t *c;
134
    extavlreltree_node_t *c;
-
 
135
    favltree_node_t *d;
124
   
136
   
125
    avl_ffn = NULL;
137
    avl_ffn = NULL;
-
 
138
    favl_ffn = NULL;
126
    extavl_ffn = NULL;
139
    extavl_ffn = NULL;
127
    extavlrel_ffn = NULL;
140
    extavlrel_ffn = NULL;
128
 
141
 
129
    for (i = 0; i < node_count; i++) {
142
    for (i = 0; i < node_count; i++) {
130
        a = (avltree_node_t *) slab_alloc(avl_slab,0);
143
        a = (avltree_node_t *) slab_alloc(avl_slab,0);
Line 140... Line 153...
140
        c = (extavlreltree_node_t *) slab_alloc(extavlrel_slab,0);
153
        c = (extavlreltree_node_t *) slab_alloc(extavlrel_slab,0);
141
        if (!c) {
154
        if (!c) {
142
            printf("Not enough memory to allocate test arrays.");
155
            printf("Not enough memory to allocate test arrays.");
143
            return false;
156
            return false;
144
        }
157
        }
-
 
158
        d = (favltree_node_t *) slab_alloc(favl_slab,0);
-
 
159
        if (!d) {
-
 
160
            printf("Not enough memory to allocate test arrays.");
-
 
161
            return false;
-
 
162
        }
145
        a->par = avl_ffn;
163
        a->par = avl_ffn;
146
        b->par = extavl_ffn;
164
        b->par = extavl_ffn;
147
        c->par = extavlrel_ffn;
165
        c->par = extavlrel_ffn;
-
 
166
        d->par = favl_ffn;
148
        avl_ffn = a;
167
        avl_ffn = a;
149
        extavl_ffn = b;
168
        extavl_ffn = b;
150
        extavlrel_ffn = c;
169
        extavlrel_ffn = c;
-
 
170
        favl_ffn = d;
151
    }
171
    }
152
    return true;
172
    return true;
153
}
173
}
154
 
174
 
155
static void free_nodes(int node_count)
175
static void free_nodes(int node_count)
156
{
176
{
157
    int i;
177
    int i;
158
    avltree_node_t *a;
178
    avltree_node_t *a;
159
    extavltree_node_t *b;
179
    extavltree_node_t *b;
160
    extavlreltree_node_t *c;
180
    extavlreltree_node_t *c;
-
 
181
    favltree_node_t *d;
161
   
182
   
162
    for (i = 0; i < node_count; i++) {
183
    for (i = 0; i < node_count; i++) {
163
        a = avl_ffn;
184
        a = avl_ffn;
164
        b = extavl_ffn;
185
        b = extavl_ffn;
165
        c = extavlrel_ffn;
186
        c = extavlrel_ffn;
-
 
187
        d = favl_ffn;
166
        if (!a || !b || !c) {
188
        if (!a || !b || !c || !d) {
167
            printf("Deleted nodes: %d, node count: %d, a: %p, b: %p,c: %p ",i,node_count,a,b,c);
189
            printf("Deleted nodes: %d, node count: %d, a: %p, b: %p, c: %p, d: %p\n",
-
 
190
                    i,node_count,a,b,c,d);
168
            panic("Some nodes have been lost!");
191
            panic("Some nodes have been lost!");
169
        }
192
        }
170
        avl_ffn = avl_ffn->par;
193
        avl_ffn = avl_ffn->par;
171
        extavl_ffn = extavl_ffn->par;
194
        extavl_ffn = extavl_ffn->par;
172
        extavlrel_ffn = extavlrel_ffn->par;
195
        extavlrel_ffn = extavlrel_ffn->par;
-
 
196
        favl_ffn = favl_ffn->par;
173
        slab_free(avl_slab,a);
197
        slab_free(avl_slab,a);
174
        slab_free(extavl_slab,b);
198
        slab_free(extavl_slab,b);
175
        slab_free(extavlrel_slab,c);
199
        slab_free(extavlrel_slab,c);
-
 
200
        slab_free(favl_slab,d);
176
    }
201
    }
177
}
202
}
178
 
203
 
179
static avltree_node_t *alloc_avltree_node(void)
204
static avltree_node_t *alloc_avltree_node(void)
180
{
205
{
Line 184... Line 209...
184
    avl_ffn = avl_ffn->par;
209
    avl_ffn = avl_ffn->par;
185
 
210
 
186
    return node;
211
    return node;
187
}
212
}
188
 
213
 
-
 
214
static favltree_node_t *alloc_favltree_node(void)
-
 
215
{
-
 
216
    favltree_node_t *node;
-
 
217
 
-
 
218
    node = favl_ffn;
-
 
219
    favl_ffn = favl_ffn->par;
-
 
220
 
-
 
221
    return node;
-
 
222
}
-
 
223
 
189
static extavltree_node_t *alloc_extavltree_node(void)
224
static extavltree_node_t *alloc_extavltree_node(void)
190
{
225
{
191
    extavltree_node_t *node;
226
    extavltree_node_t *node;
192
 
227
 
193
    node = extavl_ffn;
228
    node = extavl_ffn;
Line 211... Line 246...
211
{
246
{
212
    node->par = avl_ffn;
247
    node->par = avl_ffn;
213
    avl_ffn = node;
248
    avl_ffn = node;
214
}
249
}
215
 
250
 
-
 
251
static void free_favltree_node(favltree_node_t *node)
-
 
252
{
-
 
253
    node->par = favl_ffn;
-
 
254
    favl_ffn = node;
-
 
255
}
-
 
256
 
216
static void free_extavltree_node(extavltree_node_t *node)
257
static void free_extavltree_node(extavltree_node_t *node)
217
{
258
{
218
    node->par = extavl_ffn;
259
    node->par = extavl_ffn;
219
    extavl_ffn = node;
260
    extavl_ffn = node;
220
}
261
}
Line 227... Line 268...
227
 
268
 
228
/** Insert keys of ascending sequence and delete tree deleting root nodes.
269
/** Insert keys of ascending sequence and delete tree deleting root nodes.
229
 */
270
 */
230
static void test1(void)
271
static void test1(void)
231
{
272
{
232
    uint64_t s[3][TEST_COUNT],f[3][TEST_COUNT];
273
    uint64_t s[4][TEST_COUNT],f[4][TEST_COUNT];
233
    uint64_t ds[3][TEST_COUNT],df[3][TEST_COUNT];
274
    uint64_t ds[4][TEST_COUNT],df[4][TEST_COUNT];
234
    unsigned int i,ii;
275
    unsigned int i,ii;
235
    avltree_node_t *a;
276
    avltree_node_t *a;
236
    extavltree_node_t *b;
277
    extavltree_node_t *b;
237
    extavlreltree_node_t *c;
278
    extavlreltree_node_t *c;
-
 
279
    favltree_node_t *d;
238
   
280
   
239
   
281
   
240
    printf("INSERT nodes with keys of ascending sequence.\n");
282
    printf("INSERT nodes with keys of ascending sequence.\n");
241
    printf("Nodes:\t\t");
283
    printf("Nodes:\t\t");
242
    for (ii = 0; ii < TEST_COUNT; ii++) {
284
    for (ii = 0; ii < TEST_COUNT; ii++) {
Line 309... Line 351...
309
            extavlreltree_delete(&extavlreltree,c);
351
            extavlreltree_delete(&extavlreltree,c);
310
            free_extavlreltree_node(c);
352
            free_extavlreltree_node(c);
311
        }
353
        }
312
           
354
           
313
        df[2][ii] = get_cycle();
355
        df[2][ii] = get_cycle();
-
 
356
 
-
 
357
        /*
-
 
358
         * FAVL INSERT
-
 
359
         */
-
 
360
        s[3][ii] = get_cycle();
-
 
361
       
-
 
362
        favltree_create(&favltree);
-
 
363
        for (i = 0; i < node_count[ii]; i++) {
-
 
364
            favltree_insert(&favltree,alloc_favltree_node());
-
 
365
        }
-
 
366
           
-
 
367
        f[3][ii] = get_cycle();
-
 
368
        /*
-
 
369
         * FAVL DELETE
-
 
370
         */
-
 
371
        ds[3][ii] = get_cycle();
-
 
372
       
-
 
373
        while ((d = favltree.root) != NULL) {
-
 
374
            favltree_delete(&favltree,d);
-
 
375
            free_favltree_node(d);
-
 
376
        }
-
 
377
           
-
 
378
        df[3][ii] = get_cycle();
314
    }
379
    }
315
    printf("\n----------------------------------------------------------------------------");  
380
    printf("\n----------------------------------------------------------------------------");  
316
    printf("\nAVL\t\t");
381
    printf("\nAVL\t\t");
317
    for (ii = 0; ii < TEST_COUNT; ii++)
382
    for (ii = 0; ii < TEST_COUNT; ii++)
318
        printf("%20llu",f[0][ii]-s[0][ii]);
383
        printf("%20llu",f[0][ii]-s[0][ii]);
-
 
384
    printf("\nFAVL\t\t");
-
 
385
    for (ii = 0; ii < TEST_COUNT; ii++)
-
 
386
        printf("%20llu",f[3][ii]-s[3][ii]);
319
    printf("\nExtAVL\t\t");
387
    printf("\nExtAVL\t\t");
320
    for (ii = 0; ii < TEST_COUNT; ii++)
388
    for (ii = 0; ii < TEST_COUNT; ii++)
321
        printf("%20llu",f[1][ii]-s[1][ii]);
389
        printf("%20llu",f[1][ii]-s[1][ii]);
322
    printf("\nExtAVLrel\t");
390
    printf("\nExtAVLrel\t");
323
    for (ii = 0; ii < TEST_COUNT; ii++)
391
    for (ii = 0; ii < TEST_COUNT; ii++)
Line 330... Line 398...
330
        printf("%20u",node_count[ii]);
398
        printf("%20u",node_count[ii]);
331
    printf("\n----------------------------------------------------------------------------");  
399
    printf("\n----------------------------------------------------------------------------");  
332
    printf("\nAVL\t\t");
400
    printf("\nAVL\t\t");
333
    for (ii = 0; ii < TEST_COUNT; ii++)
401
    for (ii = 0; ii < TEST_COUNT; ii++)
334
        printf("%20llu",df[0][ii]-ds[0][ii]);
402
        printf("%20llu",df[0][ii]-ds[0][ii]);
-
 
403
    printf("\nAVL\t\t");
-
 
404
    for (ii = 0; ii < TEST_COUNT; ii++)
-
 
405
        printf("%20llu",df[3][ii]-ds[3][ii]);
335
    printf("\nExtAVL\t\t");
406
    printf("\nExtAVL\t\t");
336
    for (ii = 0; ii < TEST_COUNT; ii++)
407
    for (ii = 0; ii < TEST_COUNT; ii++)
337
        printf("%20llu",df[1][ii]-ds[1][ii]);
408
        printf("%20llu",df[1][ii]-ds[1][ii]);
338
    printf("\nExtAVLrel\t");
409
    printf("\nExtAVLrel\t");
339
    for (ii = 0; ii < TEST_COUNT; ii++)
410
    for (ii = 0; ii < TEST_COUNT; ii++)
Line 344... Line 415...
344
 
415
 
345
/** Insert keys of ascending sequence and delete tree with delete_min functions.
416
/** Insert keys of ascending sequence and delete tree with delete_min functions.
346
 */
417
 */
347
static void test2(void)
418
static void test2(void)
348
{
419
{
349
    uint64_t s[3][TEST_COUNT],f[3][TEST_COUNT];
420
    uint64_t s[4][TEST_COUNT],f[4][TEST_COUNT];
350
    uint64_t ds[3][TEST_COUNT],df[3][TEST_COUNT];
421
    uint64_t ds[4][TEST_COUNT],df[4][TEST_COUNT];
351
    unsigned int i,ii;
422
    unsigned int i,ii;
352
    avltree_node_t *a;
423
    avltree_node_t *a;
353
    extavltree_node_t *b;
424
    extavltree_node_t *b;
354
    extavlreltree_node_t *c;
425
    extavlreltree_node_t *c;
-
 
426
    favltree_node_t *d;
355
 
427
 
356
 
428
 
357
    printf("INSERT nodes with keys of descending sequence.\n");
429
    printf("INSERT nodes with keys of descending sequence.\n");
358
    printf("Nodes:\t\t");
430
    printf("Nodes:\t\t");
359
    for (ii = 0; ii < TEST_COUNT; ii++) {
431
    for (ii = 0; ii < TEST_COUNT; ii++) {
Line 428... Line 500...
428
            extavlreltree_delete_min(&extavlreltree);
500
            extavlreltree_delete_min(&extavlreltree);
429
            free_extavlreltree_node(c);
501
            free_extavlreltree_node(c);
430
        }
502
        }
431
           
503
           
432
        df[2][ii] = get_cycle();
504
        df[2][ii] = get_cycle();
-
 
505
 
-
 
506
        /*
-
 
507
         * FAVL INSERT
-
 
508
         */
-
 
509
        s[3][ii] = get_cycle();
-
 
510
       
-
 
511
        favltree_create(&favltree);
-
 
512
        for (i = 0; i < node_count[ii]; i++) {
-
 
513
            favltree_insert(&favltree,alloc_favltree_node());
-
 
514
        }
-
 
515
           
-
 
516
        f[3][ii] = get_cycle();
-
 
517
        /*
-
 
518
         * AVL DELETE
-
 
519
         */
-
 
520
        ds[3][ii] = get_cycle();
-
 
521
       
-
 
522
        while (favltree.root != NULL) {
-
 
523
            d = favltree_find_min(&favltree);
-
 
524
            favltree_delete_min(&favltree);
-
 
525
            free_favltree_node(d);
-
 
526
        }
-
 
527
           
-
 
528
        df[3][ii] = get_cycle();
-
 
529
 
433
    }
530
    }
434
    printf("\n----------------------------------------------------------------------------");  
531
    printf("\n----------------------------------------------------------------------------");  
435
    printf("\nAVL\t\t");
532
    printf("\nAVL\t\t");
436
    for (ii = 0; ii < TEST_COUNT; ii++)
533
    for (ii = 0; ii < TEST_COUNT; ii++)
437
        printf("%20llu",f[0][ii]-s[0][ii]);
534
        printf("%20llu",f[0][ii]-s[0][ii]);
-
 
535
    printf("\nFAVL\t\t");
-
 
536
    for (ii = 0; ii < TEST_COUNT; ii++)
-
 
537
        printf("%20llu",f[3][ii]-s[3][ii]);
438
    printf("\nExtAVL\t\t");
538
    printf("\nExtAVL\t\t");
439
    for (ii = 0; ii < TEST_COUNT; ii++)
539
    for (ii = 0; ii < TEST_COUNT; ii++)
440
        printf("%20llu",f[1][ii]-s[1][ii]);
540
        printf("%20llu",f[1][ii]-s[1][ii]);
441
    printf("\nExtAVLrel\t");
541
    printf("\nExtAVLrel\t");
442
    for (ii = 0; ii < TEST_COUNT; ii++)
542
    for (ii = 0; ii < TEST_COUNT; ii++)
Line 449... Line 549...
449
        printf("%20u",node_count[ii]);
549
        printf("%20u",node_count[ii]);
450
    printf("\n----------------------------------------------------------------------------");  
550
    printf("\n----------------------------------------------------------------------------");  
451
    printf("\nAVL\t\t");
551
    printf("\nAVL\t\t");
452
    for (ii = 0; ii < TEST_COUNT; ii++)
552
    for (ii = 0; ii < TEST_COUNT; ii++)
453
        printf("%20llu",df[0][ii]-ds[0][ii]);
553
        printf("%20llu",df[0][ii]-ds[0][ii]);
-
 
554
    printf("\nFAVL\t\t");
-
 
555
    for (ii = 0; ii < TEST_COUNT; ii++)
-
 
556
        printf("%20llu",df[3][ii]-ds[3][ii]);
454
    printf("\nExtAVL\t\t");
557
    printf("\nExtAVL\t\t");
455
    for (ii = 0; ii < TEST_COUNT; ii++)
558
    for (ii = 0; ii < TEST_COUNT; ii++)
456
        printf("%20llu",df[1][ii]-ds[1][ii]);
559
        printf("%20llu",df[1][ii]-ds[1][ii]);
457
    printf("\nExtAVLrel\t");
560
    printf("\nExtAVLrel\t");
458
    for (ii = 0; ii < TEST_COUNT; ii++)
561
    for (ii = 0; ii < TEST_COUNT; ii++)
Line 463... Line 566...
463
 
566
 
464
/** Insert keys of random sequence and delete tree with delete_min functions.
567
/** Insert keys of random sequence and delete tree with delete_min functions.
465
 */
568
 */
466
static void test3(void)
569
static void test3(void)
467
{
570
{
468
    uint64_t s[3][TEST_COUNT],f[3][TEST_COUNT];
571
    uint64_t s[4][TEST_COUNT],f[4][TEST_COUNT];
469
    uint64_t ds[3][TEST_COUNT],df[3][TEST_COUNT];
572
    uint64_t ds[4][TEST_COUNT],df[4][TEST_COUNT];
470
    unsigned int i,ii;
573
    unsigned int i,ii;
471
    avltree_node_t *a;
574
    avltree_node_t *a;
472
    extavltree_node_t *b;
575
    extavltree_node_t *b;
473
    extavlreltree_node_t *c;
576
    extavlreltree_node_t *c;
-
 
577
    favltree_node_t *d;
474
 
578
 
475
   
579
   
476
    printf("INSERT nodes with keys of random sequence 1-65536.\n");
580
    printf("INSERT nodes with keys of random sequence 1-65536.\n");
477
    printf("Nodes:\t\t");
581
    printf("Nodes:\t\t");
478
    for (ii = 0; ii < TEST_COUNT; ii++) {
582
    for (ii = 0; ii < TEST_COUNT; ii++) {
Line 547... Line 651...
547
            extavlreltree_delete_min(&extavlreltree);
651
            extavlreltree_delete_min(&extavlreltree);
548
            free_extavlreltree_node(c);
652
            free_extavlreltree_node(c);
549
        }
653
        }
550
           
654
           
551
        df[2][ii] = get_cycle();
655
        df[2][ii] = get_cycle();
-
 
656
 
-
 
657
        /*
-
 
658
         * FAVL INSERT
-
 
659
         */
-
 
660
        s[3][ii] = get_cycle();
-
 
661
       
-
 
662
        favltree_create(&favltree);
-
 
663
        for (i = 0; i < node_count[ii]; i++) {
-
 
664
            favltree_insert(&favltree,alloc_favltree_node());
-
 
665
        }
-
 
666
           
-
 
667
        f[3][ii] = get_cycle();
-
 
668
        /*
-
 
669
         * AVL DELETE
-
 
670
         */
-
 
671
        ds[3][ii] = get_cycle();
-
 
672
       
-
 
673
        while (favltree.root != NULL) {
-
 
674
            d = favltree_find_min(&favltree);
-
 
675
            favltree_delete_min(&favltree);
-
 
676
            free_favltree_node(d);
-
 
677
        }
-
 
678
           
-
 
679
        df[3][ii] = get_cycle();
552
    }
680
    }
553
    printf("\n----------------------------------------------------------------------------");  
681
    printf("\n----------------------------------------------------------------------------");  
554
    printf("\nAVL\t\t");
682
    printf("\nAVL\t\t");
555
    for (ii = 0; ii < TEST_COUNT; ii++)
683
    for (ii = 0; ii < TEST_COUNT; ii++)
556
        printf("%20llu",f[0][ii]-s[0][ii]);
684
        printf("%20llu",f[0][ii]-s[0][ii]);
-
 
685
    printf("\nFAVL\t\t");
-
 
686
    for (ii = 0; ii < TEST_COUNT; ii++)
-
 
687
        printf("%20llu",f[3][ii]-s[3][ii]);
557
    printf("\nExtAVL\t\t");
688
    printf("\nExtAVL\t\t");
558
    for (ii = 0; ii < TEST_COUNT; ii++)
689
    for (ii = 0; ii < TEST_COUNT; ii++)
559
        printf("%20llu",f[1][ii]-s[1][ii]);
690
        printf("%20llu",f[1][ii]-s[1][ii]);
560
    printf("\nExtAVLrel\t");
691
    printf("\nExtAVLrel\t");
561
    for (ii = 0; ii < TEST_COUNT; ii++)
692
    for (ii = 0; ii < TEST_COUNT; ii++)
Line 568... Line 699...
568
        printf("%20u",node_count[ii]);
699
        printf("%20u",node_count[ii]);
569
    printf("\n----------------------------------------------------------------------------");  
700
    printf("\n----------------------------------------------------------------------------");  
570
    printf("\nAVL\t\t");
701
    printf("\nAVL\t\t");
571
    for (ii = 0; ii < TEST_COUNT; ii++)
702
    for (ii = 0; ii < TEST_COUNT; ii++)
572
        printf("%20llu",df[0][ii]-ds[0][ii]);
703
        printf("%20llu",df[0][ii]-ds[0][ii]);
-
 
704
    printf("\nFAVL\t\t");
-
 
705
    for (ii = 0; ii < TEST_COUNT; ii++)
-
 
706
        printf("%20llu",df[3][ii]-ds[3][ii]);
573
    printf("\nExtAVL\t\t");
707
    printf("\nExtAVL\t\t");
574
    for (ii = 0; ii < TEST_COUNT; ii++)
708
    for (ii = 0; ii < TEST_COUNT; ii++)
575
        printf("%20llu",df[1][ii]-ds[1][ii]);
709
        printf("%20llu",df[1][ii]-ds[1][ii]);
576
    printf("\nExtAVLrel\t");
710
    printf("\nExtAVLrel\t");
577
    for (ii = 0; ii < TEST_COUNT; ii++)
711
    for (ii = 0; ii < TEST_COUNT; ii++)
Line 582... Line 716...
582
 
716
 
583
/** Simulating timeout mechanismus with insert and delete_min operations.
717
/** Simulating timeout mechanismus with insert and delete_min operations.
584
 */
718
 */
585
static void test4(void)
719
static void test4(void)
586
{
720
{
587
    uint64_t s[3][TEST_COUNT],f[3][TEST_COUNT];
721
    uint64_t s[4][TEST_COUNT],f[4][TEST_COUNT];
588
    unsigned int i,ii;
722
    unsigned int i,ii;
589
    avltree_node_t *a;
723
    avltree_node_t *a;
590
    extavltree_node_t *b;
724
    extavltree_node_t *b;
591
    extavlreltree_node_t *c;
725
    extavlreltree_node_t *c;
-
 
726
    favltree_node_t *d;
592
    uint64_t r;
727
    uint64_t r;
593
    uint16_t rr;
728
    uint16_t rr;
594
    unsigned int mn,nc;
729
    unsigned int mn,nc;
595
 
730
 
596
   
731
   
Line 640... Line 775...
640
        }  
775
        }  
641
       
776
       
642
        f[0][ii] = get_cycle();
777
        f[0][ii] = get_cycle();
643
 
778
 
644
        /*
779
        /*
-
 
780
         * FAVL
-
 
781
         */
-
 
782
        rr = r;
-
 
783
        nc = 0;
-
 
784
        s[3][ii] = get_cycle();
-
 
785
       
-
 
786
        avltree_create(&avltree);
-
 
787
        for (i = 0; i < OPERATION_COUNT; i++) {
-
 
788
            if (((rr % mn) <= nc) && nc) {
-
 
789
                /*
-
 
790
                 * Delete min.
-
 
791
                 */
-
 
792
                d = favltree_find_min(&favltree);
-
 
793
                favltree_delete_min(&favltree);
-
 
794
                free_favltree_node(d);
-
 
795
                nc--;
-
 
796
            } else {
-
 
797
                /*
-
 
798
                 * Insert.
-
 
799
                 */
-
 
800
                d = alloc_favltree_node();
-
 
801
                d->key = rr;
-
 
802
                favltree_insert(&favltree,d);
-
 
803
                nc++;
-
 
804
            }
-
 
805
            rr += GEN_NUM;
-
 
806
        }
-
 
807
        /*
-
 
808
         * Delete rest tree.
-
 
809
         */
-
 
810
        while (favltree.root != NULL) {
-
 
811
            d = favltree_find_min(&favltree);
-
 
812
            favltree_delete_min(&favltree);
-
 
813
            free_favltree_node(d);
-
 
814
        }  
-
 
815
       
-
 
816
        f[3][ii] = get_cycle();
-
 
817
 
-
 
818
        /*
645
         * ExtAVL
819
         * ExtAVL
646
         */
820
         */
647
        rr = r;
821
        rr = r;
648
        nc = 0;
822
        nc = 0;
649
        s[1][ii] = get_cycle();
823
        s[1][ii] = get_cycle();
Line 723... Line 897...
723
    }
897
    }
724
    printf("\n----------------------------------------------------------------------------");  
898
    printf("\n----------------------------------------------------------------------------");  
725
    printf("\nAVL\t\t");
899
    printf("\nAVL\t\t");
726
    for (ii = 0; ii < TEST_COUNT; ii++)
900
    for (ii = 0; ii < TEST_COUNT; ii++)
727
        printf("%20llu",f[0][ii]-s[0][ii]);
901
        printf("%20llu",f[0][ii]-s[0][ii]);
-
 
902
    printf("\nFAVL\t\t");
-
 
903
    for (ii = 0; ii < TEST_COUNT; ii++)
-
 
904
        printf("%20llu",f[3][ii]-s[3][ii]);
728
    printf("\nExtAVL\t\t");
905
    printf("\nExtAVL\t\t");
729
    for (ii = 0; ii < TEST_COUNT; ii++)
906
    for (ii = 0; ii < TEST_COUNT; ii++)
730
        printf("%20llu",f[1][ii]-s[1][ii]);
907
        printf("%20llu",f[1][ii]-s[1][ii]);
731
    printf("\nExtAVLrel\t");
908
    printf("\nExtAVLrel\t");
732
    for (ii = 0; ii < TEST_COUNT; ii++)
909
    for (ii = 0; ii < TEST_COUNT; ii++)
Line 740... Line 917...
740
    printf("\n\tBenchmark test of timeout data structures: AVL, ExtAVL and ExtAVLrel.\n"
917
    printf("\n\tBenchmark test of timeout data structures: AVL, ExtAVL and ExtAVLrel.\n"
741
        "Run test more than once for eliminating possible distortion due to caching!\n\n");
918
        "Run test more than once for eliminating possible distortion due to caching!\n\n");
742
 
919
 
743
   
920
   
744
    avl_slab = slab_cache_create("avl_slab",sizeof(avltree_node_t), 0, NULL, NULL, SLAB_CACHE_MAGDEFERRED);
921
    avl_slab = slab_cache_create("avl_slab",sizeof(avltree_node_t), 0, NULL, NULL, SLAB_CACHE_MAGDEFERRED);
-
 
922
    favl_slab = slab_cache_create("favl_slab",sizeof(favltree_node_t), 0, NULL, NULL, SLAB_CACHE_MAGDEFERRED);
745
    extavl_slab = slab_cache_create("extavl_slab",sizeof(extavltree_node_t), 0, NULL, NULL, SLAB_CACHE_MAGDEFERRED);
923
    extavl_slab = slab_cache_create("extavl_slab",sizeof(extavltree_node_t), 0, NULL, NULL, SLAB_CACHE_MAGDEFERRED);
746
    extavlrel_slab = slab_cache_create("extavlrel_slab",sizeof(extavlreltree_node_t), 0, NULL, NULL, SLAB_CACHE_MAGDEFERRED);
924
    extavlrel_slab = slab_cache_create("extavlrel_slab",sizeof(extavlreltree_node_t), 0, NULL, NULL, SLAB_CACHE_MAGDEFERRED);
747
 
925
 
748
    if (!alloc_nodes(NODE_COUNT))
926
    if (!alloc_nodes(NODE_COUNT))
749
        return NULL;
927
        return NULL;