Nice work ! Regarding ant logging system - I think we should eventually reopen the subject and pick a logger API ( I preffer commons-logging, but I won't -1 any other choice ), then start using the normal if( log.isDebugEnabled()) log() that prevents useless string concatenations and calls.
Costin Nicola Ken Barozzi wrote: > > Sending this to ant-dev too. > > Vadim Gritsenko wrote, On 15/08/2003 23.28: >> Just ran Cocoon build under optimize it. Not the clean build, but second >> one, when there is nothing to do. It took 6 minutes on 1.6GHz P4 desktop >> box. Guess where all this time has been spent? Logging! >> >> 45.26%: Project.fireMessageLoggedEvent() method >> >> >> Made a quick hack of Project, replaced Vector of BuildListeners with >> BuildListener[]. Build took 5 minutes. >> >> 32.1%: Project.fireMessageLoggedEvent() method >> >> Next hotspot is: >> 3.78%: DefaultLogger.printMessage >> And, after some xerces classes, comes DirectoryScanner - the one who is >> doing the actual work: >> 2.2%: DirectoryScanner.scandir >> >> >> Does somebody know anybody working on Ant logging system? Is Ant 1.6 >> better in this regard? >> >> PS Removing synchronized() in this method gives even better results: >> build runs 3 minutes, 43 seconds and fireMessageLoggedEvent method takes >> just 9.5% of total execution time >> >> PPS Hacked version of Ant-1.5.3's Project.java attached for curious folks >> >> Vadim >> >> >> ------------------------------------------------------------------------ >> >> Index: src/main/org/apache/tools/ant/Project.java >> =================================================================== >> RCS file: >> /home/cvspublic/ant/src/main/org/apache/tools/ant/Project.java,v >> retrieving revision 1.108.2.12 diff -u -r1.108.2.12 Project.java >> --- src/main/org/apache/tools/ant/Project.java 17 Feb 2003 14:21:12 >> -0000 >> 1.108.2.12 >> +++ src/main/org/apache/tools/ant/Project.java 15 Aug 2003 21:26:28 >> -0000 >> @@ -198,7 +198,7 @@ >> private File baseDir; >> >> /** List of listeners to notify of build events. */ >> - private Vector listeners = new Vector(); >> + private BuildListener[] listeners = new BuildListener[0]; >> >> /** >> * The Ant core classloader - may be <code>null</code> if using >> @@ -347,7 +347,13 @@ >> * Must not be <code>null</code>. >> */ >> public void addBuildListener(BuildListener listener) { >> - listeners.addElement(listener); >> + synchronized (this) { >> + int n = listeners.length; >> + BuildListener[] newListeners = new BuildListener[n + 1]; >> + System.arraycopy(listeners, 0, newListeners, 0, n); >> + newListeners[n] = listener; >> + listeners = newListeners; >> + } >> } >> >> /** >> @@ -358,7 +364,23 @@ >> * Should not be <code>null</code>. >> */ >> public void removeBuildListener(BuildListener listener) { >> - listeners.removeElement(listener); >> + synchronized (this) { >> + int n = listeners.length; >> + int m = 0; >> + for (int i = 0; i < n; i++) { >> + if (listeners[i] != listener && >> !listeners[i].equals(listener)) { >> + m++; >> + } >> + } >> + BuildListener[] newListeners = new BuildListener[m]; >> + m = 0; >> + for (int i = 0; i < n; i++) { >> + if (listeners[i] != listener && >> !listeners[i].equals(listener)) { >> + newListeners[m++] = listeners[i]; >> + } >> + } >> + listeners = newListeners; >> + } >> } >> >> /** >> @@ -367,7 +389,11 @@ >> * @return a list of build listeners for the project >> */ >> public Vector getBuildListeners() { >> - return (Vector) listeners.clone(); >> + Vector v = new Vector(listeners.length); >> + for (int i = 0; i < listeners.length; i++) { >> + v.add(listeners[i]); >> + } >> + return v; >> } >> >> /** >> @@ -987,7 +1013,7 @@ >> * Must not be <code>null</code>. >> */ >> public void addDataTypeDefinition(String typeName, Class typeClass) >> { >> - synchronized(dataClassDefinitions) { >> + synchronized (dataClassDefinitions) { >> Class old = (Class) dataClassDefinitions.get(typeName); >> if (null != old) { >> if (old.equals(typeClass)) { >> @@ -2003,20 +2029,17 @@ >> private void fireMessageLoggedEvent(BuildEvent event, String >> message, >> int priority) { >> event.setMessage(message, priority); >> - Vector listeners = getBuildListeners(); >> - synchronized(this) { >> - if (loggingMessage) { >> - throw new BuildException("Listener attempted to access " >> - + (priority == MSG_ERR ? "System.err" : >> "System.out") >> - + " - infinite loop terminated"); >> - } >> - loggingMessage = true; >> - for (int i = 0; i < listeners.size(); i++) { >> - BuildListener listener = (BuildListener) >> listeners.elementAt(i); >> - listener.messageLogged(event); >> - } >> - loggingMessage = false; >> + if (loggingMessage) { >> + throw new BuildException("Listener attempted to access " >> + + (priority == MSG_ERR ? "System.err" : "System.out") >> + + " - infinite loop terminated"); >> + } >> + loggingMessage = true; >> + BuildListener[] listeners = this.listeners; >> + for (int i = 0; i < listeners.length; i++) { >> + listeners[i].messageLogged(event); >> } >> + loggingMessage = false; >> } >> >> /** >> @@ -2089,6 +2112,4 @@ >> public Task getThreadTask(Thread thread) { >> return (Task) threadTasks.get(thread); >> } >> - >> - >> } > --------------------------------------------------------------------- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]