Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> Optymalizacja generowania tabeli html.
KsaR
post
Post #1





Grupa: Zarejestrowani
Postów: 520
Pomógł: 102
Dołączył: 15.07.2014
Skąd: NULL

Ostrzeżenie: (0%)
-----


[JAVASCRIPT] pobierz, plaintext
  1. var
  2. d = document,
  3. div = d.createElement('div'),
  4. i=0,
  5. larr = [],
  6. lvls = [0,10,40,110,260,...]; // 1k int'ów.
  7.  
  8. while (1000!==++i) {
  9. larr[i]='<tr><td>'+(i+1)+'</td><td>'+lvls[i]+'</td></tr>';
  10. }
  11.  
  12. div.innerHTML = '<table id="levels">
  13. <tr>
  14. <th>LvL</th><th>Experience</th>
  15. </tr>'+
  16. larr.join('')
  17. +'</table>';
  18.  
  19. d.body.appendChild(div);
[JAVASCRIPT] pobierz, plaintext

Wygenerowanie tabeli zajmuję około 2s na moim tablecie,
a strona będzie głównie na urządzenia mobilne.
Da się jakoś zoptymalizować to? Bo już bardziej nie potrafię (IMG:style_emoticons/default/tongue.gif)
Go to the top of the page
+Quote Post
2 Stron V   1 2 >  
Start new topic
Odpowiedzi (1 - 19)
Pyton_000
post
Post #2





Grupa: Zarejestrowani
Postów: 8 068
Pomógł: 1414
Dołączył: 26.10.2005

Ostrzeżenie: (0%)
-----


Zamiast przypisywać do tablicy spróbuj od razu wrzucać do DOM
Go to the top of the page
+Quote Post
KsaR
post
Post #3





Grupa: Zarejestrowani
Postów: 520
Pomógł: 102
Dołączył: 15.07.2014
Skąd: NULL

Ostrzeżenie: (0%)
-----


Cytat(Pyton_000 @ 26.04.2016, 07:58:57 ) *
Zamiast przypisywać do tablicy spróbuj od razu wrzucać do DOM

1. Chodzi ci o przechowywanie gotowej treści statycznej w dom'ie?
2. Czy dopisywania na bieżąco do dom'u?

Bo jak dla mnie oba rozwiązania odpadają.
1. Strona zwiększy rozmiar kilkukrotnie a w tym przypadku każdy bajt będzie się liczył.
2. A to będzie za wolne.
Go to the top of the page
+Quote Post
trueblue
post
Post #4





Grupa: Zarejestrowani
Postów: 6 806
Pomógł: 1828
Dołączył: 11.03.2014

Ostrzeżenie: (0%)
-----


Pomoże?
http://stackoverflow.com/a/4865247/5889778
Go to the top of the page
+Quote Post
Pyton_000
post
Post #5





Grupa: Zarejestrowani
Postów: 8 068
Pomógł: 1414
Dołączył: 26.10.2005

Ostrzeżenie: (0%)
-----


@trueblue przecież on tak w sumie właśnie ma (IMG:style_emoticons/default/smile.gif)
@KsaR chodzi mi o to że zamiast robić od razu append na całości, po prostu wrzucać w pętli append,. Przeglądarka będzie na bieżąco rysowała
Go to the top of the page
+Quote Post
trueblue
post
Post #6





Grupa: Zarejestrowani
Postów: 6 806
Pomógł: 1828
Dołączył: 11.03.2014

Ostrzeżenie: (0%)
-----


Cytat(Pyton_000 @ 26.04.2016, 12:14:50 ) *
@trueblue przecież on tak w sumie właśnie ma (IMG:style_emoticons/default/smile.gif)

Pyton_000,
w sumie to inaczej, bo sugestia jest aby rozdzielić string na mniejsze części i je dodawać do tablicy.
Go to the top of the page
+Quote Post
KsaR
post
Post #7





Grupa: Zarejestrowani
Postów: 520
Pomógł: 102
Dołączył: 15.07.2014
Skąd: NULL

Ostrzeżenie: (0%)
-----


Cytat
[JAVASCRIPT] pobierz, plaintext
  1. r[++j] = '</span></td><td width="2%"><input type="button" class="failOne" rev="';
[JAVASCRIPT] pobierz, plaintext

Zawartość stringa = 69 (IMG:style_emoticons/default/biggrin.gif)

Cytat
[JAVASCRIPT] pobierz, plaintext
  1. larr[i]='<tr><td>'+(i+1)+'</td><td>'+lvls[i]+'</td></tr>';
[JAVASCRIPT] pobierz, plaintext

U mnie najdłuższy string będzie taki:
  1. <tr><td>1000</td><td>100000000000</td></tr>

Co daję 43 znaki.
Więc chyba nie ma sensu tu bardziej dzielić.
Niby można by każde połączenie w tym do kolejnego elementu tablicy ale to nie powinno dodać dużo różnicy...
_____
Wpadłem teraz na pomysł żeby w html robić div'a. W nim komunikat że trwa generacja tabeli,
I asynchronicznie dołączać skrypt.
// czesciowo zainspirowane pomyslem @Pyton_000, co do appendowania także daje (+).
_____
Jednak, gdyby ktoś miał jakieś dodatkowe pomysły to chętnie poczytam - bo może da się jeszcze lepiej. (IMG:style_emoticons/default/tongue.gif)
_____
Cytat
You may squeeze a bit more performance out by specifying the length of the array when you construct it e.g. var r = new Array(data.length*19+2)

Jeszcze spróbuję to dodać według komentarza z stack @trueblue.
Może coś poprawi bo wygląda jak SplFixedArray z php. (IMG:style_emoticons/default/tongue.gif)

Ten post edytował KsaR 26.04.2016, 12:20:26
Go to the top of the page
+Quote Post
trueblue
post
Post #8





Grupa: Zarejestrowani
Postów: 6 806
Pomógł: 1828
Dołączył: 11.03.2014

Ostrzeżenie: (0%)
-----


Pyton_000,
zwracam honor.
Go to the top of the page
+Quote Post
Pyton_000
post
Post #9





Grupa: Zarejestrowani
Postów: 8 068
Pomógł: 1414
Dołączył: 26.10.2005

Ostrzeżenie: (0%)
-----


Ale o co chodzi (IMG:style_emoticons/default/tongue.gif)
Go to the top of the page
+Quote Post
KsaR
post
Post #10





Grupa: Zarejestrowani
Postów: 520
Pomógł: 102
Dołączył: 15.07.2014
Skąd: NULL

Ostrzeżenie: (0%)
-----


[JAVASCRIPT] pobierz, plaintext
  1. while (1000!==++i) {
  2. larr[i]=(i+1)+' '+lvls[i];
  3. }
  4.  
  5. div.innerHTML = '<table id="levels">
  6. <tr>
  7. <th>LvL</th><th>Experience</th>
  8. </tr>'+
  9. larr.join('').replace(/(\d+)\s(\d+)/g, "<tr><td>$0</td><td>$1</td></tr>")
  10. +'</table>';
  11. d.body.appendChild(div);
[JAVASCRIPT] pobierz, plaintext

Próbuje teraz tak, jednak nie działa. Ma ktoś jakieś pomysły?
Go to the top of the page
+Quote Post
trueblue
post
Post #11





Grupa: Zarejestrowani
Postów: 6 806
Pomógł: 1828
Dołączył: 11.03.2014

Ostrzeżenie: (0%)
-----


Co dokładnie nie działa?

Cytat
For a non-global regexp - it finds the first match and returns an array: the full match becomes array item at index 0, the first group - at index 1, and so on.
Go to the top of the page
+Quote Post
KsaR
post
Post #12





Grupa: Zarejestrowani
Postów: 520
Pomógł: 102
Dołączył: 15.07.2014
Skąd: NULL

Ostrzeżenie: (0%)
-----


Testuje sobie na tej podstronie póki co
http://ksar.blutu.pl/tibiame/levels/

I mi nie tworzy tabeli teraz..
Go to the top of the page
+Quote Post
trueblue
post
Post #13





Grupa: Zarejestrowani
Postów: 6 806
Pomógł: 1828
Dołączył: 11.03.2014

Ostrzeżenie: (0%)
-----


http://stackoverflow.com/a/805113/5889778
Go to the top of the page
+Quote Post
KsaR
post
Post #14





Grupa: Zarejestrowani
Postów: 520
Pomógł: 102
Dołączył: 15.07.2014
Skąd: NULL

Ostrzeżenie: (0%)
-----


Ok. Teraz pokazuję tabele i dziala szybciej jednak mam błąd -
W lvl wyswietla $0.
A w experience podaje zly "exp".. Zamiast 0..10..40.. Itd jest 2...404...2606

Ten post edytował KsaR 26.04.2016, 14:30:01
Go to the top of the page
+Quote Post
trueblue
post
Post #15





Grupa: Zarejestrowani
Postów: 6 806
Pomógł: 1828
Dołączył: 11.03.2014

Ostrzeżenie: (0%)
-----


Elementy w tabeli wyglądają tak:
0: "2 10", 1: "3 40", kiedy połączysz, otrzymujesz tak: 2 103 404....
Go to the top of the page
+Quote Post
KsaR
post
Post #16





Grupa: Zarejestrowani
Postów: 520
Pomógł: 102
Dołączył: 15.07.2014
Skąd: NULL

Ostrzeżenie: (0%)
-----


[JAVASCRIPT] pobierz, plaintext
  1. while (1000!==++i) {
  2. larr[i]=(i+1)+' '+lvls[i]+',';
  3. }
  4.  
  5. div.innerHTML = `<table id="levels">
  6. <tr>
  7. <th>LvL</th><th>Experience</th>
  8. </tr>`+
  9. larr.join('').replace(/(\d+)\s(\d+),/g, "<tr><td>$1</td><td>$2</td></tr>")
  10. +`</table>`;
  11. d.body.appendChild(div);
[JAVASCRIPT] pobierz, plaintext

Zrobiłem tak i już działa (IMG:style_emoticons/default/tongue.gif)

Ten post edytował KsaR 26.04.2016, 14:48:52
Go to the top of the page
+Quote Post
nospor
post
Post #17





Grupa: Moderatorzy
Postów: 36 557
Pomógł: 6315
Dołączył: 27.12.2004




zamiast dowalac przecinek do tablicy, poprostu zamiast
larr.join('')
zrob
larr.join(',')
Go to the top of the page
+Quote Post
KsaR
post
Post #18





Grupa: Zarejestrowani
Postów: 520
Pomógł: 102
Dołączył: 15.07.2014
Skąd: NULL

Ostrzeżenie: (0%)
-----


[JAVASCRIPT] pobierz, plaintext
  1. while (1000!==++i) {
  2. larr[i]=(i+1)+' '+lvls[i];
  3. }
  4.  
  5. var lvl = document.getElementById('lvl');
  6. lvl.innerHTML = `<table id="levels">
  7. <tr>
  8. <th>LvL</th><th>Experience</th>
  9. </tr>`+
  10. larr.join(',').replace(/(\d+)\s(\d+),/g, "<tr><td>$1</td><td>$2</td></tr>")
  11. +`</table>`;
  12.  
  13. larr = lvls = [];
  14.  
  15. if (w && w.supports && w.supports('overflow', 'scroll')) {
  16. lvl.style='overflow:scroll;height: 250px;max-width: 200px;border:1px solid gray';
  17. }
[JAVASCRIPT] pobierz, plaintext

Tylko teraz dziwnie działa:
  • Przed tabelka mam ostatni element z tablicy.
  • W tabelce zaczyna sie lvl od 2 zamiast od 1.

I coś nie dodaję mi scrollowania ale to chyba nie związane z tym.

live demo

Ten post edytował KsaR 26.04.2016, 15:19:21
Go to the top of the page
+Quote Post
nospor
post
Post #19





Grupa: Moderatorzy
Postów: 36 557
Pomógł: 6315
Dołączył: 27.12.2004




/(\d+)\s(\d+),/g
przecinek ma byc warunkowy. PRzeciez po implode(',') przecinek wstawiany jest miedzy elementami a nie po.

while (1000!==++i)
tutaj z 0 robisz na dzien dobry 1 wiec sie nie dziw ze gubisz pierwszy element
Go to the top of the page
+Quote Post
KsaR
post
Post #20





Grupa: Zarejestrowani
Postów: 520
Pomógł: 102
Dołączył: 15.07.2014
Skąd: NULL

Ostrzeżenie: (0%)
-----


Juz działa -
[JAVASCRIPT] pobierz, plaintext
  1. // (...)
  2. var i = -1;
  3.  
  4. while (1000!==++i) {
  5. larr[i]=(i+1)+' '+lvls[i];
  6. }
  7.  
  8. var lvl = document.getElementById('lvl');
  9. lvl.innerHTML = `<table id="levels">
  10. <tr>
  11. <th>LvL</th><th>Experience</th>
  12. </tr>`+
  13. larr.join(',').replace(/(\d+)\s(\d+),?/g, "<tr><td>$1</td><td>$2</td></tr>").replace(/,/, '')
  14. +`</table>`;
[JAVASCRIPT] pobierz, plaintext


Wbrew pozorom pierw było var i = 0; i działało jak trzeba.
Tak jakby i++ oraz ++i nie mialo znaczenia w js w moim przypadku.
Zamienilem na -1 bo dawalo undefined 1001.... (Jak bylo i++).
I juz dziala ;d
Go to the top of the page
+Quote Post

2 Stron V   1 2 >
Reply to this topicStart new topic
2 Użytkowników czyta ten temat (2 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Aktualny czas: 16.09.2025 - 16:19