मैं हास्केल में रेगेक्स के मौजूदा विकल्पों को देख रहा हूं, और मैं समझना चाहता था कि प्रदर्शन में अंतर एक दूसरे के साथ विभिन्न विकल्पों की तुलना करते समय और खासकर grep के लिए एक सरल कॉल के साथ कहां से आया था .. ।हास्केल रेगेक्स प्रदर्शन
$ du radixtracefile
113120 radixtracefile
$ wc -l radixtracefile
1051565 radixtracefile
- मैं पहली बार कैसे पता लगाने की कोशिश:
मैं एक अपेक्षाकृत छोटे (~ 110M, तो मेरा उपयोग अधिकांश मामलों में जी की एक सामान्य कई 10s की तुलना में) का पता लगाने फ़ाइल है (मनमानी) के कई मैचों
$ time grep -nE ".*504.*ll" radixtracefile | wc -l
309
real 0m0.211s
user 0m0.202s
sys 0m0.010s
- मैं Text.Regex.TDFA को देखा (संस्करण 1.2.1) Data.ByteString साथ:
import Control.Monad.Loops
import Data.Maybe
import qualified Data.Text as T
import qualified Data.Text.IO as TIO
import Text.Regex.TDFA
import qualified Data.ByteString as B
main = do
f <- B.readFile "radixtracefile"
matches :: [[B.ByteString]] <- f =~~ ".*504.*ll"
mapM_ (putStrLn . show . head) matches
पैटर्न .*504.*ll
ग्रेप के माध्यम से वहाँ में थे भवन और चलाना:
$ ghc -O2 test-TDFA.hs -XScopedTypeVariables
[1 of 1] Compiling Main (test-TDFA.hs, test-TDFA.o)
Linking test-TDFA ...
$ time ./test-TDFA | wc -l
309
real 0m4.463s
user 0m4.431s
sys 0m0.036s
- फिर, मैं Data.Text.ICU.Regex को देखा यूनिकोड समर्थन के साथ (संस्करण 0.7.0.1):
import Control.Monad.Loops
import qualified Data.Text as T
import qualified Data.Text.IO as TIO
import Data.Text.ICU.Regex
main = do
re <- regex [] $ T.pack ".*504.*ll"
f <- TIO.readFile "radixtracefile"
setText re f
whileM_ (findNext re) $ do
a <- start re 0
putStrLn $ "last match at :"++(show a)
बिल्डिंग और चल रहा है:
$ ghc -O2 test-ICU.hs
[1 of 1] Compiling Main (test-ICU.hs, test-ICU.o)
Linking test-ICU ...
$ time ./test-ICU | wc -l
309
real 1m36.407s
user 1m36.090s
sys 0m0.169s
मैं ghc संस्करण 7.6.3 का उपयोग करता हूं। मुझे अन्य हास्केल रेगेक्स विकल्पों का परीक्षण करने का मौका नहीं मिला है। मुझे पता था कि मुझे जीईपी के साथ प्रदर्शन नहीं मिलेगा और इससे खुश होने के अलावा, लेकिन टीडीएफए और बाइटस्ट्रिंग के लिए 20 गुना धीमी है ... यह बहुत डरावना है। और मैं वास्तव में समझ नहीं पा रहा हूं कि यह क्यों है, क्योंकि मैं मूर्खतापूर्ण हूं कि यह देशी बैकएंड पर एक रैपर था ... क्या मैं किसी भी तरह से मॉड्यूल का सही ढंग से उपयोग नहीं कर रहा हूं?
(और चलो आईसीयू + पाठ कॉम्बो जो छत से गुजर रहा है का उल्लेख नहीं है)
वहाँ एक विकल्प है कि मैं अभी तक परीक्षण नहीं किया है कि मुझे खुश होगा है?
संपादित:
- Text.Regex.PCRE Data.ByteString साथ (संस्करण 0.94.4):
import Control.Monad.Loops
import Data.Maybe
import Text.Regex.PCRE
import qualified Data.ByteString as B
main = do
f <- B.readFile "radixtracefile"
matches :: [[B.ByteString]] <- f =~~ ".*504.*ll"
mapM_ (putStrLn . show . head) matches
बिल्डिंग और चल रहा है:
$ ghc -O2 test-PCRE.hs -XScopedTypeVariables
[1 of 1] Compiling Main (test-PCRE.hs, test-PCRE.o)
Linking test-PCRE ...
$ time ./test-PCRE | wc -l
309
real 0m1.442s
user 0m1.412s
sys 0m0.031s
बेहतर, लेकिन अभी भी ~ 7-ish के कारक के साथ ...
आप किस सटीक हास्केल कार्यान्वयन के बारे में बात कर रहे हैं? इससे काफी अंतर हो सकता है। – vonbrand
@ वोनब्रांड: स्निपेट्स का उल्लेख 'ghc -O2' है। क्या (कंपाइलर/लाइब्रेरी) संस्करण मायने रखता है, या आप क्या जानना चाहते हैं? – Bergi
@ वोनब्रांड: '$ ghc --version' 'शानदार ग्लासगो हास्केल संकलन प्रणाली, संस्करण 7.6.3' देता है। 'कैबल सूची regex-tdfa' देता है (अन्य चीजों के साथ)' regex-tdfa [...] स्थापित संस्करण: 1.2.1', और 'कैबल सूची टेक्स्ट-आईसीयू', 'टेक्स्ट-आईसीयू [...] स्थापित संस्करण : 0.7.0.1'। क्या वह जानकारी आप खोज रहे थे? मैं इस जानकारी को जोड़ने के लिए अपने प्रश्न को संपादित करूंगा। – gameboo