0
我使用Xamarin開發iOS應用程序。其中一項功能是以hls格式下載視頻,這意味着每個視頻可以有100到1000個區塊下載。所以我需要做100到1000個http請求。這是工作,但下載時應用程序非常慢,我用「樂器」進行了性能測試,CPU處於80%,一旦完成,它會回到0%-1%。這是在iPad上測試,而不是在模擬器上。Xamarin - 多個HTTP請求減慢應用程序的速度
public async Task CreateDownloadTask (string path){
var response = await _httpClient.GetAsync (GetUrl(path),
HttpCompletionOption.ResponseHeadersRead);
if (!response.IsSuccessStatusCode)
{
Debug.WriteLine ("Error: " + path);
RaiseFault(new RpcFault("Error: Unable to download video", -1));
}
else
{
var totalBytes = response.Content.Headers.ContentLength.HasValue
? response.Content.Headers.ContentLength.Value : -1L;
using (var stream = await response.Content.ReadAsStreamAsync())
{
var isMoreToRead = true;
var data = new byte[totalBytes];
do
{
_cancelSource.Token.ThrowIfCancellationRequested();
var buffer = new byte[4096];
int read = stream.ReadAsync(buffer,
0,
buffer.Length,
_cancelSource.Token).Result;
if (read == 0)
isMoreToRead = false;
else {
buffer.ToList().CopyTo (0, data, receivedBytes, read);
receivedBytes += read;
HlsVideo.TotalReceived += read;
}
} while(isMoreToRead);
var fullPath = GetFullFilePath (path);
_fileStore.WriteFile (fullPath, data);
}
}
如何在做多個http請求時提高性能?
雖然你叫'ToList()'?這是一開始就引入不必要的複製。爲什麼你要在'while'循環的每次迭代中創建一個新的緩衝區?只需在循環之前創建一次*,以便您可以繼續使用相同的緩衝區。事實上,爲什麼你有'緩衝'呢?你已經有了一個有效的緩衝區 - 「數據」。直接讀入:'int read = stream.ReadAsync(data,receivedBytes,totalBytes - receivedBytes,_cancelSource.Token).Result;' –
你是對的!我刪除了緩衝區,似乎工作得更好。它減少了大約20%的CPU使用率!在物品列表上滾動時仍然不順暢,因此歡迎提供任何提示。謝謝! – nhenrique
是否有任何理由使用* WriteFile的* synchronous *調用?這可能會使它也生澀...... –