commit ab2f6edfd838d0d069f3d5284d8a68220f21b769
parent 6ea01fd6bfe542f8c76ba7010f9a00c48b89fd60
Author: Plat <plat@stellar-nexus.ru>
Date: Fri, 7 Nov 2025 09:58:34 +0000
Changes to flags and timings of avl and rb
Diffstat:
| M | avl.c | | | 46 | +++++++++++++++++++++++++++++++--------------- |
| M | fib.c | | | 8 | ++++---- |
| M | rb.c | | | 40 | +++++++++++++++++++++++++++++----------- |
3 files changed, 64 insertions(+), 30 deletions(-)
diff --git a/avl.c b/avl.c
@@ -15,7 +15,7 @@ typedef struct Node Node;
inline Node *
init(int val)
{
- Node *n = malloc(sizeof(Node));
+ Node *n = emalloc(sizeof(Node));
if (n == NULL)
return NULL;
@@ -62,7 +62,7 @@ get_height(Node *root)
}
-inline int
+static inline int
get_balance_factor(Node *root)
{
if (!root)
@@ -142,12 +142,23 @@ usage(void)
int
main(int argc, char *argv[])
{
- argv0 = argv[0];
- if (argc > 2)
+ int cflag = 0, sflag = 0, dflag = 0;
+ ARGBEGIN {
+ case 'c':
+ cflag = 1;
+ break;
+ case 's':
+ sflag = 1;
+ break;
+ case 'd':
+ dflag = 1;
+ break;
+ } ARGEND
+ if (argc > 1)
usage();
const char *filename;
- if (argc == 2)
- filename = argv[1];
+ if (argc == 1)
+ filename = argv[0];
else
filename = FILENAME;
@@ -175,17 +186,22 @@ main(int argc, char *argv[])
weprintf("Array too big - using only the first %d elements\n", TESTNUMBER);
Node *root = NULL;
+ clock_t start_time, elapsed = 0;
- for (int i = 0; i < TESTNUMBER; ++i) {
+ if (cflag)
+ start_time = clock();
+ for (int i = 0; i < TESTNUMBER; ++i)
root = add(root, arr[i]);
- SET_COLOR(root, BLACK);
+ if (cflag)
+ elapsed += clock() - start_time;
+
+ volatile uintptr_t checksum = 0; /* to avoid optimization */
+ if (sflag) {
+ start_time = clock();
+ for (int i = 0; i < TESTNUMBER; ++i)
+ checksum = (uintptr_t)search(root, arr[i]);
+ elapsed += clock() - start_time
}
- volatile uintptr_t checksum = 0; /* to avoid optimization */
- clock_t start_time, end_time;
- start_time = clock();
- for (int i = 0; i < TESTNUMBER; ++i)
- checksum = (uintptr_t)search(root, arr[i]);
- end_time = clock();
- printf("%f\n", (double)(end_time-start_time)/CLOCKS_PER_SEC);
+ printf("%f\n", (double)elapsed/CLOCKS_PER_SEC);
}
diff --git a/fib.c b/fib.c
@@ -73,19 +73,19 @@ main(int argc, char *argv[])
usage();
- clock_t start_time, time = 0;
+ clock_t start_time, elapsed = 0;
if (cflag)
start_time = clock();
Node *root = create(estrtonum(argv[0], 0, UINT_MAX));
if (cflag)
- time += clock() - start_time;
+ elapsed += clock() - start_time;
volatile unsigned long int fib = 0; /* to avoid optimization */
if (sflag) {
start_time = clock();
fib = count(root);
- time += clock() - start_time;
+ elapsed += clock() - start_time;
}
- printf("%f\n", (double)time/CLOCKS_PER_SEC);
+ printf("%f\n", (double)elapsed/CLOCKS_PER_SEC);
}
diff --git a/rb.c b/rb.c
@@ -101,12 +101,23 @@ usage(void)
int
main(int argc, char *argv[])
{
- argv0 = argv[0];
- if (argc > 2)
+ int cflag = 0, sflag = 0, dflag = 0;
+ ARGBEGIN {
+ case 'c':
+ cflag = 1;
+ break;
+ case 's':
+ sflag = 1;
+ break;
+ case 'd':
+ dflag = 1;
+ break;
+ } ARGEND
+ if (argc > 1)
usage();
const char *filename;
- if (argc == 2)
- filename = argv[1];
+ if (argc == 1)
+ filename = argv[0];
else
filename = FILENAME;
@@ -134,17 +145,24 @@ main(int argc, char *argv[])
weprintf("Array too big - using only the first %d elements\n", TESTNUMBER);
Node *root = NULL;
+ clock_t start_time, elapsed = 0;
+ if (cflag)
+ start_time = clock();
for (int i = 0; i < TESTNUMBER; ++i) {
root = add(root, arr[i]);
SET_COLOR(root, BLACK);
}
-
+ if (cflag)
+ elapsed += clock() - start_time;
+
volatile uintptr_t checksum = 0; /* to avoid optimization */
- clock_t start_time, end_time;
- start_time = clock();
- for (int i = 0; i < TESTNUMBER; ++i)
- checksum = (uintptr_t)search(root, arr[i]);
- end_time = clock();
- printf("%f\n", (double)(end_time-start_time)/CLOCKS_PER_SEC);
+ if (sflag) {
+ start_time = clock();
+ for (int i = 0; i < TESTNUMBER; ++i)
+ checksum = (uintptr_t)search(root, arr[i]);
+ elapsed += clock() - start_time
+ }
+
+ printf("%f\n", (double)elapsed/CLOCKS_PER_SEC);
}