thedeemon: (Default)
[personal profile] thedeemon
Помня о том, какое бурление вызвало сравнение скорости Лиспа с другими языками в прошлом номере ПФП, прошу помощи зала не допустить несправедливости. Я сейчас доделываю сравнение скорости разных методов парсинга, сделал вариант на Хаскеле на базе Parsec2, и получившаяся скорость мне совсем не нравится. До этого на Хаскеле не писал, поэтому наверняка мог сильно налажать. Исходник (~70 строк) выложил здесь.
Суть программы - чтение карты формата OpenStreetMap и вычисление ее реальных границ - минимальных и максимальных значений широты и долготы встреченных точек. Собирал ее с GHC 6.8.3 и 6.10.1, Parsec 2.1.0.1, команда для сборки:
ghc -O2 -package parsec bounds.hs -o bounds

Сейчас скорость получается около 3 МБ/с.
Пример простой карты тут. Скорость тестировал на карте Сингапура (архив 1.2 МБ).

Прошу более опытных товарищей глянуть на исходник и указать на явные косяки. Можно ли заметно ускорить программу без сильных изменений описанной там грамматики?

Date: 2010-04-26 11:09 am (UTC)
From: (Anonymous)
Написал пару парсеров на Lua LPEG (http://www.inf.puc-rio.br/~roberto/lpeg/lpeg.html) - может, пригодится для сравнения. Получилось быстрее, чем на Хаскеле(неск. раз) - при этом все работает на VM.

"Grammar 1" - более-менее честный XML парсер, "Grammar 2" оптимизирован
в предложенном стиле (стал раза в 2 быстрее).

Код на Github (http://gist.github.com/379183)

-- PEG Grammar 1:
local GG1 = [[
  osm    <- '<?xml' (!'?' .)+ '?>' <xml> <ws>
  xml    <- <node>* -> {}
  node   <- <ws> '<' {:tag: <name> :} <param>*
            <ws> ('/>' / '>' <xml> <ws> '</' <ws> =tag <ws> '>')
  param  <- (<ws> <name> '=' <string> <ws>) -> processData
  string <- '"' { (!'"' .)* } '"'
  name   <- { %w+ }
  ws     <- %s*
]]

-- PEG Grammar 2:
local GG2 = [[
  osm     <- ((<ws> '<' (<node> / <tag>))*)  <ws>
  node    <- 'node' <param>* <ws> <endnode>
  endnode <- '/>'
           / (!'</node>' .)* '</node>'
  param   <- (<ws> <name> '=' <string> <ws>) -> processData
  tag     <- (!'>' .)* '>'
  string  <- '"' { (!'"' .)* } '"'
  name    <- { %w+ }
  ws      <- %s*
]]

Date: 2010-04-26 11:24 am (UTC)
From: [identity profile] thedeemon.livejournal.com
Спасибо большое!
Попробую запустить и включить в сравнение.

Date: 2010-05-05 08:00 am (UTC)
From: [identity profile] thedeemon.livejournal.com
Глянул на LPEG, там всю работу делает Си-шный модуль, на Lua только интерфейс к нему. Собрать его под винду у меня пока не вышло, так что сделать замер пока не могу.

Profile

thedeemon: (Default)
Dmitry Popov

December 2025

S M T W T F S
 12 3456
789101112 13
14151617181920
21222324252627
28293031   

Most Popular Tags

Page Summary

Style Credit

Expand Cut Tags

No cut tags
Page generated Jan. 29th, 2026 07:03 am
Powered by Dreamwidth Studios