defmodule Test1 do # import ExProf.Macro import Xpeg def time(what, f) do #Task.start(fn -> {t1, _} = :erlang.statistics(:runtime) r = f.() {t2, _} = :erlang.statistics(:runtime) IO.puts("#{what} #{(t2-t1)/1000}") r #end) end def do_prof(lines, pid) do i = :erlang.process_info(pid, :current_stacktrace) #{_, {_, _, _, line}} = i line = i lines = Map.update(lines, line, 1, &(&1+1)) receive do :stop -> Enum.sort(lines, fn {_, a}, {_, b} -> a > b end) |> Enum.take(20) |> IO.inspect() after 0 -> do_prof(lines, pid) end end def prof(f) do pid = self() {:ok, tracer_pid} = Task.start(fn -> do_prof(%{}, pid) end) f.() send(tracer_pid, :stop) end #_ = """ def performance do p = Xpeg.peg Json, dump_code: false, trace: false, dump_ir: false do # White space S <- star({' ', '\t', '\r', '\n'}) # Basic atoms True <- "true" * fn cs -> [true | cs] end False <- "false" * fn cs -> [false | cs] end Null <- "null" * fn cs -> [nil | cs] end # Parse strings - needs proper escaping for the capture Xdigit <- {'0'..'9', 'a'..'f', 'A'..'F'} Unicode_escape <- 'u' * Xdigit[4] Escape <- '\\' * ({'"', '\\', '/', 'b', 'f', 'n', 'r', 't'} | Unicode_escape) String_body <- star(Escape) * star(+({'\x20'..'\x7f'} - {'"'} - {'\\'}) * star(Escape)) String <- '"' * str(String_body) * '"' # Numbers are converted to Elixir float Minus <- '-' Int_part <- '0' | {'1'..'9'} * star({'0'..'9'}) Fract_part <- "." * +{'0'..'9'} Exp_part <- {'e', 'E'} * opt({'+', '-'}) * +{'0'..'9'} Number <- float(opt(Minus) * Int_part * opt(Fract_part) * opt(Exp_part)) # Objects are represented by an Elixir map Obj_pair <- S * String * S * ":" * Value * fn [v, k, obj | cs] -> [Map.put(obj, k, v) | cs] end Object <- '{' * fn cs -> [%{} | cs] end * (Obj_pair * star("," * Obj_pair) | S) * "}" # Arrays are represented by an Elixir list Array_elem <- Value * fn [v, a | cs] -> [[v | a] | cs] end Array <- "[" * fn cs -> [[] | cs] end * (Array_elem * star("," * Array_elem) | S) * "]" * fn [a | cs] -> [Enum.reverse(a) | cs] end # All possible JSON values Value <- S * (Number | String | Object | Array | True | False | Null) * S # The toplevel json document is a value with no other trailing characters Json <- Value * !1 end #Module.create(Koe, p, Macro.Env.location(__ENV__)) s = File.read!("/tmp/json-32M.bzip2.out") s2 = to_charlist(s) Poison.decode!(s) Poison.decode!(s) time("poison", fn -> Poison.decode!(s) end) time("jason", fn -> Jason.decode!(s) end) time("xpeg", fn -> #prof("xpeg", fn -> Xpeg.match(p, s2) #end) end) :nop #nil end #""" def run() do p = peg Flop, dump_code: false, trace: false, dump_ir: false, userdata: false do Flop <- str(Flip) Flip <- 1 end s = "123456" Xpeg.match(p, s) end end