2009-06-26 66 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解析器实例。