michael-o commented on a change in pull request #50: WAGON-537 Maven download 
speed of large artifacts is slow
URL: https://github.com/apache/maven-wagon/pull/50#discussion_r225314924
 
 

 ##########
 File path: 
wagon-provider-api/src/main/java/org/apache/maven/wagon/AbstractWagon.java
 ##########
 @@ -560,31 +564,78 @@ protected void transfer( Resource resource, InputStream 
input, OutputStream outp
     protected void transfer( Resource resource, InputStream input, 
OutputStream output, int requestType, long maxSize )
         throws IOException
     {
-        byte[] buffer = new byte[DEFAULT_BUFFER_SIZE];
+        byte[] buffer = bufferForTransferring( resource );
 
         TransferEvent transferEvent = new TransferEvent( this, resource, 
TransferEvent.TRANSFER_PROGRESS, requestType );
         transferEvent.setTimestamp( System.currentTimeMillis() );
 
         long remaining = maxSize;
         while ( remaining > 0 )
         {
-            // let's safely cast to int because the min value will be lower 
than the buffer size.
-            int n = input.read( buffer, 0, (int) Math.min( buffer.length, 
remaining ) );
+            // Read from the stream, block if necessary until either EOF or 
buffer is filled.
+            // Filling the buffer has priority since downstream processors 
will significantly degrade i/o
+            // performance if called to frequently (large data streams) as 
they perform expensive tasks such as
+            // console output or data integrity checks.
+            int nextByte = input.read();
 
-            if ( n == -1 )
+            if ( nextByte == -1 )
             {
                 break;
             }
 
-            fireTransferProgress( transferEvent, buffer, n );
+            buffer[0] = ( byte ) nextByte;
+
+            // let's safely cast to int because the min value will be lower 
than the buffer size.
+            int length = (int) min( buffer.length, remaining ),
+                read = 1;
+
+            for ( ; read < length ; ++read )
+            {
+                nextByte = input.read();
+                if ( nextByte == -1 )
+                {
+                    break;
+                }
+                buffer[read] = ( byte ) nextByte;
+            }
+
+            fireTransferProgress( transferEvent, buffer, read );
 
 Review comment:
   I am somewhat confused why this performs better than described in 
`#read(byte[], int, int)`'s Javadoc::
   
   > The read(b, off, len) method for class InputStream simply calls the method 
read() repeatedly ... The default implementation of this method blocks until 
the requested amount of input data len has been read, end of file is detected, 
or an exception is thrown. Subclasses are encouraged to provide a more 
efficient implementation of this method.
   
   I understand that you are mimicking this behavior by filling the buffer 
manually byte-by-byte, but why is that better?!
   

----------------------------------------------------------------
This is an automated message from the Apache Git Service.
To respond to the message, please log on GitHub and use the
URL above to go to the specific comment.
 
For queries about this service, please contact Infrastructure at:
[email protected]


With regards,
Apache Git Services

Reply via email to