/**
Simple-minded code to compare the performance of a linked list using a free
list to manage links to a linked list using new and garbage collection.
After compiling, run with "java -ea flm".
Data Structures and Algorithms, CS 305 and 503.
Fall 2010
*/
import java.util.Random;
class flm {
private static int []
genTurns() {
final int turns [] = new int [100000]
int total = 0
final Random rint = new Random(System.currentTimeMillis())
for (int i = 0; i < turns.length - 1; i += 2) {
total += (turns[i] = (rint.nextInt(10) + 1)*10)
total -= (turns[i] = (rint.nextInt(total) + 1))
assert total > -1
}
return turns
}
public static void
main(String args[]) {
final int turns [] = genTurns()
final double
std = (double) runIt(turns, new basicAllocator()),
free = (double) runIt(turns, new freeListAllocator())
System.out.printf("std/free-list = %g.\n", std/free)
}
private static long
runIt(int turns[], allocator a) {
link head = null
final long now = System.currentTimeMillis()
for (int i = 0; i < turns.length; i += 2) {
for (int j = turns[i]; j > -1; j--)
head = a.newLink(head)
for (int j = turns[i + 1]; j > -1; j--) {
final link l = head.next
a.freeLink(head)
head = l
}
}
return System.currentTimeMillis() - now
}
private interface allocator {
link newLink(link l)
void freeLink(link l)
}
private static class
basicAllocator
implements allocator {
public link newLink(link l) {
return new link(l)
}
public void freeLink(link l) {
}
}
private static class
freeListAllocator
implements allocator {
private link freeList = null
public link newLink(link l) {
if (freeList != null) {
final link n = freeList
freeList = n.next
n.next = l
return n
}
return new link(l)
}
public void freeLink(link l) {
l.next = freeList
freeList = l
}
}
private static class link {
link next
link(link n) { next = n; }
}
}
// $Log: flm.java,v $
// Revision 1.1 2010/02/16 01:17:57 rclayton
// Initial revision
//
syntax highlighted by Code2HTML, v. 0.9.1