Возможно вы искали: 'Witness, The'

May 15 2025 19:29:50
  • Как сделать 8Gamers.Ru домашней страницей?
  • Игры
    • База данных по играх
    • Игровые новости
    • Игровая индустрия
    • Обзоры на игры
    • Прохождения игр
    • Гайды к играм
    • Превью о играх
    • Игровые тизеры
    • Игровые арты
    • Игровые обои
    • Игровые скриншоты
    • Игровые обложки
    • Игровые трейлеры
    • Игровое видео
    • Вышедшие игры
    • Ближайшие релизы игр
  • Кино и ТВ
    • База данных по кино
    • Статьи о кино
    • Постеры
    • Кадры из кино
    • Кино трейлеры
    • Сегодня в кино
    • Скоро в кино
  • Комиксы и манга
    • Манга по алфавиту
    • База данных по комиксах
    • Читать онлайн комиксы
    • Читать онлайн манга
    • База персонажей
  • Читы и коды
    • Чит-коды для PC игр
    • Чит-коды для консольных игр
    • Трейнеры
    • Коды Game Genie
  • Моддинг
    • Модификации
    • Карты к играм
    • Программы для моддинга
    • Статьи о моддинге
  • Геймдев
    • Всё о создании игр
    • Список движков
    • Утилиты в помощь игроделу
    • Конструкторы игр
    • Игровые движки
    • Библиотеки разработки
    • 3D-модели
    • Спрайты и тайлы
    • Музыка и звуки
    • Текстуры и фоны
  • Рецензии
    • Игры
    • Кино
    • Аниме
    • Комиксы
    • Мангу
    • Саундтреки
  • Саундтреки
    • Лирика
  • Файлы
    • Патчи к играм
    • Русификаторы к играм
    • Сохранения к играм
    • Субтитры к кино
  • Медиа
    • Видео
    • Фото
    • Аудио
    • Фан-арты
    • Косплей
    • Фото с виставок
    • Девушки из игр
    • Рисунки
    • Рисуем онлайн
    • Фотохостинг
  • Юмор
    • Анекдоты
    • Афоризмы
    • Истории
    • Стишки и эпиграммы
    • Тосты
    • Цитаты
  • Флеш
    • Азартные
    • Аркады
    • Бродилки
    • Гонки
    • Для девочек
    • Для мальчиков
    • Драки
    • Квесты
    • Леталки
    • Логические
    • Мультфильмы
    • Открытки
    • Приколы
    • Разное
    • Спорт
    • Стратегии
    • Стрелялки
Статистика

Статей: 87772
Просмотров: 96111483
Игры
Injustice:  Gods Among Us
Injustice: Gods Among Us
...
Dark Souls 2
Dark Souls 2
Dark Souls II - вторая часть самой хардкорной ролевой игры 2011-2012 года, с новым героем, сюжето...
Battlefield 4
Battlefield 4
Battlefield 4 - продолжение венценосного мультиплеер-ориентированного шутера от первого ли...
Кино
Steins;Gate
Steins;Gate
Любители японской анимации уже давно поняли ,что аниме сериалы могут дать порой гораздо больше пи...
Ку! Кин-дза-дза
Ку! Кин-дза-дза
Начинающий диджей Толик и всемирно известный виолончелист Владимир Чижов встречают на шумной моск...
Обзоры на игры
• Обзор Ibara [PCB/PS2] 18357
• Обзор The Walking ... 18801
• Обзор DMC: Devil M... 19879
• Обзор на игру Valk... 15877
• Обзор на игру Stars! 17764
• Обзор на Far Cry 3 17948
• Обзор на Resident ... 16024
• Обзор на Chivalry:... 17508
• Обзор на игру Kerb... 17981
• Обзор игры 007: Fr... 16619
Превью о играх
• Превью к игре Comp... 17960
• Превью о игре Mage... 14464
• Превью Incredible ... 14721
• Превью Firefall 13479
• Превью Dead Space 3 16334
• Превью о игре SimC... 14730
• Превью к игре Fuse 15442
• Превью Red Orche... 15542
• Превью Gothic 3 16343
• Превью Black & W... 17354
Главная » Статьи » Разное » Оптимальная обработка XML+XSL на Ruby (xml ruby benchmark)

Оптимальная обработка XML+XSL на Ruby (xml ruby benchmark)

Ключевые слова: xml, ruby, benchmark, (найти похожие документы)

From: Александр Неткачев <http://devlink.crimea.ua>
Date: Mon, 20 Sep 2004 18:21:07 +0000 (UTC)
Subject: Оптимальная обработка XML+XSL на Ruby

Оригинал: http://devlink.crimea.ua/articles/article.php?article_id=21

Обработка XML+XSL на Ruby

Александр Неткачев
19.05.2004

- Введение
- Обработка XML
- Постановка задачи
- Решение задачи методами rexml
- Решение задачи c помощью libgdome-ruby
- Победитель - Оболочка для libxml
- Вкусность на последок: XSL трансформация с использованием libxslt.
- Заключение



Введение

Изучая новую технологию всегда хочется применить её для решения
текущих задач. А одна из основных задач современного программиста -
это составление программ, которые собирают данные из нескольких
систем, обрабатывают их и выдают результат. Это напоминает сборку
модели из готовых деталей конструктора, где роль крупных блоков
играют, например, базы данных, а в качестве соединительных деталей
используется простой и гибкий язык программирования.

Основными источниками данных в современном программировании являются
текстовые файлы, базы данных и файлы в XML формате. А обрабатывать и
соединять их друг с другом попробуем с помощью скриптового языка
программирования Ruby.

Обработка текстовых файлов не представляет особой сложности, поскольку
возможности Ruby в области поддержки регулярных выражений делают
разбор любого текстового файла не очень сложной задачей. А вот
обработку XML документов можно рассмотреть подробнее.


Обработка XML

Для обработки XML существует как стандартное решение в виде rexml
библиотеки, которая входит в Ruby 1.8, так и альтернативные варианты,
которые в большинстве случаев представляют собой обертки (wrappers)
вокруг С библиотек libxml2 и производных от неё.

Поиск расширений Ruby для обработки XML документов
(http://raa.ruby-lang.org/search.rhtml?search=xml и на
http://libxml.org) приводит к множеству библиотек. Но отбросив все
alpha, unstable, experimental и тому подобное получаем совсем
небольшой список:

* libgdome-ruby (beta): http://raa.ruby-lang.org/project/libgdome-ruby/
* libxml (production quality): http://raa.ruby-lang.org/project/libxml/
* libxslt (working): [18]http://raa.ruby-lang.org/project/libxslt/


Я попробую сравнить найденные библиотеки между собой в решении простой
задачи.


Постановка задачи

Программа 1. Генерация XML документа (generateXml.rb)

puts '<nodes>'
1000.times {|i| puts '<node sum="1" avg="' + i.to_s + '">Node sample text</node>'}
puts '</nodes>'


Задача

В сгенерированном программой 1 XML документе пройтись по всем узлам,
посчитать сумму атрибутов sum и найти среднее значение атрибута avg.


Решение задачи методами rexml

Удобный API компенсируется недостатком производительности. Дело в том,
что библиотека rexml написана на самом Ruby, производительность
которого относительно C/C++ не велика. Также можно отметить, что XSL
трансформацию библиотека rexml не поддерживает.

Программа 2. Решение задачи (parseXml_2.rb)

require "rexml/document"
include REXML

xmlStr = ''

ARGF.each {|line| xmlStr << line}

doc = Document.new xmlStr
sum = avgSum = count = 0
doc.elements.each('/nodes/node') { |e|
count += 1
sum += e.attributes['sum'].to_i
avgSum += e.attributes['avg'].to_i
}
puts "count(node): #{count}, sum(sum): #{sum}, avg(avg): #{avgSum/count}"


Определение времени выполнения и результат

$ time ruby generateXml.rb | ruby parseXml_2.rb
count(node): 1000, sum(sum): 1000, avg(avg): 499

real 0m6.035s
user 0m5.450s
sys 0m0.590s


Итого - 6 секунд длился разбор документа на моем компьютере.

model name : Celeron (Mendocino)
cpu MHz : 534.552
cache size : 128 KB
bogomips : 1064.96



Решение задачи c помощью libgdome-ruby

libgdome-ruby-0.3.tar.bz2 представляет собой оболочку вокруг Gdome2
библиотеки. Gdome2 - это реализация W3C DOM Level2 на C. Поэтому для
установки libgdome-ruby надо сначала установить Gdome2 библиотеку.

Тут и пригодится Portage от Gentoo Linux:

$ emerge dev-libs/gdome2


Для ручной установки замечу, что Gdome2 зависит от библиотек libxml2
(http://xmlsoft.org/) и glib (http://www.gtk.org/). Сам Gdome2
можно скачать с сайта http://phd.cs.unibo.it/gdome2/

Далее переходим к установке Ruby расширения libgdome-ruby:

$ tar -xjf libgdome-ruby-0.3.tar.bz2
$ cd libgdome-ruby-0.3
$ ruby extconf.rb
$ make
$ make install


Программа 3. Решение задачи с использованием Gdome2 (parseXml_3.rb)

require "gdome"

xmlStr = ''
ARGF.each {|line| xmlStr << line}

domImpl = Dom::implementation
doc = domImpl.createDocFromMemory(xmlStr, 0)

sum = avgSum = count = 0
children = doc.documentElement.childNodes
(0...children.length).each{ |i|
el = children.item(i)
if (el.kind_of?(Dom::Element))
count += 1
sum += el.getAttribute('sum').to_i
avgSum += el.getAttribute('avg').to_i
end
}
puts "count(node): #{count}, sum(sum): #{sum}, avg(avg): #{avgSum/count}"


Можно задать резонный вопрос: почему я не использовал XPath, для
выборки узлов /Nodes/Node. Отвечаю - в библиотеке libgdome-ruby XPath
не реализовали, хотя в самой Gnome2 XPath присутствует в полной мере.
Отметим, что XSL трансформация не реализована в Gdom2 и, как
следствие, в libgdome-ruby тоже.

Время выполнения задачи с использованием gdome значительно лучше, чем
с rexml:

$ time ruby generateXml.rb | ruby parseXml_3.rb
count(node): 1000, sum(sum): 1000, avg(avg): 499

real 0m0.334s
user 0m0.300s
sys 0m0.030s



Победитель - Оболочка для libxml

Заявленая автором оболочки поддержка XPath и простые и напоминающие
rexml интерфейсы весьма привлекательны. Библиотека зависит от libm
(математические функции), libz (zlib), libiconv и, естественно, от
libxml2. Как правило, все эти библиотеки в современных дистрибутивах
есть, поэтому переходим без лишних слов к установке и реализации нашей
задачи:

Устанавливаем скачаный файл libxml-0.3.4.tar.gz:

$ tar -xzf libxml-0.3.4.tar.gz
$ cd libxml-0.3.4
$ ruby extconf.rb
$ make && make install


Программа 4. Решение задачи с использованием libxml (parseXml_4.rb)

require 'xml/libxml'

xmlStr = ''
ARGF.each {|line| xmlStr << line}

xp = XML::Parser.new()
xp.string = xmlStr
doc = xp.parse

sum = avgSum = count = 0
doc.find('/nodes/node').each { |e|
count += 1
sum += e['sum'].to_i
avgSum += e['avg'].to_i
}
puts "count(node): #{count}, sum(sum): #{sum}, avg(avg): #{avgSum/count}"


Традиционный замер времени выполнения:

$ time ruby generateXml.rb | ruby parseXml_4.rb
count(node): 1000, sum(sum): 1000, avg(avg): 499

real 0m0.210s
user 0m0.180s
sys 0m0.030s


Можно сказать только одно: Кубок победителю :-) Ruby libxml extention
показал лучший результат по эффективности и удобству интерфейсов.


Вкусность на последок: XSL трансформация с использованием libxslt.

Для установки libxslt требуется, что бы libxml уже было установлено и
header файлы находились в директории ../libxml относительно директории
с libxslt.

$ ln -s libxml-0.3.4 libxml
$ tar -xzf libxslt-0.3.4.tar.gz
$ cd libxslt-0.3.4
$ ruby extconf.rb
$ make && make install


Для примера предположим, что нам надо вывести список файлов в
директории. Довольно простая задача, но при этом требуется разделить
данные от представления. Это может понадобится, например, если дизайн
представления будет менятся.

Примерная реализация: получаем список файлов в директории, строим из
списка файлов XML и трансформируем его в HTML при помощи XSL.

XSL файл для трансформации (filesToHtml.xsl):

<?xml version="1.0" ?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:template match="/">
<html><body><ul>
<xsl:for-each select="/files/file">
<li><xsl:value-of select="."/></li>
</xsl:for-each>
</ul></body></html>
</xsl:template>
</xsl:stylesheet>


Ruby скрипт, осуществляющий трансформацию (buildFileList.rb):

require 'xml/libxml'
require 'xml/libxslt'

xslt = XML::XSLT.file('filesToHtml.xsl')

xp = XML::Parser.new

# замечатальный пример компакности Ruby - выполнение shell комманды,
# проход по строкам её результата и составление XML в одной строке :-)
xp.string = `ls`.inject('<files>') { |xml, file|
xml << '<file>' << file.chomp << '</file>' } + '</files>'
xslt.doc = xp.parse

s = xslt.parse
s.apply
s.print


Проверяем производительность:

$ time ruby buildFileList.rb
... результат трансформации пропущен ...
real 0m0.064s
user 0m0.030s
sys 0m0.030s



Заключение

Резюмируя, можно сказать, что Ruby на данный момент обладает
достаточными средствами для обработки XML документов и выполнения XSL
трансформаций. Он соединяет лучшее, что было сделано в
программировании - удобный синтаксис языка вместе с использованием
существующих библиотек. Полученное в результате решение отличается
простотой и легкостью в изучении, что делает его эффективным
инструментом для программистов.
794 Прочтений •  [Оптимальная обработка XML+XSL на Ruby (xml ruby benchmark)] [08.05.2012] [Комментариев: 0]
Добавил: Ukraine Vova
Ссылки
HTML: 
[BB Url]: 
Похожие статьи
Название Добавил Добавлено
• Оптимальная обработка XML+XSL на Ru... Ukraine Vova 08.05.2012
Ни одного комментария? Будешь первым :).
Пожалуйста, авторизуйтесь для добавления комментария.

Проект входит в сеть сайтов «8Gamers Network»

Все права сохранены. 8Gamers.NET © 2011 - 2025

Статьи
Рецензия на Pressure
Рецензия на Pressure
Чтобы обратить на себя внимание, начинающие маленькие разработчики, как правило, уходят в жанры, ...
Рецензия на Lost Chronicles of Zerzura
Рецензия на Lost Chron...
Игры, сделанные без любви и старания, похожи на воздушный шар – оболочка есть, а внутри пусто. Lo...
Рецензия на The Bridge
Рецензия на The Bridge
«Верх» и «низ» в The Bridge — понятия относительные. Прогуливаясь под аркой, можно запросто перей...
Рецензия на SimCity
Рецензия на SimCity
Когда месяц назад состоялся релиз SimCity, по Сети прокатилось цунами народного гнева – глупые ош...
Рецензия на Strategy & Tactics: World War 2
Рецензия на Strategy &...
Название Strategy & Tactics: World War II вряд ли кому-то знакомо. Зато одного взгляда на ее скри...
Рецензия на игру Scribblenauts Unlimited
Рецензия на игру Scrib...
По сложившейся традиции в информационной карточке игры мы приводим в пример несколько похожих игр...
Рецензия на игру Walking Dead: Survival Instinct, The
Рецензия на игру Walki...
Зомби и продукция-по-лицензии — которые и сами по себе не лучшие представители игровой биосферы —...
Обратная связь | RSS | Донейт | Статистика | Команда | Техническая поддержка