Использование Maruku (часть №5 заключительная)
-
09 октября 2008 23:19
-
Комментарии

Вот и заканчивается начатый мной недавно цикл статей про 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.
в формате RSS. Присоединяйся!
Добавить новый комментарий
Вы можете использовать следующие BBCode теги в комментариях:
| BBCode тег | Результат |
|---|---|
| [b]Жирный текст[/b] | Жирный текст |
| [i]Курсив[/i] | Курсив |
| [u]Подчёркнутый текст[/u] | Подчёркнутый текст |
| [url]http://example.com[/url] | http://example.com |
| [url=http://example.com]Example[/url] | Example |
|
[code]for message in @messages puts message.name end[/code] |
|
|
[quote] IE6 must die! [/quote] |
IE6 must die! |

