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]