2009-06-26 64 views
0

我有一個問題,我要建議(甚至是非常奇怪的!)iPhone網絡性能

我正在寫一個iPhone應用程序,它不要求(以URL參數)到服務器,非常開放。作爲迴應,iPhone收到XML。一切都很好。

現在,我期待通過測量執行特定任務所需的時間來提高我的應用程序的速度。我發現,在所有執行的任務(下載,XML解析,發送請求,處理請求,分析XML中的對象)中,下載實際的XML需要的時間最長。

現在,我的XML文件非常非常非常非常非常非常小。我主要使用它們來讀取類似RSS的數據並在UITableView中顯示它們。

我的應用程序工作得很好,沒有什麼感覺真的很慢,但現在App Store中有一個應用程序與我的應用程序非常相似,但速度更快,感覺更加「爽快」,如果你明白我的意思。它還具有從RSS提要逐一加載標題的功能。

目前我正在嘗試使用我的數據的gzip壓縮,但壓縮只會使我的數據只有一半大小,並且它對性能沒有任何真正的好處。主要的是,數據必須在被解析之前被下載。擁有數據「流」是非常酷的,數據流在解析時會被解析。這樣,我可以幾乎同時完成兩項工作,並逐個加載標題(使用戶交互性更具吸引力)。

任何人都有如何提高我的表現的想法?通過偉大的壓縮技巧或完全不同的方式與服務器進行通信..所有的歡迎!

更新:將服務器的延遲和響應放在一邊;我怎麼能得到一個XML來源'流'到我的iPhone(下載字節的字節),並在同一時間得到解析?現在它是一個線性的下載過程 - >解析 - >顯示,但它可能會變成半並行,同時下載&解析(並顯示每個項目完成下載時,而不是全部加載時間在UITableView)

+1

當你從iPhone以外的其他來源獲取它時,下載如何?只是想知道,如果這是一個iPhone問題或Web服務器上的管道運行緩慢的問題,你看看這種可能性? – OhioDude 2009-06-26 13:31:41

+0

您使用的是3G,Edge,GPRS還是Wifi? 在蜂窩網絡上,請求之間的延遲可以是任何事情,最多一秒鐘。這意味着您的請求甚至可能需要一秒才能到達服務器。 在wifi和蜂窩上,您需要考慮到一個糟糕的信號可能會導致大量數據包丟失,從而增加您的通信時間。 – Jasarien 2009-06-26 14:01:32

+0

無論來源是什麼(顯然,網絡越慢,下載時間越長),我比較的應用程序總是更快。當然,這可能是一個服務器問題(在我的方面),但數據量是微不足道的。它甚至可能是我在PHP中做的事情,使它變慢(包括在下載時間)... – Jake 2009-06-26 14:04:18

回答

3

假設您使用的是NSXMLParser的initWithContentsOfURL :,那可能是問題的一部分。它似乎是下載URL的全部內容,然後將它傳遞給解析器以一次解析所有內容。

儘管NSXMLParser是事件驅動的解析器,但它似乎並不支持以增量方式將數據流傳輸到解析器。當然,您可以用更合理的方式替換NSXMLParser和其他一些處理增量數據的解析庫。

另一種方法是使用NSURLConnection,並創建一個新的NSXMLParser,並在每次有一些數據進來時重新解析數據,在連接中:didReceiveData:NSURLConnection委託的方法。您必須編寫一些額外的代碼才能多次忽略重新解析文件開頭的額外事件。

這看起來似乎比只抓取一些其他庫和適應它更多的工作,但可能不會,這取決於您如何處理表格數據的下游創建。

0

如何解析XML數據。在您收到XML時需要解析XML是發明拉解析的全部原因,並且它們具有對數據流進行操作的NSXMLParser事件驅動解析器...

這也意味着壓縮數據會適得其反。

對於極少量的XML,速度問題可能與連接延遲有關。

因此,其他重要因素可能是DNS查找。你可以事先自己做一次,並緩存IP,也許只有在無法連接到你的服務器時重新檢查...

0

由於你的xml文件非常小,(只有8k左右,我想象?)我不'我認爲你會看到一個很大的性能提升,試圖解析它們。你可以使用一個異步的NSURLConnection來做到這一點,但我不能看到它非常幫助一個小文件。您是否考慮過在服務器上生成XML文件所需的時間?您是使用PHP創建XML還是訪問靜態文件?出於測試目的,訪問靜態文件並查看比較結果可能會很有趣。

前段時間我遇到了這樣的問題,結果發現我的服務器上的mySQL數據庫速度很慢,而且與我的應用程序無關。

此外,使用工具來查看下載和解析XML文檔時分配的內存量。一些XML解析器將整個XML文檔加載到內存中,然後允許您隨機將索引編入文檔的元素,而另一些僅提供分步解析。一步一步的方法對於像iPhone這樣的有限設備來說要好得多,它可能就是你正在使用的,但快速查看內存消耗應該告訴你。

1

如果NSMutableArray是您的UITableView的底層數據結構,您應該使用initWithContentsOfURL嘗試 。服務器上的格式需要放在蘋果「plist」xml中,這很容易生成。我猜如果可可已經獲得了處理xml的 資源,那麼使用它們會更快,而不是創建自己的xml解析器實例。