Помня о том, какое бурление вызвало сравнение скорости Лиспа с другими языками в прошлом номере ПФП, прошу помощи зала не допустить несправедливости. Я сейчас доделываю сравнение скорости разных методов парсинга, сделал вариант на Хаскеле на базе Parsec2, и получившаяся скорость мне совсем не нравится. До этого на Хаскеле не писал, поэтому
(
Read more... )
Comments 41
"Grammar 1" - более-менее честный XML парсер, "Grammar 2" оптимизирован
в предложенном стиле (стал раза в 2 быстрее).
Код на Github
-- PEG Grammar 1:
local GG1 = [[
osm <- ''
xml <- * -> {}
node <- '<' {:tag: :}
*
('/>' / '>' ' =tag '>')
param <- ( '=' ) -> processData
string <- '"' { (!'"' .)* } '"'
name <- { %w+ }
ws <- %s*
]]
-- PEG Grammar 2:
local GG2 = [[
osm <- (( '<' ( / ))*)
node <- 'node'
*
endnode <- '/>'
/ (!'' .)* ''
param <- ( '=' ) -> processData
tag <- (!'>' .)* '>'
string <- '"' { (!'"' .)* } '"'
name <- { %w+ }
ws <- %s*
]]
Reply
Попробую запустить и включить в сравнение.
Reply
Reply
после гугления нашлось вот такое:
http://www.serpentine.com/blog/2010/03/03/whats-in-a-parsing-library-1/
http://www.serpentine.com/blog/2010/03/03/whats-in-a-parser-attoparsec-rewired-2/
http://hackage.haskell.org/package/attoparsec
может стоит сравнить? :)
Reply
Reply
import Text.ParserCombinators.Parsec
import qualified Text.ParserCombinators.Parsec.Token as Token
import Text.ParserCombinators.Parsec.Language (emptyDef)
import System.CPUTime
import System.Environment
data Bounds = Bounds { minlat, maxlat, minlon, maxlon :: !Double } deriving (Show)
update_lat lat bnd = bnd {
minlat = min lat (minlat bnd), maxlat = max lat (maxlat bnd) }
update_lon lon bnd = bnd {
minlon = min lon (minlon bnd), maxlon = max lon (maxlon bnd) }
lexer = Token.makeTokenParser emptyDef
p_positive_float = Token.float lexer
p_float = ((char '-' >> return negate) <|> (return id)) >>= \f -> p_positive_float >>= (return . f)
latlon = do
param <- do
name <- many1 letter ( ... )
Reply
Reply
Reply
Попробуй вот эту версию http://community.haskell.org/~aslatter/code/parsec/cps/ (см. тред http://www.mail-archive.com/haskell-cafe@haskell.org/msg67893.html )
Reply
Reply
Reply
Если с ним собирать программу без изменений, то работает в 2 раза медленней, чем c 2.1.0.1.
Если переписать на использование ByteString, то в 3 раза медленней.
Reply
Reply
разумеется для горячего файлового кэша плюсы тоже сpu bound - так что можно еще в пару раз.
перф. для меня это хобби для отдыха :) Если вспомню с какой стороны парсеры можно будет пойти на спортивный результат :D
Reply
Reply
правда и хаскельный вариант на хрюше 32 упал с
bounds.exe: out of memory
интересно под Win64 есть возможность собрать ваш пример на хаскеле? или только 32 ?
Reply
Leave a comment