Mało wydajny ajax

L1
  • Rejestracja:około 7 lat
  • Ostatnio:ponad 6 lat
  • Postów:16
0

Na swojej stronie mam kilka elementów opartych na ajaxie (używam jQuery i $.ajax). Problem mam w tym, że gdy pobieram nim trochę większe dane niż sam tekst (tj. moja jedna "paczka" to kilka divów i zdjęcie) to użycie procesora po stronie użytkownika wynosi około 20%, i to nawet nie w samym momencie pobierania tylko ciągle, w bezruchu użycie procesora spada do 15% co i tak mnie nie satysfakcjonuje.
Próbowałem użyć frameworka prototype.js i metody new Ajax, lecz z podobnym rezultatem. Znacie alternatywne, mniej zasobożerne, dynamiczne sposoby pobierania danych z bazy mysql? Może jakaś dodatkowa biblioteka/framework?

konserwa
Za pierwszym razem przeczytałem "Mało wydajny sex"
NanTl
  • Rejestracja:ponad 6 lat
  • Ostatnio:ponad 6 lat
  • Postów:7
1
Patryk27
Moderator
  • Rejestracja:ponad 17 lat
  • Ostatnio:ponad rok
  • Lokalizacja:Wrocław
  • Postów:13042
1

Pokaż kod - sam Ajax czy jQuery nie powinien czegoś takiego powodować.


edytowany 1x, ostatnio: Patryk27
cerrato
Moderator Kariera
  • Rejestracja:około 7 lat
  • Ostatnio:około 4 godziny
  • Lokalizacja:Poznań
  • Postów:8769
2

Sprawdź coś innego - czy jak dasz te dane (slidery itp.) "na sztywno" do pliku HTML, to czy obciążenie będzie takie samo. Wcale nie jest powiedziane, że winny jest AJAX - zwłaszcza, że piszesz o tym, że obciążenie jest cały czas, nawet po pobraniu danych.


edytowany 1x, ostatnio: cerrato
LukeJL
  • Rejestracja:około 11 lat
  • Ostatnio:minuta
  • Postów:8410
0

użycie procesora po stronie użytkownika wynosi około 20%,

Jak to sprawdzałeś?


L1
  • Rejestracja:około 7 lat
  • Ostatnio:ponad 6 lat
  • Postów:16
0

Nie próbowałem dawać tych elementów statycznie, dlatego że to czysty html i css (zdjęcie i trochę ładnie opakowanego tekstu), nie mam tam sliderów. Wnioskuję że to wina ajaxa ponieważ po zakomentowaniu funkcji z nim problem znika (dodam że funkcja aktywowana jest automatycznie po zjechaniu na dół strony), co ciekawe gdy skończą się elementy do wyświetlenia, obciążenie spada praktycznie do zera. Dodatkowo na innej podstronie ładuje tak wiadomości między użytkownikami (pojemnik teskt i awatar) i obciążenie tam jest rzędu 10-15% tylko wtedy gdy Ajax ma coś w zanadrzu do załadowania, jeśli są dwie, trzy wiadomości to wyświetlają się od razu i obciążenie wynosi 0, a korzystam z tej samej funkcji (poniższą funkcje, jakiej używam, pisałem teraz na telefonie z głowy więc przepraszam jeśli trafiła się literówka).

Kopiuj
function display(limit, offset) {
$.ajax({
  type: 'get',
  url: 'loaddata.php',
  data: 'limit=' + limit + '&offset=' + offset + <?php //trochę danych z php ?>,
beforeSend: function () {
$("#loader_image").show();
},
  success: function (html) {
$('loader_image').hide();
   $( '#results' ).append(html);
if(html == "")
{
 $( '#message' ).html("to już wszystko");
}
  }
  });
}
edytowany 1x, ostatnio: loczek111
L1
  • Rejestracja:około 7 lat
  • Ostatnio:ponad 6 lat
  • Postów:16
0

Zwykły menadżer zadań w windowsie pokazuje obciążenie procesora dla przeglądarki a w liście poniżej dla każdej witryny otwartej w karcie osobno, nie kłamie bo na tych "ciężkich" podstronach załącza się wiatrak w laptopie (sprawdzałem dla pewności na dwóch) i właśnie to mnie zaintrygowało do sprawdzenia tego.

Patryk27
Moderator
  • Rejestracja:ponad 17 lat
  • Ostatnio:ponad rok
  • Lokalizacja:Wrocław
  • Postów:13042
0

Czej, podpiąłeś tę funkcję pod onscroll?


L1
  • Rejestracja:około 7 lat
  • Ostatnio:ponad 6 lat
  • Postów:16
0

Tak, mam warunek jeśli zjedzie się poniżej danego pułapu to wywoływana jest ta funkcja oraz zmienna globalna offset się zwiększa i wykorzystuję ją w zapytaniu do bazy.

Patryk27
Moderator
  • Rejestracja:ponad 17 lat
  • Ostatnio:ponad rok
  • Lokalizacja:Wrocław
  • Postów:13042
4

No, czyli odpalasz tę swoją funkcję prawdopodobnie kilkadziesiąt~kilkaset razy na sekundę - wrzuć sobie tam console.log i przekonaj się sam.


L1
  • Rejestracja:około 7 lat
  • Ostatnio:ponad 6 lat
  • Postów:16
0

Wrzucę, spróbuję ale niestety dopiero wieczorem. Wydaje mi się że moja funkcja włączana jest tylko raz po spełnieniu warunku (przewinięciu strony do danego pułapu), raz ponieważ dodałem zmienną zabezpieczającą, która jest w warunku obok on scroll i ustawiana jest na false w momencie wywołania funkcji i przy 'success' w ajaxie z powrotem na true. Po załadowaniu danych tą funkcją zmienia się wysokość witryny i żeby warunek on scroll w if'ie był spełniony trzeba zjechać niżej.

edytowany 1x, ostatnio: loczek111
L1
  • Rejestracja:około 7 lat
  • Ostatnio:ponad 6 lat
  • Postów:16
0

Poza tym za każdym wywołaniem zwiększa się offset i gdyby wywoływała się więcej niż raz to po jednej takiej serii wyświetliły by się wszystkie elementy z bazy a wyświetlam ich po 10 na raz

LukeJL
  • Rejestracja:około 11 lat
  • Ostatnio:minuta
  • Postów:8410
1
Patryk27 napisał(a):

No, czyli odpalasz tę swoją funkcję prawdopodobnie kilkadziesiąt~kilkaset razy na sekundę - wrzuć sobie tam console.log i przekonaj się sam.

Przy czym należy jeszcze pamiętać, że console.log obniża wydajność i po sprawdzeniu trzeba go zlikwidować. Taki głupiutki szczegół, ale już miałem sytuacje, że coś mi muliło, a okazało się, że gdzieś zapomniałem console.loga wywalić.


edytowany 1x, ostatnio: LukeJL
Patryk27
Moderator
  • Rejestracja:ponad 17 lat
  • Ostatnio:ponad rok
  • Lokalizacja:Wrocław
  • Postów:13042
1

@loczek111: w takim razie wrzuć więcej kodu, bo w przytoczonym przez Ciebie fragmencie nie ma żadnej inkrementacji czy zabezpieczeń.


L1
  • Rejestracja:około 7 lat
  • Ostatnio:ponad 6 lat
  • Postów:16
0

Znalazłem winowajcę, którym okazała się animacja ładowania w css. Dla ciekawskich wrzucam jej kod, jeśli przy stylu ".loader" zmienicie pozycję na relatywną (ja taką miałem) to animacja ta wymusza ciągłe przerysowanie obiektów ponieważ nieustannie zmienia swoją wysokość i obciąża tym samym procesor w 10%, w połączeniu z ajaxem obciążenie rośnie do 20%. Dziękuje za zainteresowanie tematem i przepraszam za kłopot ale kończyły mi się już pomysły. Przynajmniej dowiedziałem się o alternatywie ajaxa, czyli Fetch API.

Kopiuj
użycie: <div class="loader"></div>


.loader,
.loader:before,
.loader:after {
  background: #0099ff;
  -webkit-animation: load1 1s infinite ease-in-out;
  animation: load1 1s infinite ease-in-out;
  width: 1em;
  height: 4em;
}
.loader {
  color: #0099ff;
  text-indent: -9999em;
  margin: 50px auto;
  position: absolute;
  font-size: 7px;
  -webkit-transform: translateZ(0);
  -ms-transform: translateZ(0);
  transform: translateZ(0);
  -webkit-animation-delay: -0.16s;
  animation-delay: -0.16s;
}
.loader:before,
.loader:after {
  position: absolute;
  top: 0;
  content: '';
}
.loader:before {
  left: -1.5em;
  -webkit-animation-delay: -0.32s;
  animation-delay: -0.32s;
}
.loader:after {
  left: 1.5em;
}
@-webkit-keyframes load1 {
  0%,
  80%,
  100% {
    box-shadow: 0 0;
    height: 4em;
  }
  40% {
    box-shadow: 0 -2em;
    height: 5em;
  }
}
@keyframes load1 {
  0%,
  80%,
  100% {
    box-shadow: 0 0;
    height: 4em;
  }
  40% {
    box-shadow: 0 -2em;
    height: 5em;
  }
} 
LukeJL
  • Rejestracja:około 11 lat
  • Ostatnio:minuta
  • Postów:8410
2

Tak więc najpierw się sprawdza grafikę i bajery (i testowo je wyłącza), a dopiero potem wini ajaxa XD
Od korelacji (za każdym razem kiedy włączam ajaxa, muli) do przyczyny jeszcze daleka droga.

Z drugiej strony te parę animacji też nie powinno zamulać. Czy na pewno @Patryk27 nie miał racji?
czyli odpalasz tę swoją funkcję prawdopodobnie kilkadziesiąt~kilkaset razy na sekundę - wrzuć sobie tam console.log i przekonaj się sam.

Wydaje mi się

Debugowanie to nauka/empiria, a nie gdybanie. Wszystkie hipotezy trzeba sprawdzić, nawet te, na które myślisz, że znasz odpowiedź.

ponieważ dodałem zmienną zabezpieczającą,

Gdzie jest ta zmienna?

Poza tym jaki jest twój kod HTML? Bo tutaj piszesz:

Kopiuj
 $("#loader_image")

czyli element o id loader_image, a tam dalej już

Kopiuj
$('loader_image')

czyli element <loader_image> (a nie żaden <div> czy <img>)

a we wrzuconych CSS w ogóle nie masz do tego odniesienia, tylko do .loader.

Albo masz podobny kod w HTML:

Kopiuj
<loader-image id="loader-image" class="loader">

albo czegoś nie rozumiem.

Możliwe więc, że coś chowasz, a naprawdę nie chowasz.


edytowany 1x, ostatnio: LukeJL
Zobacz pozostały 1 komentarz
LukeJL
wiem, nawet polubiłem posta :)
cerrato
To czy teraz ja muszę w rewanżu polubić Twojego? ;)
LukeJL
lajków nigdy za dużo ;)
cerrato
No dobra, dałem :D
MA
  • Rejestracja:prawie 17 lat
  • Ostatnio:około 17 godzin
  • Postów:644
2

Podstawowy błąd to zwracanie HTML w odpowiedzi AJAX, nadmiarowość treści - pobierasz same dane w JSON i po odebraniu pakujesz to w HTML już po stronie przeglądarki.

L1
  • Rejestracja:około 7 lat
  • Ostatnio:ponad 6 lat
  • Postów:16
0

@LukeJL: Funkcja wywołuje się raz, sprawdzałem console.logiem. Wrzucam resztę kodu który aktywuje tą funkcje, przepraszam że dopiero dziś ale wczoraj po napisaniu tego postu musiałem pilnie wyjść z domu i wróciłem dopiero późnym wieczorem. Natomiast co do loader_image, to jest to komórka w tabeli o tym id i dopiero w środku jest <div class="loader"></div> (faktycznie trochę bajzel, już to pozmieniałem). W funkcji wyżej jest literówka, w $('loader_image').hide(); brakuje oczywiście #. Dosyć istotna literówka ale jeszcze raz przepraszam, jak mówiłem funkcje pisałem na telefonie, ponieważ nagle i pilnie musiałem wyjechać.

Kopiuj

var busy = false;
var limit = 10;
var offset = 0;

   $(document).ready(function() {
if (busy == false) {
  busy = true;
  display(limit, offset);
}
        
       $(window).scroll(function() {
          
          if ($(window).scrollTop() + $(window).height() > $("#results").height() && !busy) {
            busy = true;
            offset = limit + offset;

            display(limit, offset);
        }
});
});
edytowany 3x, ostatnio: loczek111
Kliknij, aby dodać treść...

Pomoc 1.18.8

Typografia

Edytor obsługuje składnie Markdown, w której pojedynczy akcent *kursywa* oraz _kursywa_ to pochylenie. Z kolei podwójny akcent **pogrubienie** oraz __pogrubienie__ to pogrubienie. Dodanie znaczników ~~strike~~ to przekreślenie.

Możesz dodać formatowanie komendami , , oraz .

Ponieważ dekoracja podkreślenia jest przeznaczona na linki, markdown nie zawiera specjalnej składni dla podkreślenia. Dlatego by dodać podkreślenie, użyj <u>underline</u>.

Komendy formatujące reagują na skróty klawiszowe: Ctrl+B, Ctrl+I, Ctrl+U oraz Ctrl+S.

Linki

By dodać link w edytorze użyj komendy lub użyj składni [title](link). URL umieszczony w linku lub nawet URL umieszczony bezpośrednio w tekście będzie aktywny i klikalny.

Jeżeli chcesz, możesz samodzielnie dodać link: <a href="link">title</a>.

Wewnętrzne odnośniki

Możesz umieścić odnośnik do wewnętrznej podstrony, używając następującej składni: [[Delphi/Kompendium]] lub [[Delphi/Kompendium|kliknij, aby przejść do kompendium]]. Odnośniki mogą prowadzić do Forum 4programmers.net lub np. do Kompendium.

Wspomnienia użytkowników

By wspomnieć użytkownika forum, wpisz w formularzu znak @. Zobaczysz okienko samouzupełniające nazwy użytkowników. Samouzupełnienie dobierze odpowiedni format wspomnienia, zależnie od tego czy w nazwie użytkownika znajduje się spacja.

Znaczniki HTML

Dozwolone jest używanie niektórych znaczników HTML: <a>, <b>, <i>, <kbd>, <del>, <strong>, <dfn>, <pre>, <blockquote>, <hr/>, <sub>, <sup> oraz <img/>.

Skróty klawiszowe

Dodaj kombinację klawiszy komendą notacji klawiszy lub skrótem klawiszowym Alt+K.

Reprezentuj kombinacje klawiszowe używając taga <kbd>. Oddziel od siebie klawisze znakiem plus, np <kbd>Alt+Tab</kbd>.

Indeks górny oraz dolny

Przykład: wpisując H<sub>2</sub>O i m<sup>2</sup> otrzymasz: H2O i m2.

Składnia Tex

By precyzyjnie wyrazić działanie matematyczne, użyj składni Tex.

<tex>arcctg(x) = argtan(\frac{1}{x}) = arcsin(\frac{1}{\sqrt{1+x^2}})</tex>

Kod źródłowy

Krótkie fragmenty kodu

Wszelkie jednolinijkowe instrukcje języka programowania powinny być zawarte pomiędzy obróconymi apostrofami: `kod instrukcji` lub ``console.log(`string`);``.

Kod wielolinijkowy

Dodaj fragment kodu komendą . Fragmenty kodu zajmujące całą lub więcej linijek powinny być umieszczone w wielolinijkowym fragmencie kodu. Znaczniki ``` lub ~~~ umożliwiają kolorowanie różnych języków programowania. Możemy nadać nazwę języka programowania używając auto-uzupełnienia, kod został pokolorowany używając konkretnych ustawień kolorowania składni:

```javascript
document.write('Hello World');
```

Możesz zaznaczyć również już wklejony kod w edytorze, i użyć komendy  by zamienić go w kod. Użyj kombinacji Ctrl+`, by dodać fragment kodu bez oznaczników języka.

Tabelki

Dodaj przykładową tabelkę używając komendy . Przykładowa tabelka składa się z dwóch kolumn, nagłówka i jednego wiersza.

Wygeneruj tabelkę na podstawie szablonu. Oddziel komórki separatorem ; lub |, a następnie zaznacz szablonu.

nazwisko;dziedzina;odkrycie
Pitagoras;mathematics;Pythagorean Theorem
Albert Einstein;physics;General Relativity
Marie Curie, Pierre Curie;chemistry;Radium, Polonium

Użyj komendy by zamienić zaznaczony szablon na tabelkę Markdown.

Lista uporządkowana i nieuporządkowana

Możliwe jest tworzenie listy numerowanych oraz wypunktowanych. Wystarczy, że pierwszym znakiem linii będzie * lub - dla listy nieuporządkowanej oraz 1. dla listy uporządkowanej.

Użyj komendy by dodać listę uporządkowaną.

1. Lista numerowana
2. Lista numerowana

Użyj komendy by dodać listę nieuporządkowaną.

* Lista wypunktowana
* Lista wypunktowana
** Lista wypunktowana (drugi poziom)

Składnia Markdown

Edytor obsługuje składnię Markdown, która składa się ze znaków specjalnych. Dostępne komendy, jak formatowanie , dodanie tabelki lub fragmentu kodu są w pewnym sensie świadome otaczającej jej składni, i postarają się unikać uszkodzenia jej.

Dla przykładu, używając tylko dostępnych komend, nie możemy dodać formatowania pogrubienia do kodu wielolinijkowego, albo dodać listy do tabelki - mogłoby to doprowadzić do uszkodzenia składni.

W pewnych odosobnionych przypadkach brak nowej linii przed elementami markdown również mógłby uszkodzić składnie, dlatego edytor dodaje brakujące nowe linie. Dla przykładu, dodanie formatowania pochylenia zaraz po tabelce, mogłoby zostać błędne zinterpretowane, więc edytor doda oddzielającą nową linię pomiędzy tabelką, a pochyleniem.

Skróty klawiszowe

Skróty formatujące, kiedy w edytorze znajduje się pojedynczy kursor, wstawiają sformatowany tekst przykładowy. Jeśli w edytorze znajduje się zaznaczenie (słowo, linijka, paragraf), wtedy zaznaczenie zostaje sformatowane.

  • Ctrl+B - dodaj pogrubienie lub pogrub zaznaczenie
  • Ctrl+I - dodaj pochylenie lub pochyl zaznaczenie
  • Ctrl+U - dodaj podkreślenie lub podkreśl zaznaczenie
  • Ctrl+S - dodaj przekreślenie lub przekreśl zaznaczenie

Notacja Klawiszy

  • Alt+K - dodaj notację klawiszy

Fragment kodu bez oznacznika

  • Alt+C - dodaj pusty fragment kodu

Skróty operujące na kodzie i linijkach:

  • Alt+L - zaznaczenie całej linii
  • Alt+, Alt+ - przeniesienie linijki w której znajduje się kursor w górę/dół.
  • Tab/⌘+] - dodaj wcięcie (wcięcie w prawo)
  • Shit+Tab/⌘+[ - usunięcie wcięcia (wycięcie w lewo)

Dodawanie postów:

  • Ctrl+Enter - dodaj post
  • ⌘+Enter - dodaj post (MacOS)