var t, count, node1, node2 function Node1(node) { this.node = node; var children = node.childNodes, i = this.length = children.length; while (i--) this[i] = new Node1(children[i]); } Node1.prototype.count = function() { var ret = 1, i = this.length; while ( i-- ) ret += this[ i ].count(); return ret; } function Node2(node) { var first = node.firstChild, next = node.nextSibling; this.node = node; this.first = first && new Node2(first); this.next = next && new Node2(next); } Node2.prototype.count = function() { var ret = 1; if ( this.first ) ret += this.first.count(); if ( this.next ) ret += this.next.count(); return ret; } t = Date.now() node1 = new Node1( document ); console.log( "time to create (Node1)", Date.now() - t ) t = Date.now() count = node1.count() console.log( "time to count (Node1)", Date.now() - t ) console.log( "nodes counted (Node1)", count ) t = Date.now() node2 = new Node2( document ); console.log( "time to create (Node2)", Date.now() - t ) t = Date.now() count = node2.count() console.log( "time to count (Node2)", Date.now() - t ) console.log( "nodes counted (Node2)", count )