public AC start(String taskName, Object... args) {
		final ProfilingTimerNode parent = current.get();
		current.set(findOrCreateNode(String.format(taskName, args), parent));
		return new AC() {
			@Override public void close() {
				// return to the parent that we had when this AC was created
				current.set(parent);
				// close all the elements in the subtree under current
				if (parent != null)
					stopAll(parent);
			}
			private void stopAll(ProfilingTimerNode current) {
				for (ProfilingTimerNode child : current.children.values()) {
					stopAll(child);
					child.stop();
				}
			}
		};
	}
public AC start ( String taskName , Object ... args ) { final ProfilingTimerNode parent = current . get ( ) ; current . set ( findOrCreateNode ( String . format ( taskName , args ) , parent ) ) ; return new AC ( ) { @ Override public void close ( ) { current . set ( parent ) ; if ( parent != null ) stopAll ( parent ) ; } private void stopAll ( ProfilingTimerNode current ) { for ( ProfilingTimerNode child : current . children . values ( ) ) { stopAll ( child ) ; child . stop ( ) ; } } } ; }
Indicates that a new task has started. Nested tasks are supported, so this method
can potentially be called various times in a row without invoking {@link #end()}.

<p>
Optionally, this method can be used in a try-with-resources block so that there is no
need to manually invoking {@link #end()} when the task at hand finishes.