Использование Maruku (часть №5 заключительная)

Need for Speed

Вот и заканчивается начатый мной недавно цикл статей про Maruku. В этой части я измерю производительность Maruku и сравню её с другими подобными движками (RedCloth, BlueCloth).

Перед началом тестирования я взял Markdown разметку одной из моих статей, и перевёл её в Textile (это нужно для того чтобы RedCloth возвращал результирующую разметку максимально похожую на ту что выдаёт Maruku). BlueCloth точно так же как и Maruku использует Markdown, поэтому для него разметку менять не нужно.

И написал следующий тест:

require "rubygems"
require "maruku"
require "redcloth"
require "bluecloth"
require "benchmark"

article_maruku = File.new("article_maruku.txt").readlines.join("\n")
article_redcloth = File.new("article_redcloth.txt").readlines.join("\n")
article_bluecloth = File.new("article_bluecloth.txt").readlines.join("\n")

Benchmark.bm(10) do |b|
  b.report("Maruku") do
    1.upto(10) do
      Maruku.new(article_maruku).to_html
    end
  end
  b.report("RedCloth") do
    1.upto(10) do
      RedCloth.new(article_redcloth).to_html
    end
  end
  b.report("BlueCloth") do
    1.upto(10) do
      BlueCloth.new(article_bluecloth).to_html
    end
  end
end

Как видите ничего сложного, 10 раз запускаем каждый из конверторов дабы легко можно было посчитать среднее значение просто разделив время работы на 10 (или например прикинуть сколько секунд будут генерироваться 10 постов на главной странице моего блога).

И получаю следующие результаты:

                user     system      total        real
Maruku      0.670000   0.070000   0.740000 (  0.744552)
RedCloth    0.070000   0.010000   0.080000 (  0.071341)
BlueCloth   1.420000   0.000000   1.420000 (  1.426072)

Как видно самым быстрым оказался RedCloth что и не мудрено т.к. его лексический анализатор написан на C и это судя по всему позволяет ему более оптимальным способом обрабатывать строки и выделять из них токены используемые при построении выходной разметки.

Следом за ним идёт Maruku, что не может не радовать :) Работая примерно на 0.07 секунды медленнее чем RedCloth. Лексический анализатор у Maruku написан на Ruby, и скорее всего из-за этого он уступает RedCloth. На всякий случай я решил это проверить и написал такой вот код:

require "rubygems"
require "maruku"
require 'profiler'

article_maruku = File.new("article_maruku.txt").readlines.join("\n")

Profiler__::start_profile
  Maruku.new(article_maruku).to_html
Profiler__::stop_profile
Profiler__::print_profile($stdout)

который вывел следующий результат:

  %   cumulative   self              self     total
 time   seconds   seconds    calls  ms/call  ms/call  name
 26.94     7.01      7.01     4602     1.52    12.61  Array#each
 10.34     9.70      2.69       17   158.24   440.00  MaRuKu::In::Markdown::SpanLevelParser.read_span
  6.34    11.35      1.65    46427     0.04     0.05  Kernel.===
  6.23    12.97      1.62   115700     0.01     0.01  Kernel.hash
  5.34    14.36      1.39   106183     0.01     0.01  Fixnum#==
  4.07    15.42      1.06    63563     0.02     0.02  Fixnum#+
  2.73    16.13      0.71      507     1.40    35.01  REXML::XPathParser#expr

Как видно большая часть времени уходит на перебор элементов массива (что там происходит мне сложно гадать) и на вызов метода read_span который как раз и занимается обработкой входного потока.

Далее. BlueCloth как и Maruku использует Markdown, но обрабатывает его в два раза медленнее. Что и не мудрено т.к. проект не обновлялся в 2005 (хотя в августе этого года какие-то некрофилы сделали пару коммитов)

Выводы

Да, RedCloth работает быстрее, но всё же результаты которые показал Maruku тоже очень неплохие (для парсера на Ruby) и я надеюсь что Andrea Censi не забросит своё детище и с течением времени сократит разрыв в скорости работы между ним и RedCloth :) Пока что я могу посоветовать кешировать фрагменты кода которые генерируют разметку с помощью Maruku (я сделал так в этом блоге, и могу сказать что скорость построения главной страницы увеличилась на порядок)

На этом пока всё :)

P.S.

Исходный код тестов доступен по адресу: MarukuPerformance.zip.

Тэги: Maruku
Будь всегда в курсе последних новостей блога подписавшись на новости
в формате RSS. Присоединяйся!
* * *

Добавить новый комментарий

Доступные BB теги

*

* (не будет опубликован)

(если есть)

  • Multi CAPTCHA Refresh2
  • *

1. Проверьте комментарий перед отправкой
2. Все комментарии проходят модерацию перед публикацией в блоге