嵌入式java基准测试_Java正则表达式库基准测试– 2015年
嵌入式j(luò)ava基準(zhǔn)測(cè)試
在嘗試使Java在計(jì)算機(jī)語言基準(zhǔn)游戲的regexdna挑戰(zhàn)中排名第一時(shí),我正在研究Java正則表達(dá)式庫的性能。 我可以找到的最新網(wǎng)站是2010年的tusker.org 。因此,我決定使用Java Microbenchmarking Harness重做測(cè)試并發(fā)布結(jié)果(破壞性警告:某些非傳統(tǒng)的解決方案使Java排名第一)。
TL; DR :正則表達(dá)式非常適合臨時(shí)查詢,但如果您對(duì)性能敏感,則應(yīng)手動(dòng)編寫解決方案代碼(這并不意味著您必須從絕對(duì)零開始–例如,Google Guava庫包含一些不錯(cuò)的實(shí)用程序 ,可以幫助編寫可讀性強(qiáng)的代碼。
現(xiàn)在,對(duì)于一些總結(jié)性能的圖表–該測(cè)試是在帶有OpenJDK 1.8.0_66的64位Ubuntu 15.10計(jì)算機(jī)上運(yùn)行的:
觀察結(jié)果
- 正則表達(dá)式?jīng)]有“標(biāo)準(zhǔn)”,因此當(dāng)給定特定的正則表達(dá)式和特定的字符串以進(jìn)行匹配時(shí),不同的庫可能會(huì)表現(xiàn)出不同的行為,即。 一個(gè)可能會(huì)說它匹配,但另一個(gè)可能會(huì)說它不匹配。 例如,即使我使用了一組非常少的測(cè)試用例(針對(duì)6個(gè)字符串檢查了5個(gè)正則表達(dá)式),但是只有兩個(gè)庫設(shè)法匹配/不正確地匹配了它們(其中一個(gè)是java.util.Pattern)。
- 要使您的正則表達(dá)式正確,可能需要不止一次的嘗試(例如regexpal或Regex Coach之類的工具對(duì)于實(shí)驗(yàn)非常有用)
- 正則表達(dá)式的性能很難預(yù)測(cè)(有時(shí)它可能會(huì)基于輸入長(zhǎng)度而呈指數(shù)復(fù)雜性 )–因此,如果您接受Internet上任意用戶的正則表達(dá)式(例如搜索引擎,例如將允許使用正則表達(dá)式進(jìn)行搜索)
- 似乎沒有一個(gè)庫正在積極開發(fā)中(事實(shí)上tusker.org原始列表中的許多庫現(xiàn)在不可用),而且其中許多庫都比內(nèi)置的juPattern慢 ,因此, 如果使用正則表達(dá)式應(yīng)可能是首選。
- 這么說,硬件以及兩者的性能JVM已經(jīng)相當(dāng)大,因此,如果您正在使用這些庫之一,它通常是運(yùn)行一個(gè)數(shù)量級(jí)的速度比它是在五年前。 因此,無需快速替換工作代碼(除非您的分析器說這是一個(gè)問題:-))
- 當(dāng)心循環(huán)中對(duì)String.split的調(diào)用。 盡管它針對(duì)特定情況(例如一字符正則表達(dá)式)進(jìn)行了一些優(yōu)化,但您幾乎應(yīng)該始終:
- 看看是否可以使用Google Guava的Splitter之類的工具
- 這兩個(gè)驚喜是dk.brics.automaton ,它比其他所有東西都好幾個(gè)數(shù)量級(jí),但是:
- 最新版本是2011年,似乎是一個(gè)學(xué)術(shù)項(xiàng)目
- 另一個(gè)驚喜是kmy.regex.util.Regex ,盡管自2000年以來未進(jìn)行更新,但它的性能優(yōu)于java.util.Pattern,并且通過了所有測(cè)試(當(dāng)然,其中沒有很多測(cè)試)。
使用的庫的完整列表:
| j.util.Pattern 1.8(2015) | 否(JRE附帶) | JRE許可證 | 19689 | 22144 | 5之5 |
| dk.brics.automaton.Automaton 1.11-8(2011) | 是 | BSD | 2 600 225 | 115374276 | 5分之2 |
| org.apache.regexp 1.4(2005) | 是 | 阿帕奇(?) | 6738 | 16895 | 5之4 |
| com.stevesoft.pat.Regex 1.5.3(2009) | 是 | LGPL v3 | 4191 | 859 | 5之4 |
| net.sourceforge.jregex 1.2_01(2002) | 是 | BSD | 57811 | 3573 | 5之4 |
| kmy.regex.util.Regex 0.1.2(2000) | 沒有 | 藝術(shù)許可 | 217803 | 38184 | 5之5 |
| org.apache.oro.text.regex.Perl5Matcher 2.0.8(2003) | 是 | 阿帕奇2.0 | 31906 | 2383 | 5之4 |
| gnu.regexp.RE 1.1.4(2005?) | 是 | GPL(?) | 11848 | 1509 | 5之4 |
| com.basistech.tclre.RePattern 0.13.6(2015) | 是 | 阿帕奇2.0 | 11598 | 43 | 5之3 |
| com.karneim.util.collection.regex.Pattern 1.1.1(2005?) | 是 | ? | – | – | 5分之2 |
| org.apache.xerces.impl.xpath.regex.RegularExpression 2.11.0(2014) | 是 | 阿帕奇2.0 | – | – | 5之4 |
| com.ibm.regex.RegularExpression 1.0.2(不再可用) | 沒有 | ? | – | – | – |
| RegularExpression.RE 1.1(不再可用) | 沒有 | ? | – | – | – |
| gnu.rex.Rex嗎? (不再可用) | 沒有 | ? | – | – | – |
| monq.jfa.Regexp 1.1.1(不再可用) | 沒有 | ? | – | – | – |
| com.ibm.icu.text.UnicodeSet(ICU4J) 56.1(2015) | 是 | ICU許可證 | – | – | – |
如果要重新運(yùn)行測(cè)試,請(qǐng)簽出源代碼并按以下方式運(yùn)行它:
最后, 計(jì)算機(jī)語言基準(zhǔn)游戲的regexdna挑戰(zhàn)如何? 我通過使用位操作來檢查8字節(jié)的塊(如果它們可能匹配),從而使Java達(dá)到了#1的水平,然后僅對(duì)正則表達(dá)式進(jìn)行測(cè)試。 就像我之前說的:如果要提高性能,則需要編寫自定義解析器。
翻譯自: https://www.javacodegeeks.com/2015/12/java-regular-expression-library-benchmarks-2015.html
嵌入式j(luò)ava基準(zhǔn)測(cè)試
創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎(jiǎng)勵(lì)來咯,堅(jiān)持創(chuàng)作打卡瓜分現(xiàn)金大獎(jiǎng)總結(jié)
以上是生活随笔為你收集整理的嵌入式java基准测试_Java正则表达式库基准测试– 2015年的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 快递单号是几位数 快递单号具体是几位数
- 下一篇: java timer开销_减少Java垃