6

私は今、HTTP で足を濡らし始めたところです。GET と POST を使用して単純な HTTP リクエストのタイミングを計っています。私が使用した Web ページは、正しい $_GET[] と $_POST[] の 3 行の php チェックで、文字 "1" を単にエコーします。私は POST と GET を同じ単一の短い名前と値のペアで使用します。これは、パケットの断片化が問題を解決する必要がないことを望んでおり、これはすべて UI スレッドから離れたスレッドで行われます。リクエストは、タイミングを計っている間、電話で数回ループされます。すべてうまくいきます。(以下のコード参照) つまり、「1」という応答が返ってきます。しかし、永続的なタイミングの問題があります。私が観察しているのは、次のことです。

  1. 最初の試行では、GET メソッドと POST メソッドの両方で、その後の試行よりも要求を作成する時間がはるかに長くなります。

  2. 残りの試行は、どちらの場合も常にはるかに高速です。

  3. GET は常に POST より高速です。

これらはすべて 3G および Wi-Fi 接続に当てはまります (ただし、Wi-Fi を使用すると、予想どおり全体的にはるかに高速になります)。

私はこれを BasicResponseHandler() で試しましたが、より手動の Buffered IO Stream メソッドで同じ結果が得られました。

3. は、POST が 2 つの送信を必要とする結果であることを理解していると思います。- これは正しいです?

私の主な質問は、非常に遅い最初のリクエスト試行で何が起こっているのですか? 場合によっては数秒かかることもあります(!)。物事を停滞させているのはネットワークですか、それとも Android が何らかのキューを作成するソケットにそれを入れていますか? Android の場合、より適切にコーディングしてこれを回避する方法はありますか? 実行中に一度だけこれを問題にするためにソケットを開いたままにしておくことについて何かありますか? もしそうなら、そうするのは良い習慣ですか?確かに、この側面は私が最も無知です。

これに関するいくつかの議論を見つけましたが、この側面に直接影響を与えるものはありません。

--

GET メソッドと POST メソッドの両方の基本的なコードは次のようになり (try/catch を除く)、UI から離れたスレッドで実行されます。最初に GET メソッド、次に POST メソッドです: (以下の出力)

その一部を取得します。

public String[] HTTPGETIt(int numrounds)
{
 HttpClient httpclient = new DefaultHttpClient();
 httpclient.getParams().setParameter (CoreProtocolPNames.PROTOCOL_VERSION,HttpVersion.HTTP_1_1); 
 HttpGet GETRequest = new HttpGet("http://mypage.com/epoch.php?mynameis=tam");
 ResponseHandler <String> MyBRH = new BasicResponseHandler();
 String[] GETResult = new String[numrounds];

 int i = 0;
 long timestart, DT;
 while(i < numrounds)
 {
  timestart = System.currentTimeMillis();
  GETResult[i] = httpclient.execute(GETRequest, MyBRH);
  DT = System.currentTimeMillis() - timestart;
  Log.d(TAG, "(" + i + ") GET-Round Trip was "+ DT + " ms.");
  i++;
 }//while i <= numrounds
 httpclient.getConnectionManager().shutdown();
 return GETResult;
} //END HTTPGETIt

そしてPOSTバージョン:

public String[] HTTPPOSTIt(int numrounds)
{
 String Place = "HTTPPostping";
 HttpClient httpclient = new DefaultHttpClient();
 httpclient.getParams().setParameter(CoreProtocolPNames.PROTOCOL_VERSION,HttpVersion.HTTP_1_1); 
 HttpPost PostRequest = new HttpPost("http://mypage.com/epoch.php");
 ResponseHandler <String> MyBRH = new BasicResponseHandler();
 String[] POSTResult = new String[numrounds];

 List<NameValuePair> MynameValuePairs = new ArrayList<NameValuePair>(2);
 MynameValuePairs.add(new BasicNameValuePair("mynameis", "tam"));

 PostRequest.setEntity(new UrlEncodedFormEntity(MynameValuePairs));

 int i = 0;
 long timestart, DT;
 while(i < numrounds)
 {
  timestart = System.currentTimeMillis();
  POSTResult[i] = httpclient.execute(PostRequest, MyBRH);
  DT = System.currentTimeMillis() - timestart;
  Log.d(TAG, "(" + i + ") POST-Round Trip was "+ DT + " ms.");
  i++;
 }//while i <= numrounds
 httpclient.getConnectionManager().shutdown();
 return POSTResult;
} // END HTTPPOSTIt

これらは次のように呼び出されます。

Runnable HTTPGETJob = new HTTPGETTask(NS);
Thread HTTPGETThread = new Thread(HTTPGETJob, "HTTPGETThread");
HTTPGETThread.setPriority(Thread.MAX_PRIORITY);
HTTPGETThread.start();

と:

Runnable HTTPPOSTJob = new HTTPPOSTTask(NS);
Thread HTTPPOSTThread = new Thread(HTTPPOSTJob, "HTTPPOSTThread");
HTTPPOSTThread.setPriority(Thread.MAX_PRIORITY);
HTTPPOSTThread.start();

ランナブルを使用:

class HTTPGETTask implements Runnable
{
 int numtimes;
 DeviceInfo tsrtDI;
 HTTPGETTask(int inNS) {
  this.numtimes = inNS;
 }

 @Override
 public void run() 
 {
  long [] TT2NS = new long[numtimes];
  TT2NS = HTTPGETIt(numtimes);
 }
};

と、

class HTTPPOSTTask implements Runnable
{
 int numtimes;
 DeviceInfo tsrtDI;
 HTTPPOSTTask(int inNS) {
  this.numtimes = inNS;
 }

 @Override
 public void run() 
 {
  long [] TT2NS = new long[numtimes];
  TT2NS = HTTPPOSTIt(numtimes);
 }
};  

通常、出力は次のようになります。

(0) GET 往復は 368 ミリ秒でした。

(1) GET 往復は 103 ミリ秒でした。

(2) GET 往復は 98 ミリ秒でした。

(3) GET 往復は 106 ミリ秒でした。

(4) GET-Round Trip は 102 ミリ秒でした。


(0) POST 往復は 1289 ミリ秒でした。

(1) POST 往復は 567 ミリ秒でした。

(2) POST 往復は 589 ミリ秒でした。

(3) POST-Round Trip は 496 ミリ秒でした。

(4) POST-Round Trip は 557 ミリ秒でした。

4

2 に答える 2

1

Protocol Versionasを設定しHTTP 1.1て試してみてください。要求/応答時間が現在よりも長くなります。試したことはありませんが、情報を得ただけです。したがって、リクエストを実行する前に、以下のようなことを試すことができます。

httpclient.getParams().setParameter(CoreProtocolPNames.PROTOCOL_VERSION, 
                                                        HttpVersion.HTTP_1_1);
于 2012-06-13T05:06:41.987 に答える
1

HTTP 1.1が接続を維持し、毎回ハンドシェイクを行わないため、呼び出しを高速化するのに役立つ可能性があるLalit Poptaniの回答に同意します。

しかし同時に、これは Android 固有の問題ではないと言いたいのですが、これと同じことがほぼすべてのプラットフォームと各言語で発生します。これは、最初に http 呼び出しを行うときに、プラットフォームがさまざまなオブジェクトを作成して設定する必要があるためです。そのため、呼び出しを実行するために値を割り当て、そこにとどまるため、新しい呼び出しを行うときに、オブジェクトを作成して割り当てる時間が節約されるため、応答が速くなります。

これらのオブジェクトはどれですか? -それは上記の行で言われています:私はそれらのかなり明確なリストを持っていませんが、それらはプロキシ設定のようなものであり、そのためのキャッシュメモリです。


誰かがこれに関する深い技術的知識を持ち、背後ですべてがどのように機能するかを説明するまで、もう少し待ってください.

于 2012-06-13T05:20:39.937 に答える