[jsword-devel] [JIRA] Commented: (JS-133) Percentage complete during a download should reflect file size

Martin Denham mjdenham at gmail.com
Sat Dec 4 11:15:49 MST 2010


I stripped out all the progress and size stuff from WebResource.copy and the
download time for Darby decreased to 20 secs - 3 times faster than I have
ever seen before even with the previous code!!!

Have to go now but will get back to this later.

On 4 December 2010 17:42, Martin Denham <mjdenham at gmail.com> wrote:

> I don't think so.  The code I was using before, which was fast, updated the
> Progress after every block fetch in the inner loop in WebResource.copy().
>
>
> On 4 December 2010 17:24, DM Smith <dmsmith at crosswire.org> wrote:
>
>> Wild guess: it updates progress too often.
>>
>> Cent from my fone so theer mite be tipos. ;)
>>
>> On Dec 4, 2010, at 12:17 PM, Martin Denham <mjdenham at gmail.com> wrote:
>>
>> I have reverted to the code I had a couple of days ago and the speed is
>> back to normal again i.e. ~1 min to download Darby bible compared to >10 min
>> with the latest code.
>>
>> It looks like a JSword issue but could be an Android environment issue
>> because I did see diabolical download performance some months ago due to
>> configuration.
>>
>> On 4 December 2010 16:54, Martin Denham (JIRA) < <jira at crosswire.org>
>> jira at crosswire.org> wrote:
>>
>>>
>>>    [
>>> <http://www.crosswire.org/bugs/browse/JS-133?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=13631#action_13631>
>>> http://www.crosswire.org/bugs/browse/JS-133?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=13631#action_13631]
>>>
>>> Martin Denham commented on JS-133:
>>> ----------------------------------
>>>
>>> Hi DM,
>>>
>>> I am getting horrendous download performance with the latest build
>>> compared to the version I got a few days ago after you had first updated to
>>> the latest httpclient and jdom.  Downloads are not just a bit longer but
>>> take ~10 times longer.
>>>
>>> Any idea why?  It isn't just the time of day because I did a fast test
>>> just 10 mins ago then upgraded my mobile and now the progress bar just
>>> crawls from left to right taking ~10 minutes when it used to take  ~1 min.
>>>
>>> Also, the Progress message used to say something like "Installing book:
>>> <module name>" but now it just says "Install".  Is this my error or
>>> JSword's?
>>>
>>> Regards
>>> Martin
>>>
>>>
>>> > Percentage complete during a download should reflect file size
>>> > --------------------------------------------------------------
>>> >
>>> >                 Key: JS-133
>>> >                 URL: <http://www.crosswire.org/bugs/browse/JS-133>
>>> http://www.crosswire.org/bugs/browse/JS-133
>>> >             Project: JSword
>>> >          Issue Type: Improvement
>>> >          Components: o.c.common.util, o.c.jsword.book.install
>>> >         Environment: Android
>>> >            Reporter: Martin Denham
>>> >            Assignee: DM Smith
>>> >
>>> > Downloads to a mobile are slower and more variable than to a pc and
>>> there can be quite a large difference between predicted download time and
>>> actual download time.  Also, the first download does not have a predicted
>>> download time and so the first progress bar And Bible showed to users had no
>>> percentage complete (maybe this second problem could have been avoided by
>>> pre-loading a guesstimate) .
>>> > There is code in JSword to get the download file size
>>> (WebResource.getSize()) but the actual download loop does not have access to
>>> the Progress object in order to update the percentage so I changed the code
>>> to pass the Progress object to the download method. And Bible has been using
>>> this for a few weeks now to allow actual download percent to be displayed
>>> with no known problems.
>>> > There were a few changes in different classes:
>>> > AbstractSwordInstaller.run() determines if the download times are
>>> predicted.  I had to set the last parameter to false to turn predictions
>>> off:
>>> >         //change final parameter to false to prevent guessing progress
>>> of file download because now actual file size is used
>>> >         Progress job = JobManager.createJob(UserMsg.gettext("Installing
>>> book: {0}", sbmd.getName()), predictURI, this, false);
>>> > In HttpSwordInstaller.copy(..) pass the Progress object through to
>>> WebResource which actually does the download:
>>> >     private void copy(Progress job, URI uri, URI dest) throws
>>> LucidException {
>>> >         if (job != null) {
>>> >             // TRANSLATOR: Progress label for downloading one or more
>>> files.
>>> >             job.setSectionName(UserMsg.gettext("Downloading files"));
>>> >         }
>>> >         //MJD START - modified following line - pass job thro to
>>> WebResource to allow actual progress indicator
>>> >         WebResource wr = new WebResource(uri, proxyHost, proxyPort,
>>> job);
>>> >         wr.copy(dest);
>>> >     }
>>> > The above implies a new constructor was also needed and created for
>>> WebResource.
>>> > The WebResource.copy method is where the percent complete is updated
>>> currently in And Bible.  It could be argued that this creates inefficiency
>>> in a tight loop but the loop isn't that tight because it deals in blocks
>>> rather than bytes.  Inefficiency of updating Progress too often was the
>>> reason I added progressUpdateCounter so the calls do not happen after every
>>> block is fetched, but in reality it did not really save much as anything
>>> more than every other time leads to a very jumpy progress bar so I think the
>>> progressUpdateCounter part of below could be removed so that the progress is
>>> updated every time.
>>> > 95.0% was used below, as in other places to allow 5% for post download
>>> operations but I think users expect a delay after download so it could be
>>> 100.0%.
>>> > My first attempt involved calling getSize() somewhere after GetMethod
>>> and it just hung, hence the comment below.
>>> >     public void copy(URI dest) throws LucidException {
>>> >         InputStream in = null;
>>> >         OutputStream out = null;
>>> >         //MJD START calculate progress as percent of total file size
>>> >         //must call getSize before opening the connection or it hangs
>>> >         int size = getSize();
>>> >         HttpMethod method = new GetMethod(uri.getPath());
>>> >         try {
>>> >             // Execute the method.
>>> >             int status = client.executeMethod(method);
>>> >             if (status == HttpStatus.SC_OK) {
>>> >                 in = method.getResponseBodyAsStream();
>>> >                 // Download the index file
>>> >                 out = NetUtil.getOutputStream(dest);
>>> >                 int progressUpdateCounter = 0;
>>> >                 long totalRead = 0;
>>> >                 byte[] buf = new byte[4096];
>>> >                 int count = in.read(buf);
>>> >                 while (-1 != count) {
>>> >                     out.write(buf, 0, count);
>>> >                     count = in.read(buf);
>>> >
>>> >                     totalRead += count;
>>> >                     //update progress occasionally - every other time
>>> >                     if (job!=null && size>0 && progressUpdateCounter++
>>> % 2 == 0) {
>>> >                         int pctRead = (int)((95.0*totalRead)/size);
>>> >                         job.setWork(pctRead);
>>> >                     }
>>> >                 }
>>> >             } else {
>>> >                 // rest is unchanged
>>> > My only reservation is that getSize() may sometimes not work but I have
>>> not found any cases where it failed although And Bible only currently
>>> downloads from the CrossWire repository.
>>>
>>> --
>>> This message is automatically generated by JIRA.
>>> -
>>> If you think it was sent incorrectly contact one of the administrators:
>>> <http://www.crosswire.org/bugs/secure/Administrators.jspa>
>>> http://www.crosswire.org/bugs/secure/Administrators.jspa
>>> -
>>> For more information on JIRA, see:
>>> <http://www.atlassian.com/software/jira>
>>> http://www.atlassian.com/software/jira
>>>
>>>
>>>
>>> _______________________________________________
>>> jsword-devel mailing list
>>>  <jsword-devel at crosswire.org>jsword-devel at crosswire.org
>>>  <http://www.crosswire.org/mailman/listinfo/jsword-devel>
>>> http://www.crosswire.org/mailman/listinfo/jsword-devel
>>>
>>
>> _______________________________________________
>> jsword-devel mailing list
>> jsword-devel at crosswire.org
>> http://www.crosswire.org/mailman/listinfo/jsword-devel
>>
>>
>> _______________________________________________
>> jsword-devel mailing list
>> jsword-devel at crosswire.org
>> http://www.crosswire.org/mailman/listinfo/jsword-devel
>>
>>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://www.crosswire.org/pipermail/jsword-devel/attachments/20101204/f870f7da/attachment.html>


More information about the jsword-devel mailing list