Hello again, and thank you for all your replies. I will try to break
them down in an organized fashion.

Kumar:
The while loop takes <20ms on the emulator, and less still on the
Nexus One. I have measured the time it takes for every line to
complete -- I'm sorry I did not mention that. The problem is in the
call to the web service (i.e. client.execute(request), or
androidHttpTransport.call(soapAction, envelope) from another way of
trying). I have much more code from me trying this many different
ways; this is a single snapshot of where I left the code.

Jason:
I don't understand how the browser can be so much faster than a direct
HTTP call to the web service. I do know that timing the execution
synchronously is not going to give me perfect results, but I timed the
timer and, especially on the Nexus One, it takes a negligible amount
of time for the timer code to run. What I forgot to mention was that
we have tried hosting the web service locally on our network (<1ms
late...@100mbit) and even then the web service call takes >100ms
through the app, and <20ms through the browser.

This code is housed in WebService.java, which is always called
asynchronously from other parts of the app. I wanted the entire
instantiation to be asynchronous, in case in the future we decide to
return or parse a more-than-trivial amount of data. I have ran this
test with GZIP compression enabled and disabled.

Unfortunately, it is not feasible to implement a local cache. That was
my very first thought, but the data is important enough that I do not
want the possibility of tech savvy users extracting the data
themselves without using the web service the way it was intended.

One thing I noticed, using Microsoft's Visual Round Trip Analyzer
(very cool little tool, if you guys haven't used it already), is that
a certain call to my .NET web service (which in this case returns a
soap envelope with a .NET datatable inside, which I parse manually,
blegh) results in a bunch of ACKs going back and forth. Over WiFi this
isn't terrible, but over a higher latency connection like EDGE this
takes 4+ seconds to complete. It looks like TCP Slow Start may have
something to do with it, but admittedly I don't have enough knowledge
of the inner workings of TCP to fix this issue. Here is what VRTA
returns:


KB Up=1.499 Down=8.765;
Compressibility: 0.00; Packet Loss: 0.00%
HTTPS NotSupported Headers (Size=0 Cookie=0):
Response Status Code: null Headers (Size=0 Cookie=0):
Time [ms]: TCP=86 TTFB=0 Total=2149

Frame ms A Size Proto Flags Communication
7 98 0 66 TCP .S  Sync to establish Conn
8 184 86 66 TCP .S. .A  <--- Sync-Ack confirm Conn
9 184 0 54 TCP ....A  ---> Ack
10 405 220 142 TCP ...PA  ---> Ack
11 499 95 1514 TCP ....A  <--- Ack
12 502 3 1514 TCP ....A  <--- Ack
13 502 0 54 TCP ....A  ---> Ack
14 591 89 1159 TCP ...PA  <--- Ack
15 795 203 54 TCP ....A  ---> Ack
16 828 33 364 TCP ...PA  ---> Ack
17 931 104 97 TCP ...PA  <--- Ack
19 1137 205 54 TCP ....A  ---> Ack
20 1903 767 286 TCP ...PA  ---> Ack
21 2115 212 60 TCP ....A  <--- Ack
22 2115 0 407 TCP ...PA  ---> Ack
23 2247 132 1514 TCP ....A  <--- Ack
24 2247 0 1514 TCP ....A  <--- Ack
25 2247 0 1477 TCP ...PA  <--- Ack
26 2247 0 60 TCP F.. .A  <--- Close connection
27 2247 0 54 TCP ....A  ---> Ack

Are Android developers content with all calls to a web service taking
800ms over WiFi and 4000ms on EDGE?

Again, thank you for all your replies.

Regards,
Adam Smith
Norsoft

On Nov 23, 9:33 am, Hal <[email protected]> wrote:
> You may want to try Jt secure Web Services for Android:
>
> -Java Pattern Oriented Framework, An application of the Messaging
> Design Pattern
> IBM Technical 
> Libraryhttp://www.ibm.com/developerworks/webservices/library/ws-designpatter...
>
> - Messaging Design Pattern and a distributed Component/Service 
> Modelhttps://jt.dev.java.net/files/documents/5553/149793/MDPdistributedMod...
>
> The following code  is taken from the Jt.JtURL component (invoked by
> the Jt.rest.JtRestService component)
>
>     private String doPost (String request) {
>         URLConnection urlConn;
>         URL destURL;
>         DataOutputStream outStream;
>         DataInputStream inStream;
>         int c;
>         StringBuffer sBuffer = new StringBuffer ();
>
>         if (request == null)
>                 return null;
>
>         if (url == null)
>                 return null;
>
>         handleTrace ("request:" + request);
>
>         try {
>
>                 destURL = new URL (url);
>
>                 urlConn = destURL.openConnection();
>                 urlConn.setDoOutput(true);
>                 urlConn.setDoInput(true);
>
>                 urlConn.setRequestProperty("Content-length",
>                                 "" + request.length());
>
>                 outStream = new DataOutputStream (urlConn.getOutputStream());
>
>                 outStream.writeBytes(request);
>
>                 outStream.close ();
>
>                 inStream = new DataInputStream (urlConn.getInputStream());
>
>                 while ((c = inStream.read()) >= 0) {
>                         sBuffer.append((char) c);
>                 }
>         } catch (Exception ex) {
>                 handleException (ex);
>         }
>
>         return ((String) sBuffer.toString());
>
>     }
>
> If feasible you may want to try without GZIP. It should be a bit
> faster.
>
> On Nov 18, 6:00 pm, Wipeout <[email protected]> wrote:
>
>
>
>
>
>
>
> > Hey guys,
> > This is my first post to the Android Developers group. I have been
> > working with HTTP communication in the Android SDK and have noticed
> > that calls to a web service through my app are very slow (taking
> > 800+ms on high speed wifi). They take less than 100ms if I call the
> > web service through the phone's browser. I am developing on a Google
> > Nexus One. The size of the data returned is very small, <1K. I have
> > tried enabling gzip compression, and that helps slightly but I assume
> > there is another problem at hand. I have tried using SOAP with the
> > ksoap2-android library, as well as making things simple using
> > HttpClient and InputStreamReader. Below is my code for the fastest I
> > can make the app perform; using no SOAP, and using GZIP compression. I
> > apologize for the lengthy code -- I think all of it is beneficial for
> > determining the best way to make this request and response happen
> > faster.
>
> > [code]
> > public String GetRest()
> >         {
>
> >         long startTime = System.currentTimeMillis();
> >         String result = "";
>
> >         Log.v("time", "Beginning rest: " + (System.currentTimeMillis() -
> > startTime) + "ms");
>
> >             try
> >             {
> >                 HttpClient client = new DefaultHttpClient();
> >                 HttpGet request = new HttpGet("https://usad.enlyght.com/ws/
> > AndroidService.asmx/GetWebServiceVersion");
> >                 request.addHeader("Accept-Encoding", "gzip");
>
> >                 Log.v("time", "Before call: " + (System.currentTimeMillis() 
> > -
> > startTime) + "ms");
> >                 HttpResponse response = client.execute(request);
> >                 InputStream instream = response.getEntity().getContent();
> >                 Header contentEncoding = response.getFirstHeader("Content-
> > Encoding");
> >                 if (contentEncoding != null &&
> > contentEncoding.getValue().equalsIgnoreCase("gzip")) {
> >                     instream = new GZIPInputStream(instream);
> >                 }
> >                 InputStreamReader isreader = new 
> > InputStreamReader(instream);
> >                 BufferedReader reader = new BufferedReader(isreader);
> >                 StringWriter sw = new StringWriter();
>
> >                 String read;
> >                 while ((read = reader.readLine()) != null) {
> >                         result += read;
> >                 }
>
> >                 client.getConnectionManager().shutdown();
> >         }
> >         catch (Exception e) {}
> >         Log.v("time", "End rest: " + (System.currentTimeMillis() -
> > startTime) + "ms");
>
> >         return result;
> >         }
> > [/code]
>
> > Regards,
> > Adam Smith
> > Norsoft

-- 
You received this message because you are subscribed to the Google
Groups "Android Developers" group.
To post to this group, send email to [email protected]
To unsubscribe from this group, send email to
[email protected]
For more options, visit this group at
http://groups.google.com/group/android-developers?hl=en

Reply via email to