// rm a.out; cc -O3 -Wpedantic gc.c; time ./a.out 100000 #include #define DEFAULT_NODE_SIZE 0 #define DEFAULT_ITERATIONS 100000000 struct QueueNode { struct QueueNode *next; struct QueueNode *prev; char *data; }; struct Queue { struct QueueNode *head; struct QueueNode *tail; }; void enqueue(struct Queue *queue, int node_size) { struct QueueNode *node = (struct QueueNode*)calloc(1, sizeof(struct QueueNode)); node->data = (char*)calloc(1, node_size); node->prev = queue->tail; if (queue->tail == NULL) { queue->head = node; } else { queue->tail->next = node; } queue->tail = node; } void dequeue(struct Queue *queue) { struct QueueNode *node = queue->head; if (node != NULL) { queue->head = node->next; if (queue->head == NULL) { queue->tail = NULL; } else { queue->head->prev = NULL; } free(node->data); free(node); } } void run_queue(int queue_size, int node_size, long iterations) { struct Queue queue = {NULL, NULL}; int i; for (i = 0; i < queue_size; i++) { enqueue(&queue, node_size); } for (i = 0; i < iterations; i++) { enqueue(&queue, node_size); dequeue(&queue); } } int main(int argc, char** argv) { int queue_size = atoi(argv[1]); int node_size = argc > 2 ? atoi(argv[2]) : DEFAULT_NODE_SIZE; long iterations = argc > 3 ? atol(argv[3]) : DEFAULT_ITERATIONS; run_queue(queue_size, node_size, iterations); return 0; }