Priority Queues/Timing and Performance
From charlesreid1
Contents
Priority Queues
Priority queues are queues that keep items in the queue in a sorted order, so that the minimum (highest priority) item comes out first.
This page contains results of timing and performance measurement of priority queues.
Will start with the note that I spent (wasted) a lot of time trying to implement my own priority queue, only to finally finish and get results that showed it was 2-3 orders of magnitude slower than the built-in priority queue type and horribly slow for anything bigger than 1,000 elements.
I'm looking to scale to a hundred million.
Timing
To time, used a simple timing object that wraps the system timer, called Tim the Timer. See Tim the Timer.
Builtin Timing
Note: code is at git.charlesreid1.com: https://git.charlesreid1.com/cs/java/src/master/priority-queues/BuiltinTiming.java
To time built-in priority queue objects I used the following script:
import java.util.LinkedList;
import java.util.Random;
import java.util.PriorityQueue;
/** Timing of Builtin Priority Queue in Java.
*/
public class BuiltinTiming {
// We will perform and time Nops add operations.
static int Nops = 100;
// We will do that Ntrials times.
static int Ntrials = 10000;
// We will add to a container of size N.
static int[] Ns = { 1000,2000,3000,4000,5000,
6000,7000,8000,9000,
10000,20000,30000,40000,50000,60000,70000,80000,90000,100000};
/** Run tests */
public static void main(String[] args) {
PriorityQueue<Integer> builtin = new PriorityQueue<Integer>();
System.out.println("---------------------------");
System.out.println("Add Test: Built-in PriorityQueue");
add(builtin);
}
/** Add test for built-in priority queue. */
public static void add(PriorityQueue<Integer> q) {
Random r = new Random();
System.out.println("N\t\tWalltime Add Tot (ms)\t\tWalltime Add Per 1k (ms)");
// Gathering stats on each size
for(int i = 0; i<Ns.length; i++) {
// set N
int N = Ns[i];
// set timer
Tim tim = new Tim();
for(int k=0; k<Ntrials; k++) {
// Start by initializing the container
q.clear();
for(int j = 0; j < N; j++) {
q.add(r.nextInt());
}
// Now time adding
tim.tic();
for(int m=0; m<Nops; m++) {
q.add(r.nextInt());
}
tim.toc();
}
// Now printing out N, total walltime, time per 1k add ops
double per_op = tim.elapsedms()/(1.0*Ntrials*Nops);
double per_1kop = (tim.elapsedms()/(1.0*Ntrials*Nops))*1000;
// done with timing trials, now print out
// N, add total, ad per 1k operation
System.out.printf("%d\t\t\t%.4f\t\t\t%.4f\n", N, tim.elapsedms(), per_1kop);
}
}
}
Flags
| Stacks and Queues Part of Computer Science Notes
Series on Data Structures
Stacks and Queues: Python StacksQueues/Python · StacksQueues/Python/ArrayStack · StacksQueues/Python/ArrayQueue · StacksQueues/Python/ArrayDeque StacksQueues/Python/LinkedStack
Stacks and Queues: Java StacksQueues/Java · StacksQueues/Java/ArrayStack · StacksQueues/Java/ArrayQueue · StacksQueues/Java/ArrayQueueFS · StacksQueues/Java/ArrayDeque StacksQueues/Java/LinkedStack · StacksQueues/Java/LinkedQueue · StacksQueues/Java/LinkedDeque
Applications Postfix_Expressions#Stacks · StacksQueues/Subsets · StacksQueues/Subsets/Java
|