Geoffrey Hardy created NET-550:
----------------------------------

             Summary: Default FTPClient bufferSize results in very slow 
retrieve transfers
                 Key: NET-550
                 URL: https://issues.apache.org/jira/browse/NET-550
             Project: Commons Net
          Issue Type: Bug
    Affects Versions: 3.3
            Reporter: Geoffrey Hardy


While experimenting with FTPClient, I discovered that if I don't call 
setBufferSize(), the default value is zero.  This results in retrieveFile() 
calling the version of InputStream.read() with no parameters, reading one byte 
at a time.  For comparison, the downloading a CD ISO image of about ~648MB took 
18m10s with the default settings.  In contrast, calling setBufferSize(8192) 
took only 7.9s, an improvement of ~137x.

Here is some sample code:

{code:java}
FTPClient ftp = new FTPClient();
// ftp.setBufferSize(8192);
ftp.setControlKeepAliveTimeout(300);
ftp.setCopyStreamListener(new CopyStreamListener() {
    @Override
    public void bytesTransferred(long totalBytesTransferred, int 
bytesTransferred, long streamSize) {
        System.out.println("totalBytesTransferred: " + totalBytesTransferred
            + ", bytesTransferred: " + bytesTransferred + ", streamSize: " + 
streamSize);
    }

    @Override public void bytesTransferred(CopyStreamEvent event) {}
});
ftp.connect(host);
ftp.login(user, pass);
ftp.retrieveFile(file, outputStream);
{code}

The log message from the stream listener printed lots messages 
"bytesTransferred: 1" and totalBytesTransferred incremented by 1 each time.  
This corresponds to the part of the code which reads one byte at a time with 
{{int inputStream.read()}}.




--
This message was sent by Atlassian JIRA
(v6.2#6252)

Reply via email to