119 lines
2.8 KiB
C
119 lines
2.8 KiB
C
/* The Computer Language Benchmarks Game
|
|
* https://salsa.debian.org/benchmarksgame-team/benchmarksgame/
|
|
|
|
contributed by Kevin Carson
|
|
compilation:
|
|
gcc -O3 -fomit-frame-pointer -funroll-loops -static binary-trees.c -lm
|
|
icc -O3 -ip -unroll -static binary-trees.c -lm
|
|
|
|
*reset*
|
|
*/
|
|
|
|
/* modified by @jsinger for CHERI example allocators */
|
|
#include "freelist_allocator.h"
|
|
#include <math.h>
|
|
#include <stdio.h>
|
|
#include <stdlib.h>
|
|
|
|
typedef struct tn
|
|
{
|
|
struct tn *left;
|
|
struct tn *right;
|
|
} treeNode;
|
|
|
|
treeNode *NewTreeNode(treeNode *left, treeNode *right)
|
|
{
|
|
treeNode *new;
|
|
|
|
new = (treeNode *) alloc(sizeof(treeNode));
|
|
|
|
new->left = left;
|
|
new->right = right;
|
|
|
|
return new;
|
|
} /* NewTreeNode() */
|
|
|
|
long ItemCheck(treeNode *tree)
|
|
{
|
|
if (tree->left == NULL)
|
|
return 1;
|
|
else
|
|
return 1 + ItemCheck(tree->left) + ItemCheck(tree->right);
|
|
} /* ItemCheck() */
|
|
|
|
treeNode *BottomUpTree(unsigned depth)
|
|
{
|
|
if (depth > 0)
|
|
return NewTreeNode(BottomUpTree(depth - 1), BottomUpTree(depth - 1));
|
|
else
|
|
return NewTreeNode(NULL, NULL);
|
|
} /* BottomUpTree() */
|
|
|
|
void DeleteTree(treeNode *tree)
|
|
{
|
|
if (tree->left != NULL)
|
|
{
|
|
DeleteTree(tree->left);
|
|
DeleteTree(tree->right);
|
|
}
|
|
|
|
dealloc(tree);
|
|
} /* DeleteTree() */
|
|
|
|
int main(int argc, char *argv[])
|
|
{
|
|
unsigned N, depth, minDepth, maxDepth, stretchDepth;
|
|
treeNode *stretchTree, *longLivedTree, *tempTree;
|
|
unsigned pages; /* mem required */
|
|
|
|
N = (argc > 1) ? atol(argv[1]) : 0;
|
|
|
|
minDepth = 4;
|
|
|
|
if ((minDepth + 2) > N)
|
|
maxDepth = minDepth + 2;
|
|
else
|
|
maxDepth = N;
|
|
|
|
stretchDepth = maxDepth + 1;
|
|
|
|
/* calculate mem requirements, with allocator-specific
|
|
* size-class assumptions
|
|
*/
|
|
pages = ((2 << (stretchDepth + 3)) * sizeof(treeNode)) / BYTES_IN_PAGE;
|
|
printf("treenode size is %u bytes\n", (unsigned int) sizeof(treeNode));
|
|
printf("we need %u pages\n", pages);
|
|
|
|
/* allocate memory pool */
|
|
initialize(pages);
|
|
|
|
/* start creating tree data structures */
|
|
stretchTree = BottomUpTree(stretchDepth);
|
|
printf("stretch tree of depth %u\t check: %li\n", stretchDepth, ItemCheck(stretchTree));
|
|
|
|
DeleteTree(stretchTree);
|
|
|
|
longLivedTree = BottomUpTree(maxDepth);
|
|
|
|
for (depth = minDepth; depth <= maxDepth; depth += 2)
|
|
{
|
|
long i, iterations, check;
|
|
|
|
iterations = pow(2, maxDepth - depth + minDepth);
|
|
|
|
check = 0;
|
|
|
|
for (i = 1; i <= iterations; i++)
|
|
{
|
|
tempTree = BottomUpTree(depth);
|
|
check += ItemCheck(tempTree);
|
|
DeleteTree(tempTree);
|
|
} /* for(i = 1...) */
|
|
|
|
printf("%li\t trees of depth %u\t check: %li\n", iterations, depth, check);
|
|
} /* for(depth = minDepth...) */
|
|
|
|
printf("long lived tree of depth %u\t check: %li\n", maxDepth, ItemCheck(longLivedTree));
|
|
|
|
return 0;
|
|
} /* main() */ |