diff --git a/test/perf/README b/test/perf/README
new file mode 100644
index 0000000..9c95d99
--- /dev/null
+++ b/test/perf/README
@@ -0,0 +1,8 @@
+This directory contains the performance tests. These tests contain basic
+routines that perform a single action and output the result in seconds, with a
+basic description of what has been done. The timing is done via the native Date
+object to ensure that it can be run both server and client-side.
+
+It is important that each test performs only a single operation to ensure that
+the prior operations have no consequences on the previous, at least when run
+server-side by invoking a separate executable for each.
diff --git a/test/perf/common.js b/test/perf/common.js
new file mode 100644
index 0000000..75ec0cf
--- /dev/null
+++ b/test/perf/common.js
@@ -0,0 +1,91 @@
+/**
+ * Common performance testing functionality
+ *
+ * Copyright (C) 2010 Mike Gerwitz
+ *
+ * This file is part of ease.js.
+ *
+ * ease.js is free software: you can redistribute it and/or modify it under the
+ * terms of the GNU Lesser General Public License as published by the Free
+ * Software Foundation, either version 3 of the License, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this program. If not, see .
+ *
+ * @author Mike Gerwitz
+ * @package performance
+ */
+
+/**
+ * Stores start time
+ * @type {number}
+ */
+var start = 0;
+
+
+/**
+ * Includes a module from the lib directory
+ *
+ * @param {string} name module name
+ *
+ * @return {Object} module exports
+ */
+exports.require = function( name )
+{
+ return require( '../../lib/' + name );
+};
+
+
+/**
+ * A simple wrapper to perform testing and output the result
+ *
+ * @param {function()} test performance test to perform
+ * @param {string=} desc test description
+ *
+ * @return {undefined}
+ */
+exports.test = function( test, desc )
+{
+ exports.start();
+ test();
+ exports.report( desc );
+};
+
+
+/**
+ * Starts the timer
+ *
+ * @return {undefined}
+ */
+exports.start = function()
+{
+ start = ( new Date() ).getTime();
+};
+
+
+/**
+ * Outputs the time elapsed, followed by the description (if available)
+ *
+ * @param {string=} desc test description
+ *
+ * @return {undefined}
+ */
+exports.report = function( desc )
+{
+ desc = desc || '';
+
+ var end = ( new Date() ).getTime(),
+ total = ( ( end - start ) / 1000 ).toFixed( 3 )
+ ;
+
+ console.log( total + 's' +
+ ( ( desc ) ? ( ': ' + desc ) : '' )
+ );
+};
+
diff --git a/test/perf/perf-class-define.js b/test/perf/perf-class-define.js
new file mode 100644
index 0000000..b4eb20b
--- /dev/null
+++ b/test/perf/perf-class-define.js
@@ -0,0 +1,42 @@
+/**
+ * Tests amount of time taken to declare 1000 classes
+ *
+ * Copyright (C) 2010 Mike Gerwitz
+ *
+ * This file is part of ease.js.
+ *
+ * ease.js is free software: you can redistribute it and/or modify it under the
+ * terms of the GNU Lesser General Public License as published by the Free
+ * Software Foundation, either version 3 of the License, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this program. If not, see .
+ *
+ * @author Mike Gerwitz
+ * @package performance
+ */
+
+
+var common = require( __dirname + '/common.js' ),
+ Class = common.require( 'class' )
+
+ count = 1000
+;
+
+
+common.test( function()
+{
+ var i = count;
+
+ while ( i-- )
+ {
+ Class( {} );
+ }
+
+}, 'Declare ' + count + ' empty anonymous classes' );
diff --git a/test/perf/perf-class-inst-anon-empty.js b/test/perf/perf-class-inst-anon-empty.js
new file mode 100644
index 0000000..69220a8
--- /dev/null
+++ b/test/perf/perf-class-inst-anon-empty.js
@@ -0,0 +1,43 @@
+/**
+ * Tests amount of time taken to instantiate anonymous classes
+ *
+ * Copyright (C) 2010 Mike Gerwitz
+ *
+ * This file is part of ease.js.
+ *
+ * ease.js is free software: you can redistribute it and/or modify it under the
+ * terms of the GNU Lesser General Public License as published by the Free
+ * Software Foundation, either version 3 of the License, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this program. If not, see .
+ *
+ * @author Mike Gerwitz
+ * @package performance
+ */
+
+
+var common = require( __dirname + '/common.js' ),
+ Class = common.require( 'class' )
+
+ count = 5000,
+ Foo = Class( {} )
+;
+
+
+common.test( function()
+{
+ var i = count;
+
+ while ( i-- )
+ {
+ Foo();
+ }
+
+}, 'Instantiate ' + count + ' empty anonymous classes' );
diff --git a/test/perf/perf-class-inst-named-empty.js b/test/perf/perf-class-inst-named-empty.js
new file mode 100644
index 0000000..5ee920f
--- /dev/null
+++ b/test/perf/perf-class-inst-named-empty.js
@@ -0,0 +1,44 @@
+/**
+ * Tests amount of time taken to instantiate named classes
+ *
+ * Copyright (C) 2010 Mike Gerwitz
+ *
+ * This file is part of ease.js.
+ *
+ * ease.js is free software: you can redistribute it and/or modify it under the
+ * terms of the GNU Lesser General Public License as published by the Free
+ * Software Foundation, either version 3 of the License, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this program. If not, see .
+ *
+ * @author Mike Gerwitz
+ * @package performance
+ */
+
+
+var common = require( __dirname + '/common.js' ),
+ Class = common.require( 'class' )
+
+ count = 5000,
+ Foo = Class( 'Foo', {} )
+;
+
+common.test( function()
+{
+ var i = count;
+
+ while ( i-- )
+ {
+ // to be extra confident that V8 or another compiler won't realize this
+ // is useless and optimize it out
+ Foo();
+ }
+
+}, 'Instantiate ' + count + ' empty named classes' );
diff --git a/test/perf/perf-class-require.js b/test/perf/perf-class-require.js
new file mode 100644
index 0000000..065c50d
--- /dev/null
+++ b/test/perf/perf-class-require.js
@@ -0,0 +1,33 @@
+/**
+ * Tests amount of time spent on requiring class module
+ *
+ * Copyright (C) 2010 Mike Gerwitz
+ *
+ * This file is part of ease.js.
+ *
+ * ease.js is free software: you can redistribute it and/or modify it under the
+ * terms of the GNU Lesser General Public License as published by the Free
+ * Software Foundation, either version 3 of the License, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this program. If not, see .
+ *
+ * @author Mike Gerwitz
+ * @package performance
+ */
+
+
+var common = require( __dirname + '/common.js' );
+
+// we run this test once because require() will cache the object in memory
+common.test( function()
+{
+ common.require( 'class' );
+}, 'Require class module' );
+