|
Проект "ApolloSAX"
|
|||
---|---|---|---|
#18+
petalvik, Мы говорим с Вами об одном и том же только разными словами Рассуждая о SAX я рассматриваю данную статью: http://ru.wikipedia.org/wiki/SAX "SAX-парсинг" в моём понимании - это процесс распарсивания XML, при котором каждая прочитанная единица отправляется системе в соответствующий калбек. Далеко не всегда удобный способ, но зато самый быстрый - потому что требует минимального потребления памяти и не содержит логики увязывания элементов и атрибутов между собой "DOM-парсинг" в моём понимании - это процесс распарсивания XML, при котором получится иерархическое представление XML-документа, где в простейшем случае элементы будут содержать имя, список атрибутов, значение элемента, список элементов-детей и указатель на элемент-отца; атрибуты - это пара имя/значение. "DOM-парсинг" очень просто построить на основе "SAX-парсинга". "XML-Binding" - это высокоуровневый механизм для работы с XML-документами. Но это надстройка над DOM. > назову его pull-парсер, т. к. он не выталкивает данные, а их нужно вытягивать я таки думаю, что там в основе всё тот же SAX-парсер. Ибо вообще сложно реализовать парсер, который разбирает семантику документа, отслеживает ошибки, перекодирует строки из XML в обычные, улаживает вопросы с кодировкой... Зачем для всего .NET писать несколько парсеров, когда можно написать производительный один, отладить его, и использовать для всех остальных разного уровня задач. Судя по Вашему описанию "pull-парсер" это высокоуровневая надстройка над обычным парсером (который я называю SAX) > Чтобы ускорить клиентский код, имеется таблица имён (NameTable), > куда можно занести заранее имена элементов, которые будут в xml, > и в итоге сравнивать уже не строки (что медленно), а ссылки. вот мы и подошли к вопросу, который я описывал ещё в самом первом своём сообщении ветки. Для того чтобы оперативно идентифицировать строки, правильнее использовать не сравнения строк, а сравнения ID-констант. В приведённом Вами примере используются не инты, а ссылки. Я о чём и говорю. "NameTable" это механизм отнесения строки к какому-то идентификатору. Для подобных задач хорошо зарекомендовали себя хеш-таблицы. Я сам очень часто использую хеш-таблицы, в том числе и для идентификации строк. Но! Когда полный список необходимых тебе идентификаторов известен ещё до компиляции, существует в разы более эффективный способ их распознавания. Не нужно выполнять hash-функцию, не нужно хранить и управлять хеш-массивом, не нужно сравнивать строку со строкой в массиве. Я разработал утилиту, которая генерирует код, позволяющий однозначно идентифицировать и с максимальной скоростью. Опять таки посмотрите первое сообщение. Там 6 строк, определяющихся моментально. А может быть сколько угодно. > Опять же, приведу в пример дотнетовский pull-парсер - он тщательно вылизан, > с кучей ручных оптимизаций, и работает настолько быстро (бьюсь об заклад, вам его не побить ;) ) я не первый день живу на бренной земле :) и подобных выражений выслушал уже не один десяток ) и когда проводится очередной тест, на котором моя реализация побеждает в разы, вместо дико восторженных возгласов "отныне ты наш бог и сенсей" я слышу что-то типа "ну для данной задачи особо то дополнительная производительность и не нужна, вот ты столько времени потратил, а мог взять стандартное решение, вот ты реализовал на ассемблере, но твоё решение не кроссплатформенное". Люди редко могут отходить от зарекомендовавших себя подходов. Люди редко способны разглядеть истинные перспективы. (Русские) люди редко искренне порадуются классным идеям других людей. И почти никогда не признают превосходство коллеги над собой Буквально неделю назад три дня бился над одним тестовым проектом. Ребята работают в какой-то крупной конторе, в которой в частности нужно делать мегакрутой поиск. От СУБД отказались ввиду специфики. У конкурентов поиск идёт полторы минуты, у них около 6 секунд. Ну так и вот. Присылают им множество баз, по которым собственно и нужно проводить поиск. Была идея объединить все базы в одну и работать с ней. Написали прогу, она справлялась с задачей 2 часа. Сложность в том, что в базах происходит частое дублирование ключей, и объединение по сути предполагает поиски и в случае нахождения - объединение данных. Оказалось что 2 часа это очень много. То ли баз планируется иметь ещё больше, то ли обновления частые. Не суть. Решили реализовать поиск по нескольким базам, а не по одной общей. Потом ради интереса, чувак, который эту утилиту разрабатывал, решил её максимально оптимизировать. Долго с ней мучился, в итоге выдал около 10 минут. Чем был безмерно горд. Я сказал, что моя стихия это оптимизации, и у меня наверняка такая утилита будет работать минуту :). В общем он дал мне исходники и данные. Я увидел несколько слабых мест и оптимизировал целых три дня, выжимал максимум. Получилась 1:12. И знаете что по итогу он мне сказал? "Ну респект конечно. Но разница всёравно небольшая". Конечно они не стали использовать эту утилиту, ибо уже реализован многобазный поиск. Но мне кажется такая реализация достойна чуть большей похвалы ). Ибо работала бы изначально такая утилита минуту-двенадцать, а не 2 часа - не было бы необходимости разрабатывать многобазную архитектуру ... |
|||
:
Нравится:
Не нравится:
|
|||
02.02.2013, 13:51 |
|
Проект "ApolloSAX"
|
|||
---|---|---|---|
#18+
_Vasilisk_ я честно говоря не понял, где я Вас обидел, унизил, оскорбил. К чему такая реакция ? ... |
|||
:
Нравится:
Не нравится:
|
|||
02.02.2013, 13:52 |
|
Проект "ApolloSAX"
|
|||
---|---|---|---|
#18+
_Vasilisk_Перестаньте кормить тролля. Вы разве не видите, что человек неадекватный? Тс-с! Не спугни... :D ... |
|||
:
Нравится:
Не нравится:
|
|||
02.02.2013, 18:26 |
|
Проект "ApolloSAX"
|
|||
---|---|---|---|
#18+
мне прям стало интересно с каких пор желание, умение и опыт делать качественное программное обеспечение стало проявлением неадекватности ) а вообще извольте извиниться если вы чего то не догоняете - это не повод оскорблять меня неадекватом ... |
|||
:
Нравится:
Не нравится:
|
|||
02.02.2013, 18:41 |
|
Проект "ApolloSAX"
|
|||
---|---|---|---|
#18+
SOFT FOR YOUя таки думаю, что там в основе всё тот же SAX-парсер. Нет. Из pull-парсера легко сделать sax. Наоборот - нельзя. В основе парсинга лежит лексер. Он выдаёт поток токенов. Для xml этот токены должны соответствовать Xml Information Set. Что с ним будет делать парсер (принимающий токены от лексера или имеющий его в своём составе) - дело второстепенное. Он может зажигать события (SAX) или просто предлагать информацию об элементах xml (тот самый InfoSet) клиенту. Из вашего описания невозможно толком ничего понять. На сём я пока прекращаю дискуссию. Подожду готовый пример парсера, который можно запустить, пощупать, испытать в деле. Готов поучаствовать в его тестировании, высказывая обоснованную критику и пожелания по доработке. ... |
|||
:
Нравится:
Не нравится:
|
|||
02.02.2013, 18:42 |
|
Проект "ApolloSAX"
|
|||
---|---|---|---|
#18+
Признаком неадекватности является расхваливание на все лады того, чего еще нет, и сравнением в его же пользу с тем, что уже есть и прекрасно себя зарекомендовало. ... |
|||
:
Нравится:
Не нравится:
|
|||
02.02.2013, 18:48 |
|
Проект "ApolloSAX"
|
|||
---|---|---|---|
#18+
petalvikВ основе парсинга лежит лексер. Он выдаёт поток токенов. Для xml этот токены должны соответствовать Xml Information Set. Что с ним будет делать парсер (принимающий токены от лексера или имеющий его в своём составе) - дело второстепенное. Он может зажигать события (SAX) или просто предлагать информацию об элементах xml (тот самый InfoSet) клиенту. и в чём состоит разница по Вашему между "лексером" и SAX ? в любом случае срабатывает событие, идентифицирующее о начале элемента, о поступившем атрибуте, поступившем значение элемента, о конце элемента. Точь в точь функционал SAX. Над которым уже можно стоить надстройки petalvikИз вашего описания невозможно толком ничего понять. что конкретно Вам не удалось понять ? я написал, чтобы было понятно любому школьнику. Может быть Вы не знаете, что такое хеш-массив или ID-константа ? ... |
|||
:
Нравится:
Не нравится:
|
|||
02.02.2013, 18:51 |
|
Проект "ApolloSAX"
|
|||
---|---|---|---|
#18+
Antonariy, а по моему признак неадекватности - совать нос куда только можно. по поводу и без по поводу расхваливания мой опыт позволяет на уровне алгоритма и планируемой реализации определить, что быстро, что нет, что удобно, что нет. Может быть тебе говорит о чём-то такое слово как "проектирование" ... |
|||
:
Нравится:
Не нравится:
|
|||
02.02.2013, 18:54 |
|
Проект "ApolloSAX"
|
|||
---|---|---|---|
#18+
SOFT FOR YOUи в чём состоит разница по Вашему между "лексером" и SAX ? Разница в том, что лексер выдаёт поток токенов. Парсер выдаёт Infoset. Парсер xml выдаёт Xml Information Set. ... |
|||
:
Нравится:
Не нравится:
|
|||
02.02.2013, 18:58 |
|
Проект "ApolloSAX"
|
|||
---|---|---|---|
#18+
petalvikРазница в том, что лексер выдаёт поток токенов. Парсер выдаёт Infoset. Парсер xml выдаёт Xml Information Set. в чём отличие: 1) токенов, выдаваемых XML-лексером 2) Infoset для SAX 3) Infoset для pull 4) Infoset для DOM ... |
|||
:
Нравится:
Не нравится:
|
|||
02.02.2013, 19:05 |
|
Проект "ApolloSAX"
|
|||
---|---|---|---|
#18+
SOFT FOR YOUМожет быть тебе говорит о чём-то такое слово как "проектирование"Что все остальные создатели парсеров идиоты и писали их на коленке? ... |
|||
:
Нравится:
Не нравится:
|
|||
02.02.2013, 19:10 |
|
Проект "ApolloSAX"
|
|||
---|---|---|---|
#18+
Antonariy парсеры парсерам рознь есть PugiXML, а есть MS XML и те и те умные. Только одни находчивее других ... |
|||
:
Нравится:
Не нравится:
|
|||
02.02.2013, 19:14 |
|
|
start [/forum/topic.php?fid=14&gotonew=1&tid=1332571]: |
0ms |
get settings: |
11ms |
get forum list: |
15ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
153ms |
get topic data: |
14ms |
get first new msg: |
10ms |
get forum data: |
3ms |
get page messages: |
63ms |
get tp. blocked users: |
2ms |
others: | 244ms |
total: | 523ms |
0 / 0 |