Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 28.12.2009, 09:49
Интересующийся
Отправить личное сообщение для frid-karatel Посмотреть профиль Найти все сообщения от frid-karatel
 
Регистрация: 28.12.2009
Сообщений: 14

Оптимизация прорисовки таблицы
В-общем, суть задачи, которую никак не могу решить более-менее правильно... И так, и так - не нравится скорость прорисовки - и все тут...

var myTable = [];//Массив строк, длина массива может быть и 1000
var myTableRow = [];//Каждый эл-нт массива myTable имеет еще массив, т.н. столбец. Столбцов может быть до 20ти штук
//Каждый столбец имеет свой тип. Например, если там число, то привести его в дату по шаблону "d.m.Y в H:i".
Если нарисовать структуру, то она будет такой:
myTable = {
	[Type:'int' or 'text', Value: '0-9' or 'azAZ'],
	...
	[Type:'int' or 'text', Value: '0-9' or 'azAZ']
};


В итоге, получается такой цикл для рисования этой таблицы
var rc = myTable.length;
var cc = myTable[0].length;//Каждая строка имеет одинаковое кол-во столбцов

var ri;
var ci;

var row;
var Result = [];
var c;

Result.push('<table><tbody>');
for (ri = 0; ri < rc; ri++) {
	row = [];
	for (ci = 0; ci < cc; ci++) {
		c = myTable[ri].Col[ci];
		switch(c.Type) {
			case 'int': {
				c = new Date(parseInt(c.Value));
				c = c.getDate();
			} break;
			case 'text': {
				c = '"' + c + '"';
			} break;
		}
		row.push(c);
	}
	Result.push('<tr><td>' + row.join('</td><td>') + '</td></tr>');
}
Result.push('</tbody></table>');

$(myTableArea).html(Result.join(''));


Проблема в том, что скорость такой "сборки" таблицы оставляет желать лучшего...
Например, у меня скорость такого алгоритма на 15 строк занимает где-то 300 мс.
Если строк не 15, а 100, то алгоритм занимает больше секунды.
А если 1000 строк нарисовать... То это вообще можно спать идти

Кто что подскажет?

PS: Разработка не кросс-браузерная, исключительно под Firefox.

Последний раз редактировалось frid-karatel, 28.12.2009 в 10:22.
Ответить с цитированием
  #2 (permalink)  
Старый 28.12.2009, 11:07
Аватар для Gvozd
Матрос
Отправить личное сообщение для Gvozd Посмотреть профиль Найти все сообщения от Gvozd
 
Регистрация: 04.04.2008
Сообщений: 6,246

попробуй использовать вместо $().html(), который как я предполагаю является аналогом innerHTML, createElement
думаю этот метод займет чуточку больше времени на генерацию таблицы, но добавление собранной в памяти таблицы займет гораздо меньше времени, наверно
Ответить с цитированием
  #3 (permalink)  
Старый 28.12.2009, 18:43
Интересующийся
Отправить личное сообщение для frid-karatel Посмотреть профиль Найти все сообщения от frid-karatel
 
Регистрация: 28.12.2009
Сообщений: 14

Сообщение от Gvozd Посмотреть сообщение
попробуй использовать вместо $().html(), который как я предполагаю является аналогом innerHTML, createElement
думаю этот метод займет чуточку больше времени на генерацию таблицы, но добавление собранной в памяти таблицы займет гораздо меньше времени, наверно
Не прибавило скорости... Даже убавило - 15 строк рисуются на 100 мс больше...

Заметил, что много времени (где-то 100-150 мс на 15 строк) тратится на удаление прошлой таблицы.

Например, мне надо вывести следующие 15 строк.
Я удаляю старую таблицу и создаю новую. Так вот, последующие создания (обновления) требуют на 100-150 мс больше...

Пытался заменить switch на массив из function, т.е.:
var fa = [];
for (ci = 0; ci < cc; ci++) {
	switch(myTable[0].Col[ci].Type) {
		case 'int': {
			fa[ci] = function(Col) {
				Col = new Date(parseInt(Col));
				Col = Col.getTime();
			};
		} break;
		case 'text': {
			fa[ci] = function(Col) {
				Col = '"' + Col + '"';
			};
		} break;
	}
}

И дальше вместо switch сразу вызывать функцию через fa[ci]( myTable[ri].Col[ci].Value).
Но это заняло на порядок больше времени, чем простой switch...

PS: А что, если в switch манипулировать цифрами, а не текстом?
Т.е. вместо int использовать 0, вместо text - 1?
С точки зрения машины, будет ли это производительней?

Последний раз редактировалось frid-karatel, 28.12.2009 в 18:53.
Ответить с цитированием
  #4 (permalink)  
Старый 28.12.2009, 19:00
Профессор
Отправить личное сообщение для tenshi Посмотреть профиль Найти все сообщения от tenshi
 
Регистрация: 20.03.2008
Сообщений: 1,183

итерировать сначала по столбцам, а потом по строкам..
__________________
.ня
Ответить с цитированием
  #5 (permalink)  
Старый 28.12.2009, 19:01
Профессор
Отправить личное сообщение для tenshi Посмотреть профиль Найти все сообщения от tenshi
 
Регистрация: 20.03.2008
Сообщений: 1,183

push умеет принимать несколько параметров
__________________
.ня
Ответить с цитированием
  #6 (permalink)  
Старый 28.12.2009, 19:12
Интересующийся
Отправить личное сообщение для frid-karatel Посмотреть профиль Найти все сообщения от frid-karatel
 
Регистрация: 28.12.2009
Сообщений: 14

Сообщение от tenshi Посмотреть сообщение
итерировать сначала по столбцам, а потом по строкам..
Я, кстати, думал об этом... но не смог сообразить, как собрать таблицу
Ответить с цитированием
  #7 (permalink)  
Старый 28.12.2009, 19:18
Профессор
Отправить личное сообщение для tenshi Посмотреть профиль Найти все сообщения от tenshi
 
Регистрация: 20.03.2008
Сообщений: 1,183

из дивов её собирать...
__________________
.ня
Ответить с цитированием
  #8 (permalink)  
Старый 28.12.2009, 19:25
Интересующийся
Отправить личное сообщение для frid-karatel Посмотреть профиль Найти все сообщения от frid-karatel
 
Регистрация: 28.12.2009
Сообщений: 14

Сообщение от tenshi Посмотреть сообщение
из дивов её собирать...
Хм... насколько это будет правильно?
100 строк по 10 столбцов в каждой - это 1000 DIV'ов...

Не будет ли это сложновато для отрисовки?
Ответить с цитированием
  #9 (permalink)  
Старый 28.12.2009, 19:41
Профессор
Отправить личное сообщение для tenshi Посмотреть профиль Найти все сообщения от tenshi
 
Регистрация: 20.03.2008
Сообщений: 1,183

думаешь 1000 ячеек будет проще? х)
__________________
.ня
Ответить с цитированием
  #10 (permalink)  
Старый 28.12.2009, 19:51
Интересующийся
Отправить личное сообщение для frid-karatel Посмотреть профиль Найти все сообщения от frid-karatel
 
Регистрация: 28.12.2009
Сообщений: 14

Сообщение от tenshi Посмотреть сообщение
думаешь 1000 ячеек будет проще? х)
Ну... с точки зрения наглядности - проще ими управлять Например, закрасить ячейки в строке в другой цвет... Или поменять ширину колонки...
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
изменение ширины столбцов таблицы yngwie19 Элементы интерфейса 10 11.11.2009 17:22
смена фоновой картинки у таблицы cuberboy Общие вопросы Javascript 0 15.10.2009 23:06
Перемещение строк таблицы в Firefox barcelona jQuery 17 23.02.2009 15:41
Автоматическая подсветка строк таблицы mihha Элементы интерфейса 5 01.02.2009 01:28
Фиксированный заголовок таблицы ilshat Элементы интерфейса 6 20.12.2008 00:35