function bench(fun, time) {									//  Handy. My friend Bench actually tells me that the perf
	if(time===null || time===undefined) time=100;			//  problems from all the excessive cloning aren't too bad,
	var t1 = Math.floor(new Date());						//  yet, but then again, I haven't written an FSThreeSpace
	var c = 0;												//  equivalent. That'll hurt with this model, prototype or not, methinks.
	while(Math.floor(new Date())-t1<time) {
		fun();
		c++;
	}
	var t2 = Math.floor(new Date());
	return {time: t2-t1, runs: c, avg: (t2-t1)/c};
}

function enumerate(obj, asHTML) {		//Shows the entire hash of an object. Handy.
	var s = [];
	for(var i in obj)
		s[s.length]=(i+": "+(function() {try{if(typeof obj[i]=='string') return "\""+obj[i]+"\""; return obj[i];}catch(e){return e;}})());
	if(asHTML==true)
		return "\n"+s.join(",\n\n").split("\n").join("<br>").split("  ").join("&nbsp; &nbsp; ")+"\n";
	else return " {\n"+s.join(",\n\n")+"}";
}

function alertBench(fun, time) {
	alert(enumerate(bench(fun, time)));
}