[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