Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Web программирование > JavaScript, Ajax
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 01.06.2015, 17:11   #1
byte916
Пользователь
 
Регистрация: 04.03.2008
Сообщений: 75
По умолчанию Оптимизация Jquery

Добрый день.
Небольшая предыстория: есть подготовленные материал, оформленный как html-страница (только тексты и картинки). Нужно этот текст разбить на равные страницы (с известными размерами). Картинки могут обладать float, т.е. текст будет их обтекать.
Как сделано сейчас: весь html обрабатывается блок за блоком, картинки вставляются, текст разбивается по словам, и по каждому слову добавляется. Если новое слово не вмещается в размеры страницы, создаётся новая страница.

Сейчас добавление каждого слова выглядит так:

Код:
var textArray = $(elem).html().replace('<br>', ' <br> ').split(/\s/);
for (var ind = 0, j = textArray.length; ind < j; ind++) {
  var textElement = textArray[ind];
  $(newElement).html($(newElement).html() + " " + textElement);
    if ($(currPage).outerHeight() > contentHeight) {
    //Если высота текущей страницы не вписывается в границы, то создаём новую и продолжаем вписывать в неё
    }
}
...
Такое добавление по одному слову прямо в dom через html() невероятно медленное. Но я другого варианта не придумал, потому что надо после каждого слова проверять размер страницы (потому что помимо текста могут быть картинки с обтеканием).

Собственно вопрос: как можно обойтись без html()? Пробовал Append, но работает так же медленно.
Прошу подсказки)
byte916 вне форума Ответить с цитированием
Старый 01.06.2015, 18:29   #2
Naive
Раздолбайских Дел
Старожил
 
Аватар для Naive
 
Регистрация: 22.05.2009
Сообщений: 3,828
По умолчанию

Если картинка попадает на разрыв страницы, то как решаешь вопрос?
Alar, верни репу!
Naive вне форума Ответить с цитированием
Старый 01.06.2015, 21:06   #3
Gorychev
Участник клуба
 
Аватар для Gorychev
 
Регистрация: 08.03.2008
Сообщений: 1,537
По умолчанию

Добавлять, допустим, по 50 слов за одну итерацию. Или разбивать текст по предложениям и добавлять к тексту по одному предложению за раз. Или я вот смотрю текст у вас <br> форматирован, можно по этим бэрам и разбивать на массив и тоже прибавлять к тексту по элементу или несколько.

Последний раз редактировалось Gorychev; 01.06.2015 в 21:08.
Gorychev вне форума Ответить с цитированием
Старый 04.06.2015, 14:03   #4
Naive
Раздолбайских Дел
Старожил
 
Аватар для Naive
 
Регистрация: 22.05.2009
Сообщений: 3,828
По умолчанию

Ну, вообще работа с dom штука медленная, а innerHTML ваще тормоз.
Я бы в фоне попилил текст по заголовкам в отдельные слои, предварительно обернув каждое слово в спанчик.
Дальше бы драгал картинки до близжайшего непересечения оными границы страницы.
Затем уже сам попил, слов по страничкам, запихать в document.fragment, а его уже в соответствующую страницу.
Alar, верни репу!
Naive вне форума Ответить с цитированием
Старый 09.06.2015, 17:12   #5
byte916
Пользователь
 
Регистрация: 04.03.2008
Сообщений: 75
По умолчанию

Если картинка не помещается, то переносится на следующую страницу. Если она и туда не помещается, то масштабируется до размера страницы.

Я сделал так - определял размер страницы, размер шрифта, высчитывал сколько в среднем поместится слов на строку (при средней длине 6 слов плюс пробел, а ширина буквы 4/7 к высоте), считал число строк, и получал количество слов, которые засовывал, и дальше смотрел, поместится ли еще.

Ну и еще пара мелких оптимизаций, которые почти не помогли.

Короче говоря, производительность выросла в 2.5 раза, книга разбивающаяся на 80 страниц (при размере экрана 1280х1024) стала разбиваться за 6 секунд вместо 15 в начале (на i3)

Но это тоже не приемлемо, ведь крутиться это всё будет, в основном, на более слабых железках и на мобильных устройствах, а там производительность намного хуже.

Поэтому было решено весь этот скрипт реализовать в виде отдельной странички с textarea, в который копипастится код книжки, и по нажатию кнопки он конвертится в десяток предустановленных размеров, и возвращается в виде готового решения.
byte916 вне форума Ответить с цитированием
Старый 09.06.2015, 18:13   #6
Naive
Раздолбайских Дел
Старожил
 
Аватар для Naive
 
Регистрация: 22.05.2009
Сообщений: 3,828
По умолчанию

6 секунд — адово, конечно. Можешь скинуть пару примеров самому поковыряться?
Alar, верни репу!
Naive вне форума Ответить с цитированием
Старый 09.06.2015, 20:40   #7
nerv
Форумчанин
 
Аватар для nerv
 
Регистрация: 26.04.2010
Сообщений: 450
По умолчанию

ппц, пока писал авторизация слетела, текст не сохранился
адовый форум

ниже неполный сокращенный вариант того, что хотел сказать

---

для текста

допустим,
- книга 1000 слов
- среднее кол-во слов на странице 300
- кол-во слов на странице в текущей книге 240

1. words = 300
2. поместилось на странице? нет, page = 0 (!)
3. words /= 2
4. поместилось на странице?, да page = 150 (!)
5. words /= 2
6. поместилось на странице?, да page = 150+75 (!)

итого: 3 проверки, 225 слов (~240)
думаю, смысл ясен

https://ru.wikipedia.org/wiki/Геометрическая_прогрессия
Тишина – самый громкий звук

Последний раз редактировалось nerv; 09.06.2015 в 20:52.
nerv вне форума Ответить с цитированием
Старый 10.06.2015, 10:42   #8
byte916
Пользователь
 
Регистрация: 04.03.2008
Сообщений: 75
По умолчанию

Цитата:
Сообщение от Naive Посмотреть сообщение
6 секунд — адово, конечно. Можешь скинуть пару примеров самому поковыряться?
Там почти 1000 строк js-кода) Мало удовольствия в этом копаться)
byte916 вне форума Ответить с цитированием
Старый 10.06.2015, 10:44   #9
byte916
Пользователь
 
Регистрация: 04.03.2008
Сообщений: 75
По умолчанию

Цитата:
Сообщение от nerv Посмотреть сообщение
ппц, пока писал авторизация слетела, текст не сохранился
адовый форум

ниже неполный сокращенный вариант того, что хотел сказать

---

для текста

допустим,
- книга 1000 слов
- среднее кол-во слов на странице 300
- кол-во слов на странице в текущей книге 240

1. words = 300
2. поместилось на странице? нет, page = 0 (!)
3. words /= 2
4. поместилось на странице?, да page = 150 (!)
5. words /= 2
6. поместилось на странице?, да page = 150+75 (!)

итого: 3 проверки, 225 слов (~240)
думаю, смысл ясен

https://ru.wikipedia.org/wiki/Геометрическая_прогрессия
К сожалению, все слова не так одинаковы по длинне и размеру шрифта, да еще и это не плоский набор слов, а куски текста обёрнутые в дивы, да еще и с примесью картинок и списков
byte916 вне форума Ответить с цитированием
Старый 10.06.2015, 10:48   #10
Naive
Раздолбайских Дел
Старожил
 
Аватар для Naive
 
Регистрация: 22.05.2009
Сообщений: 3,828
По умолчанию

Цитата:
Сообщение от byte916 Посмотреть сообщение
Там почти 1000 строк js-кода) Мало удовольствия в этом копаться)
Я имел ввиду пример данных =) Примеров книг то у меня дофига, конечно. Просто хотелось побаловаться именно с твоим примером. Вдруг шустрее выйдет?
Alar, верни репу!
Naive вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Оптимизация maksikus SQL, базы данных 5 01.02.2015 12:19
Оптимизация lynatik50 SQL, базы данных 1 12.09.2013 12:40
Оптимизация KaSS Microsoft Office Excel 30 01.08.2013 17:46
Оптимизация Кащей Общие вопросы C/C++ 6 30.07.2013 09:55
Оптимизация Красноглаз Паскаль, Turbo Pascal, PascalABC.NET 3 28.10.2011 13:40