MonoTouch アプリでいくつかの小さな画像 (それぞれ約 40 KB) をダウンロードしています。イメージは並行してダウンロードされます。メイン スレッドがリクエストを作成し、非同期で実行します。
を使用WebRequest.Create
して HTTP 要求を作成し、完了ハンドラーで を使用して応答ストリームを取得しますresponse.GetResponseStream()
。次に、次のコードは応答ストリームからデータを読み取ります。
var ms = new MemoryStream();
byte[] buffer = new byte[4096];
int read;
while ((read = responseStream.Read(buffer, 0, buffer.Length)) > 0)
{
ms.Write(buffer, 0, read);
}
1 つのイメージのみをダウンロードする場合、これは非常に高速に実行されます (Web 要求の待機を含めて 50 ~ 100 ミリ秒)。ただし、5 ~ 10 などの複数の画像があるとすぐに、これらの行が完了するまでに 2 秒以上かかります。スレッドが 4 秒以上かかることもあります。response.BeginGetResponse
コールバックの実行に必要な時間や待機時間について話しているのではないことに注意してください。
次に、次のコードをテストしました。同じシナリオで必要な時間は 100 ミリ秒未満です。
var ms = new MemoryStream();
responseStream.CopyTo(ms);
最初のバージョンでこの大きな遅延が発生した理由は何ですか?
コードの最初のバージョンが必要な理由は、部分的にダウンロードされた画像のデータが必要だからです (特に画像が大きい場合)。パフォーマンスの問題を特定するために、部分的にダウンロードされたイメージを処理するコードを削除しました。
シミュレーターと iPad 3 でデバッグ モードとリリース モードでコードを実行し、LLVM と非 LLVM の両方のコンパイラ モードを試しました。遅延は、デバッグ/リリース、デバイス/シミュレーター、LLVM/非 LLVM のすべての構成で見られました。