java - 哪个更快——正则表达式匹配还是我自己的匹配函数?

标签 java android regex algorithm

我正在开发一个名为 Smart Call Blocker 的 Android 应用程序,它允许您输入正则表达式模式,然后检索传入的电话号码并执行匹配,然后根据匹配是否成功允许/拒绝调用。

用户输入的模式应该允许:

either a digit, or a dot (meaning don't care the digit at this position), 
or a range (e.g. [3-7]), or a set of digits (e.g. [2, 5, 8])

现在我已经编写了代码,可以根据模式手动逐位比较传入的电话号码,并相应地允许/拒绝调用。它以线性时间运行(比较次数等于电话号码中的位数)。

Android 应用哪个应该更快更轻?

  1. 我写的手工方法。
  2. 使用自己的 Pattern.compile() 和 matches() 等方法的正则表达式库。

为什么以及如何?

编辑:

我已经粘贴了代码here .我无法对 android 操作系统进行适当的基准测试,尽管我可以像系统上的普通 java 程序一样对上述两种方式进行执行时间比较。但我认为仅通过查看这些程序在系统上的运行时间与在实际 Android 设备上运行时的运行时间相比,无法得出任何结论。

最佳答案

首先,这不是一个很好的 SO 问题,因为无法提供引用或用您提供的内容测试我的答案。所以一些基于理论的答案:

Which should be faster and lighter for an android app?

您的代码应该更快。两个原因:

  1. 它是“预编译的”。正则表达式匹配器将模式编译成某种内部代码(字节码或树)。这需要时间。您的代码运行时没有此类开销。

  2. 大多数正则表达式匹配器(包括 Java 库的)都使用通用的分支定界搜索算法。即使永远不需要搜索(它总是正确分支),搜索功能也会引入一些小的开销。

因此,如果您的代码运行速度比等效的正则表达式慢,那么您的代码就不好。有一个警告:在 Android 中,您的代码可能是用 Java 编写的,我假设 Android 正则表达式库仍然是 Java 代码。这是我最后一次写信给 Android,但那是几个版本前的事了。 Android Java 编译器还不如原生的 gcc。因此,如果添加了一些优化,您可能必须在 native 重新实现代码才能比正则表达式做得更好。

非常重要的警告和有根据的猜测:从文件中读取模式和编译(如果使用正则表达式)应该只在应用程序启动期间完成一次。如果这样做,您的代码和正则表达式方法之间的速度差异将非常小,不会产生任何影响。

关于java - 哪个更快——正则表达式匹配还是我自己的匹配函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23581580/

相关文章:

java - Java : cannot find symbol when compiling

java - 记录未随 ResultSet 更新

java - Jemmy lib 中的 ActionProducer.MaxActionTime 有最大限制吗?

android - Dagger 2 : ViewModel cannot be provided without an @Provides-annotated method

jquery - 想要在我的 Droid 上使用 jQuery

android - 搜索未知 Activity (java.lang.ClassNotFoundException)

java - 如何构建具有开始和结束字符验证的验证正则表达式?

java - 根据条件从另一个 Spinner 填充 Spinner

javascript - 如何从 Javascript 字符串中删除以特定字符开头的单词

java - 如何使用正则表达式从字符串中解析数字