Стоит ли писать собственный синтаксический анализатор за время выполнения? - PullRequest
0 голосов
/ 30 августа 2011

Я делаю работу, связанную с большим количеством манипуляций с DOM.Я написал функцию для более эффективного изменения общих стилей на объектах с помощью «горячих клавиш».Это просто интерпретирует это:

styles = parseStyles({p:"absolute",l:"100px",t:"20px",bg:"#CC0000"});

как это:

styles = {position:"absolute",left:"100px",top:"20px",background:"#CC0000"};

Это произошло главным образом для того, чтобы избавить меня от необходимости читать так много, и потому что я хотел посмотреть, смогу ли я это сделатьэто :) (а также размеры файлов).Я считаю, что на эти горячие клавиши проще смотреть;Я устанавливаю и сбрасываю стили десятки раз для различных пользовательских DOM-объектов.

Но , из-за этого узкое место будет значительным бременем для производительности и времени выполнения, если моя страница используетдо 5000 раз за сеанс, около 10-25 выполнений за раз?

function parseStyles(toParse){
    var stylesKey = 
        {h:"height",p:"position",l:"left",t:"top",r:"right",b:"bottom",bg:"background"}, 
        parsedStyles = {};
    for (entry in toParse){
        if (entry in stylesKey){
            parsedStyles[stylesKey[entry]] = toParse[entry];
        } else {
            parsedStyles[entry] = toParse[entry];
        }
    }
    return parsedStyles;
}

Ответы [ 2 ]

3 голосов
/ 30 августа 2011

Я считаю, что установка неисчисляемых стилей редко когда-либо необходима.Если вы знаете стили заранее, определите класс для этого в своем CSS и добавьте addClass или removeClass из необходимых объектов.Ваш код гораздо более удобен в обслуживании, и вся информация, относящаяся к стилю, находится в ваших файлах CSS, а не в ваших файлах Javascript.В значительной степени, единственный раз, когда я устанавливаю информацию о стиле форматирования непосредственно на объекте, это когда я использую вычисленные позиции с абсолютным позиционированием, и даже тогда, если я достаточно напрягаю свой мозг, проблему позиционирования обычно можно решить простым CSS/HTML.

Примеры, которые вы приводите в своем вопросе, выглядят как статические стили, которые можно выполнить с помощью правила CSS и просто добавить addClass для объекта.Помимо того, что он чище, он также должен выполняться намного быстрее.

Похоже, что вы делаете, используете синтаксический анализ во время выполнения, чтобы сэкономить время разработки.Это хорошо, если вы не заметите разницу в производительности.Только вы можете знать это наверняка, потому что только вы можете протестировать свое приложение в средах, в которых оно требуется (старый браузер, старый процессор, нагрузка).Мы не можем ответить на это для вас.Конечно, было бы быстрее не выполнять преобразование во время выполнения для чего-то, что известно во время разработки.Относится ли это различие в скорости, зависит от множества деталей и требований к приложениям, которые вы не раскрыли (и, возможно, даже не задумывались всерьез), и их можно выяснить только при тестировании конфигурации.

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

1 голос
/ 30 августа 2011

Запоминание вашей функции синтаксического анализа.

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

Таким образом, когда вы приступаете к анализу выражения стиля, вы можете сделать что-то простое, например сохранить выражение на карте и проверить, видели ли вы его раньше.Если да, верните результат, который вы получили раньше.

Это сэкономит вам немало времени при повторном использовании и, вероятно, не будет стоить вам много времени, когда это не так.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...