Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #41 (permalink)  
Старый 16.02.2013, 14:41
Аватар для danik.js
Профессор
Отправить личное сообщение для danik.js Посмотреть профиль Найти все сообщения от danik.js
 
Регистрация: 11.09.2010
Сообщений: 8,804

dima***, ну сам подумай. Если одна табличка генерируется за 1-2мс, то 10штук - за 10-20мс. Ты моргнуть не успеешь за это время

<!DOCTYPE html>
<body>
<script>

function createTable() {
    var table, row, data;
     
    table = document.createElement('table');
    table.border = 1;
    for (var k = 0; k < 4; k++) {
        row = document.createElement('tr');
        for (var m = 0; m < 5; m++) {
            data = document.createElement('td');
            data.innerHTML = "строка " +k+"; яч "+m;
            if (k == m) {
                data.style.backgroundColor = 'red';
                //data.style.borderColor = 'red';
                //data.style.color = 'red';
            }
            row.appendChild(data);
        }
        table.appendChild(row);
    }
    document.body.appendChild(table);
}

function run() {
    var tstart = new Date();
    for (var i = 0; i < 10; i++) {
        createTable();
    }
    alert(new Date() - tstart);
}
</script>
<button onclick="run()">Запуск</button>
</body>


UPD: На моем Core i5 3210М (мобильный) 2.5ГГц Хром выдает 4мс. Попробую переделать скрипт:

<!DOCTYPE html>
<body>
<script>

function createTable( fragment ) {
    var table, row, data;
     
    table = document.createElement('table');
    table.border = 1;
    for (var k = 0; k < 4; k++) {
        row = document.createElement('tr');
        for (var m = 0; m < 5; m++) {
            data = document.createElement('td');
            data.innerHTML = "строка " +k+"; яч "+m;
            if (k == m) {
                data.style.backgroundColor = 'red';
                //data.style.borderColor = 'red';
                //data.style.color = 'red';
            }
            row.appendChild(data);
        }
        table.appendChild(row);
    }
    fragment.appendChild(table);
}

function run() {
    var tstart = new Date();
    var fragment = document.createDocumentFragment();
    for (var i = 0; i < 10; i++) {
        createTable(fragment);
    }
    document.body.appendChild(fragment);
    alert(new Date() - tstart);
}
</script>
<button onclick="run()">Запуск</button>
</body>


UPD2: разницы практически нет. А нука если не 10 а 1000 таблиц генерить:

<!DOCTYPE html>
<body>
<script>

function createTable() {
    var table, row, data;
     
    table = document.createElement('table');
    table.border = 1;
    for (var k = 0; k < 4; k++) {
        row = document.createElement('tr');
        for (var m = 0; m < 5; m++) {
            data = document.createElement('td');
            data.innerHTML = "строка " +k+"; яч "+m;
            if (k == m) {
                data.style.backgroundColor = 'red';
                //data.style.borderColor = 'red';
                //data.style.color = 'red';
            }
            row.appendChild(data);
        }
        table.appendChild(row);
    }
    document.body.appendChild(table);
}

function run() {
    var tstart = new Date();
    for (var i = 0; i < 1000; i++) {
        createTable();
    }
    alert(new Date() - tstart);
}
</script>
<button onclick="run()">Запуск</button>
</body>



<!DOCTYPE html>
<body>
<script>

function createTable( fragment ) {
    var table, row, data;
     
    table = document.createElement('table');
    table.border = 1;
    for (var k = 0; k < 4; k++) {
        row = document.createElement('tr');
        for (var m = 0; m < 5; m++) {
            data = document.createElement('td');
            data.innerHTML = "строка " +k+"; яч "+m;
            if (k == m) {
                data.style.backgroundColor = 'red';
                //data.style.borderColor = 'red';
                //data.style.color = 'red';
            }
            row.appendChild(data);
        }
        table.appendChild(row);
    }
    fragment.appendChild(table);
}

function run() {
    var tstart = new Date();
    var fragment = document.createDocumentFragment();
    for (var i = 0; i < 1000; i++) {
        createTable(fragment);
    }
    document.body.appendChild(fragment);
    alert(new Date() - tstart);
}
</script>
<button onclick="run()">Запуск</button>
</body>


UPD3: documentFragment тут роли не играет. Ок, добавлю для сравнения innerHTML на 1000 таблиц:

<!DOCTYPE html>
<body>
<script>

function createTable() {
    var strTabl="<table border=1><tbody>\n";
    for (var k = 0; k < 4; k++) {
        strTabl+= "\n<tr>\n";
        for (var m = 0; m < 5; m++) {
         strTabl+= "<td" + (k == m ? " style=color:red" : "") + ">"+"строка " +k+"; яч "+m+"</td>";
        }  strTabl+=  "\n</tr>\n";
    }
    strTabl+= "\n</tbody></table>";
    document.write(strTabl);
}

function run() {
    var tstart = new Date();
    for (var i = 0; i < 1000; i++) {
        createTable();
    }
    alert(new Date() - tstart);
}
</script>
<button onclick="run()">Запуск</button>
</body>


И еще улучшенный вариант innerHTML, самый быстрый:
<!DOCTYPE html>
<body>
<script>

var strTabl;
function createTable() {
    strTabl +="<table border=1><tbody>\n";
    for (var k = 0; k < 4; k++) {
        strTabl+= "\n<tr>\n";
        for (var m = 0; m < 5; m++) {
         strTabl+= "<td" + (k == m ? " style=color:red" : "") + ">"+"строка " +k+"; яч "+m+"</td>";
        }  strTabl+=  "\n</tr>\n";
    }
    strTabl+= "\n</tbody></table>";
}

function run() {
    var tstart = new Date();
    strTabl = '';
    for (var i = 0; i < 1000; i++) {
        createTable();
    }
    document.write(strTabl);
    alert(new Date() - tstart);
}
</script>
<button onclick="run()">Запуск</button>
</body>

Последний раз редактировалось danik.js, 16.02.2013 в 15:01.
Ответить с цитированием
  #42 (permalink)  
Старый 16.02.2013, 15:05
Аватар для danik.js
Профессор
Отправить личное сообщение для danik.js Посмотреть профиль Найти все сообщения от danik.js
 
Регистрация: 11.09.2010
Сообщений: 8,804

Хах, че за хрень. Deff, не мог бы помочь разобраться? У меня выходит что innerHTML медленней (Google Chrome):

Три последние эксперимента:
190,
280,
280

То есть innerHTML оказывается даже медленней. Почему так?
Ответить с цитированием
  #43 (permalink)  
Старый 16.02.2013, 15:06
Профессор
Отправить личное сообщение для dima*** Посмотреть профиль Найти все сообщения от dima***
 
Регистрация: 13.12.2012
Сообщений: 283

Ничего себе!!!Теперь всё понятно!Спасибо за понятное объяснение.
Лист в "закладки"!!!
Ответить с цитированием
  #44 (permalink)  
Старый 16.02.2013, 15:44
без статуса
Отправить личное сообщение для Deff Посмотреть профиль Найти все сообщения от Deff
 
Регистрация: 25.05.2012
Сообщений: 8,219

danik.js,
Не так выполняете - нужно последний тег - креaтить ( и внего в вставлять контекст, и только потом в DOM
Ответить с цитированием
  #45 (permalink)  
Старый 16.02.2013, 16:23
без статуса
Отправить личное сообщение для Deff Посмотреть профиль Найти все сообщения от Deff
 
Регистрация: 25.05.2012
Сообщений: 8,219

<!DOCTYPE html>
<body>
<script>

var strTabl;
var div=document.createElement('div');
function createTable() {
    strTabl ="<tbody>\n";
    for (var k = 0; k < 4; k++) {
        strTabl+= "\n<tr>\n";
        for (var m = 0; m < 5; m++) {
         strTabl+= "<td" + (k == m ? " bgcolor=red" : "") + ">"+"строка " +k+"; яч "+m+"</td>";
        }  strTabl+=  "\n</tr>\n";
    }
    strTabl+= "\n</tbody>"
    var table=document.createElement('table');
    table.border='1';
    table.innerHTML = strTabl;
    div.appendChild(table);
}

function run() {

    var tstart = new Date();
    strTabl = '';
    for (var i = 0; i < 1000; i++) {
    createTable()
    }
    document.body.appendChild(div);
    alert(new Date() - tstart);
}
</script>
<button onclick="run()">Запуск</button>
</body>

Последний раз редактировалось Deff, 16.02.2013 в 16:28.
Ответить с цитированием
  #46 (permalink)  
Старый 16.02.2013, 16:41
Аватар для danik.js
Профессор
Отправить личное сообщение для danik.js Посмотреть профиль Найти все сообщения от danik.js
 
Регистрация: 11.09.2010
Сообщений: 8,804

Ок, что ты скажешь на это, Deff ? У меня второй пример работает немного быстрее.

<!DOCTYPE html>
<body>
<script>
 
var strTabl;
var div=document.createElement('div');
function createTable() {
    strTabl ="<tbody>\n";
    for (var k = 0; k < 4; k++) {
        strTabl+= "\n<tr>\n";
        for (var m = 0; m < 5; m++) {
         strTabl+= "<td" + (k == m ? " bgcolor=red" : "") + ">"+"строка " +k+"; яч "+m+"</td>";
        }  strTabl+=  "\n</tr>\n";
    }
    strTabl+= "\n</tbody>"
    var table=document.createElement('table');
    table.border='1';
    table.innerHTML = strTabl;
    div.appendChild(table);
}
 
function run() {
 
    var tstart = new Date();
    strTabl = '';
    for (var i = 0; i < 10000; i++) {
    createTable()
    }
    document.body.appendChild(div);
    alert(new Date() - tstart);
}
</script>
<button onclick="run()">Запуск</button>
</body>


<!DOCTYPE html>
<body>
<script>

var div=document.createElement('div');
var textProp = ('innerText' in div) ? 'innerText' : 'textContent';
function createTable() {
    var table, row, data;
      
    table = document.createElement('table');
    table.border = 1;
    for (var k = 0; k < 4; k++) {
        row = document.createElement('tr');
        for (var m = 0; m < 5; m++) {
            data = document.createElement('td');
            data[textProp]= "строка " +k+"; яч "+m;
            if (k == m) {
                data.style.backgroundColor = 'red';
                //data.style.borderColor = 'red';
                //data.style.color = 'red';
            }
            row.appendChild(data);
        }
        table.appendChild(row);
    }
    div.appendChild(table);
}
 
function run() {
    var tstart = new Date();
    for (var i = 0; i < 10000; i++) {
        createTable();
    }
    document.body.appendChild(div);
    alert(new Date() - tstart);
}
</script>
<button onclick="run()">Запуск</button>
</body>
Ответить с цитированием
  #47 (permalink)  
Старый 16.02.2013, 16:48
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,080

Вариант...
<!DOCTYPE HTML>
<html>
<head>
<meta charset="utf-8" />
  <title></title>
</head>
<body>
<script>
function createTable( fragment ) {
    var table, row, data;
    table = document.createElement('table');
    table.border = 1;
    for (var k = 0; k < 4; k++) {
        row = table.insertRow(k);
        for (var m = 0; m < 5; m++) {
            data = row.insertCell(m);
            data.textContent  = "строка " +k+"; яч "+m;
            if (k == m) {
                data.style.backgroundColor = 'red';
                //data.style.borderColor = 'red';
                //data.style.color = 'red';
            }
            row.appendChild(data);
        }
        table.appendChild(row);
    }
    return table;
}

function run() {
    var tstart = new Date();
    var fragment = document.createDocumentFragment();
    for (var i = 0; i < 10000; i++) {
        fragment.appendChild(createTable());
    }
    document.body.appendChild(fragment);
    alert(new Date() - tstart);
}
</script>
<button onclick="run()">Запуск</button>
</body>
</html>

Последний раз редактировалось рони, 16.02.2013 в 17:20. Причина: 10000
Ответить с цитированием
  #48 (permalink)  
Старый 16.02.2013, 16:49
без статуса
Отправить личное сообщение для Deff Посмотреть профиль Найти все сообщения от Deff
 
Регистрация: 25.05.2012
Сообщений: 8,219

danik.js,
В Опере = 1-й 1456 2-й 1945
Мозилла 1317 1999
Хром 1332 1752
(*Перезапуск делал по кнопке посмотреть это данные для поста 46

Последний раз редактировалось Deff, 16.02.2013 в 16:52.
Ответить с цитированием
  #49 (permalink)  
Старый 16.02.2013, 16:58
Аватар для danik.js
Профессор
Отправить личное сообщение для danik.js Посмотреть профиль Найти все сообщения от danik.js
 
Регистрация: 11.09.2010
Сообщений: 8,804

Да, я уже потестил. В хроме dom-методы работают быстрее чем парсинг html. В остальных браузерах парсинг происходит быстрее. Но не в разы как я предполагал. В два или менее раз. Поправил свой тест, там была идиотская ошибка.
Кстати innerText в хроме быстрее чем textContent (не помню - на запись или на чтение тестил)

Deff, в ИЕ8 не работает вариант с innerHTML. В нем же вроде какие-то траблы с innerHTML у таблиц?
Ответить с цитированием
  #50 (permalink)  
Старый 16.02.2013, 17:01
без статуса
Отправить личное сообщение для Deff Посмотреть профиль Найти все сообщения от Deff
 
Регистрация: 25.05.2012
Сообщений: 8,219

Для поста 45 и 47
в Хроме 182 и 142 - Ваш быстрее
Короче по любому если креатить тег перед запихиваием в DOM
элементы внутри отрытого тега по браузерам втискивать тестовой нодой чуть быстрее, кроме Хрома
Ответить с цитированием
Ответ



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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как сделать как в JQ? faforty Общие вопросы Javascript 8 14.11.2011 01:35
Как сделать таблицу ? denis_h2 Общие вопросы Javascript 3 16.02.2011 09:12
Сделать видимым select... Anneta Элементы интерфейса 7 12.01.2011 21:21
30(1|2) редирект от сервера. Или как лучше сделать редирект при верной отсылке форма. pizzZ AJAX и COMET 2 18.02.2010 09:06
Помогите сделать такое меню(( Lilith Я не знаю javascript 2 02.06.2009 02:31