哪个更快 - 正则表达式匹配或我自己的匹配功能?

时间:2014-05-10 13:24:00

标签: java android regex algorithm

我正在开发一款名为智能呼叫阻止程序的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()等方法。
  3. 为什么以及如何?

    修改

    我已粘贴代码here。我无法对Android操作系统进行适当的基准测试,虽然我可以将两种上述方式的执行时间比较作为我系统上的普通java程序。但我认为只要在系统上看到这些程序的运行时就可以得到任何结论,而不是在实际的Android设备上运行时。

1 个答案:

答案 0 :(得分:1)

首先,这不是一个好的问题,因为没有办法提供参考或测试我的答案与你给出的。所以一些基于理论的答案:

  

Android应用程序应该更快更轻?

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

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

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

  3. 因此,如果您的代码运行速度低于等效的正则表达式,那么您的代码就不好了。有一点需要注意:在Android中你的代码可能是用Java编写的,我假设Android正则表达式库仍然是Java代码。这是我上次写给Android的时候,但那是几个版本之前的版本。 Android Java编译器还不如原生gcc好。因此,如果添加了一些优化,您可能必须本机重新实现代码才能比正则表达式更好。

    非常重要的警告和有根据的猜测:在应用启动期间,只能从文件中读取模式并编译(如果使用正则表达式)。如果你这样做,你的代码和正则表达式方法之间的速度差异将是如此之小,以至于它不会产生影响。