Haskell, Parsec 2 и тормоза

Apr 26, 2010 01:14

Помня о том, какое бурление вызвало сравнение скорости Лиспа с другими языками в прошлом номере ПФП, прошу помощи зала не допустить несправедливости. Я сейчас доделываю сравнение скорости разных методов парсинга, сделал вариант на Хаскеле на базе Parsec2, и получившаяся скорость мне совсем не нравится. До этого на Хаскеле не писал, поэтому ( Read more... )

haskell, fp, parsers

Leave a comment

Comments 41

anonymous April 26 2010, 11:09:39 UTC
Написал пару парсеров на Lua LPEG - может, пригодится для сравнения. Получилось быстрее, чем на Хаскеле(неск. раз) - при этом все работает на VM.

"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

thedeemon April 26 2010, 11:24:12 UTC
Спасибо большое!
Попробую запустить и включить в сравнение.

Reply

thedeemon May 5 2010, 08:00:59 UTC
Глянул на LPEG, там всю работу делает Си-шный модуль, на Lua только интерфейс к нему. Собрать его под винду у меня пока не вышло, так что сделать замер пока не могу.

Reply


little_arhat April 26 2010, 13:19:24 UTC
antilamer недавно давал наводку на "new ghc io manager" -- который скоряет IO.
после гугления нашлось вот такое:
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

thedeemon April 26 2010, 15:10:46 UTC
Спасибо за наводку! Если останется время, можно будет попробовать.

Reply


thesz April 26 2010, 20:37:30 UTC

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

thedeemon April 27 2010, 03:58:32 UTC
Спасибо!

Reply

thesz April 27 2010, 08:40:29 UTC
Но я ещё посмотрю, что можно сделать.

Reply


antilamer April 27 2010, 09:12:51 UTC
Вообще-то Parsec 3 был очень медленный, но потом его ускорили до скорости Parsec 2. Но, вроде бы, еще не выложили в официальный репозиторий.

Попробуй вот эту версию http://community.haskell.org/~aslatter/code/parsec/cps/ (см. тред http://www.mail-archive.com/haskell-cafe@haskell.org/msg67893.html )

Reply

nponeccop April 27 2010, 13:23:37 UTC
Недавно вышел 3.1, может, это он и есть?

Reply

antilamer April 27 2010, 13:25:36 UTC
Точно, оно.

Reply

thedeemon May 7 2010, 17:53:24 UTC
Попробовал Parsec 3.1.0.
Если с ним собирать программу без изменений, то работает в 2 раза медленней, чем c 2.1.0.1.
Если переписать на использование ByteString, то в 3 раза медленней.

Reply


sleepy_drago April 28 2010, 07:14:46 UTC
ну мне как сантехнику было интересно про перформанс - парсеры я уже лет семь не видел ( ... )

Reply

sleepy_drago April 28 2010, 08:20:12 UTC
sorry прогнал почти обо всем кроме спасибо :)
разумеется для горячего файлового кэша плюсы тоже сpu bound - так что можно еще в пару раз.
перф. для меня это хобби для отдыха :) Если вспомню с какой стороны парсеры можно будет пойти на спортивный результат :D

Reply

thedeemon April 28 2010, 08:49:47 UTC
Какой-то спортивный интерес в этом есть, конечно, но конкретно в данной задаче чтение всего файла не выход: карта России уже больше 2 гигов.

Reply

sleepy_drago April 28 2010, 12:49:40 UTC
да карта России представляет собой определенный вызов :) 2844М.
правда и хаскельный вариант на хрюше 32 упал с
bounds.exe: out of memory

интересно под Win64 есть возможность собрать ваш пример на хаскеле? или только 32 ?

Reply


Leave a comment

Up