我正在构建一个从网页中抓取信息的应用程序。为此,我选择使用名为Jsoup的 html 抓取工具,因为它使用起来非常简单。Jsoup 也依赖于 Apache Commons Lang 库。(它们总共构成 385kB )。所以 Jsoup 将用于下载页面并解析它。
我的问题是,如果使用这些简化库而不是使用 Android 内置库,是否会使我的应用程序变慢?(在下载数据和解析方面)。
我在想内部库会针对 Android 进行优化。
我正在构建一个从网页中抓取信息的应用程序。为此,我选择使用名为Jsoup的 html 抓取工具,因为它使用起来非常简单。Jsoup 也依赖于 Apache Commons Lang 库。(它们总共构成 385kB )。所以 Jsoup 将用于下载页面并解析它。
我的问题是,如果使用这些简化库而不是使用 Android 内置库,是否会使我的应用程序变慢?(在下载数据和解析方面)。
我在想内部库会针对 Android 进行优化。
jsoup的下一个版本将不需要 Apache Commons-Lang 或任何其他外部依赖项,这会将 jar 大小降低到 115K 左右。
在内部,jsoup 使用标准的 Java 库(URL 连接、HashMap 等),这些库将得到相当好的 Android 优化。
我花了很多时间优化 jsoup 的解析执行时间和数据提取器方法;当然,如果你找到任何改进它的方法,我会全力以赴。
如果问题是“与我自己编写相同的代码相比,外部库是否会固有地使我的应用程序变慢?”,答案通常是:“是的,但不是很多。”
JVM 需要一些时间来加载外部库。该库很可能具有您未使用的功能或特性,加载这些或阅读它们需要一些时间。但在大多数情况下,这种差异是微不足道的,除非您处于高度受限的环境中,否则我不会担心它。
如果您的意思是“我可以编写比外部库更快地执行相同功能的代码吗?”,答案是“几乎可以肯定,但是值得您花时间吗?”
很有可能您使用的任何外部库都将具有您不需要但包含在内以适应其他人的需求的各种功能。该库的作者并不确切知道每个用户都在做什么,因此他们必须以一般方式进行优化。因此,如果您编写自己的代码,您可以让它完全满足您的需求,仅此而已,并根据您的需求进行优化。
在您的特定情况下是否值得麻烦是一个大问题。
外部库也将使用针对 Android 优化的内部库。我想真正的问题是:您的自定义实现会比这些库的通用实现更快吗?
在大多数情况下,第三方库会解决您想要解决的问题,以及您可能不需要解决的其他问题,而这部分可能会损害性能。您必须在重新发明轮子和仅为您的基本需求使用优化代码之间找到平衡。
此外,如果这些库在设计时没有考虑到 Android 平台,请确保对它们进行广泛的测试。
这是经典的构建与购买的论点。
如果运行时性能对您的应用程序非常重要,那么您应该考虑推出自己的实现或优化库(假设它是开源的。)但是,在您这样做之前,您应该知道现有库的性能好坏. 除非您实际使用它并获取一些数据,否则您不会知道这一点。
作为第一步,我建议使用该库并收集有关其性能的数据,或者向已经在 Android 上使用该库的人询问性能数据。该库可能很慢,但如果可以接受,那么我想它比自己滚动一个要好。
请记住,当您创建自己的实现时,这将花费您的时间和金钱(设计、编码、测试和维护)。因此,您正在权衡运行时性能以换取重用和降低开发成本。
编辑:另一个重要的一点是性能是许多事情的函数。例如,硬件、Android 版本和网络。如果您的目标设备运行的是 2.1 或更低版本,并且您可以通过使用 2.2 来提高性能。另一方面,如果您想针对所有版本,则必须采用不同的策略。