Javascript-форум (https://javascript.ru/forum/)
-   jQuery (https://javascript.ru/forum/jquery/)
-   -   jquery ajax - оооочень медленно :( (https://javascript.ru/forum/jquery/35295-jquery-ajax-oooochen-medlenno.html)

lolka84 06.02.2013 17:30

jquery ajax - оооочень медленно :(
 
Всем привет.
Подскажите пожалуйста новичку, в чем заключается моя ошибка.

Задача простая: вывод данных из БД на страницу. Как это делаю я:

При загрузке страницы вызываю функцию
$(document).ready(function(e) {

	ajaxOutput("<?php echo HOST.'/index.php'; ?>","#idOutputTable","<?php echo $smile['ajax_error']; ?>","viewClients");
	
});


которая имеет вид

function ajaxOutput(page,outputId,errorText,ajaxName,str) {
		
	s = (str == undefined) ? "ajax=" + ajaxName : "ajax=" + ajaxName + "&findStr=" + str;
	
	$.ajax({
		
		type:"POST",
		url:page,
		data:s,
		dataType:"html",
		success: function(res) {//alert(res);
			
			$(outputId).html(res); 
			
			return true;
						
		},
		error: function() { 
			
			msg(errorText,"error",5000);
			
			return false;
		
		}
		
	});
	
	return false;

}

нечего криминального вроде нет.
Далее функция передает данные в php файл, который делает запрос к БД, формирует таблицу с результатами и отдает ее функции.

Что имею в итоге: ~250 (!!!) записей в БД и время их вывода на страницу около 5 (!!!) сек!

Что не так делаю то :(
Как это вообще ПРАВИЛЬНО делается ?
Заранее благодарю!

DjDiablo 06.02.2013 19:08

Непонятно почему таблица по ajax грузится а не вместе со страницей.

Минус в том что эта таблица небудет замечена поисковиками.
Плюс в том что страница будет грузится быстрее.


к самому js коду претензий вроде нет.

сколько времени занимает прямое обращение по url из строки браузера ?

lolka84 06.02.2013 19:17

Цитата:

Сообщение от DjDiablo (Сообщение 232041)
Непонятно почему таблица по ajax грузится а не вместе со страницей.

Если имеется в виду, что нужно вынести вызов функции за пределы $(document).ready(), то абсолютно ничего не меняется при этом.

Цитата:

Сообщение от DjDiablo (Сообщение 232041)
сколько времени занимает прямое обращение по url из строки браузера ?

Около 5-6 сек :(

Вообще, видимо на самом дело в php скрипте, но там тоже особо никакого криминала нет, если кратко:
switch($POST['ajax']) {
case "var":
$query = query("SELECT * FROM `table`");
echo "<table>";
foreach ($query as $key => $val) {
echo "<tr>";
echo "<td>".$val['id']."</td>";
echo "<td>".$val['name']."</td>";
echo "<td>".$val['sum']."</td>";
echo "</tr>";
}
echo "</table>";
break;


Понятно, что есть там кое-какие вычисления простенькие, но что б 5 секунд обрабатывалось ~250 строк...

lolka84 06.02.2013 19:22

Смотрите

success: function(res) {//alert(res);
$(outputId).html(res);
return true;
},


alert() срабатывает через полсекунды после входа на страницу. Т.е. это значит, что функция отработала и данные получила, правильно ? После этого страница (не браузер) подвисает секунды на 4 и только после этого загружается контент в див. Как это понимать то ? Компьютер достаточно мощный, браузер хром последней версии.. Нечего не понимаю :(

DjDiablo 06.02.2013 19:24

Цитата:

Если имеется в виду, что нужно вынести вызов функции за пределы $(document).ready()
нет, имелся ввиду полный отказ от ajax

впрочем дело тут не в ajax.
ссылку на страницу дайте пожалуйста

странно что подвисает, возможно запрос не асинхронный.
добавьте async :true, быстрее не станет , но должно решить проблему с подвисанием браузера

lolka84 06.02.2013 19:26

Да полный отказ от ajax не проблема, но просто хочется сделать именно так, хотя бы для саморазвития.

Ссылку сейчас сделаю.

lolka84 06.02.2013 19:30

http://mytavatuy.ru/portfolio/3smile/

DjDiablo 06.02.2013 19:33

это что такое ?
http://test1.ru/3smile/?page=404

lolka84 06.02.2013 19:49

Это просто локальный адрес.

з.ы. async :true проблему подвисания не решило :(

DjDiablo 06.02.2013 19:57

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

всё что можно попробывать сделать для ajax это асинхронная загрузка и смена хостинга/тарифа

Это неокончательное утверждение, а поверхностная оценка.
Дополнительно можете замерить время генерации таблицы на сервере, но я почти уверен что оно занемает не более пары сотен милисекунд

lolka84 06.02.2013 20:01

Так локально то оно работает так же точно! :) По времени в смысле. На 3х разных компьютерах :(

DjDiablo 06.02.2013 20:07

Что значит локально ? c Денвера чтоли ?
на денвере у мну waiting 89ms против 3000 в инете.

lolka84 06.02.2013 20:11

Ну да.
Это всё хозяйство не для интернета, функционировать будет на одной машине, на которой подниму сервер с БД, ну или на крайний случай поставлю тот же денвер, не принципиально.

lolka84 06.02.2013 20:16

Одно все-таки не понятно: по какой причине страница на несколько секунд подвисает. Неужели из-за того, что js полученные данные на страницу вставляет ? Так их, по сути, не так уж и много.
Даже если в запрос поставить LIMIT 0,50 - все равно около двух секунд "висит". Ерунда какая-то :(

devote 06.02.2013 20:21

Цитата:

Сообщение от DjDiablo
просто время отклика сервера около 3х секунд

если бы сервер откликался 3 сек, я бы и основную страницу увидел бы не ранее чем через 3 сек. Но ее вижу сразу, моментально... Просто видимо при запросе на сервере, та страница куда обращается аякс, что то тормозит работу пыхапэ или на клиенте что-то тормозит. Нужно видеть полную картину клиентского и серверного кода.

devote 06.02.2013 20:29

Хотя все и так понятно. Вы вставляете огромное количество таблиц/ячеек через innerHTML я полагаю, да и что-то еще, ибо даже диалог поиска открывается через секунду после клика.. Что-то у вас на клиенте затормаживает все.

DjDiablo 06.02.2013 20:33

3с, в network смотрел.

Вы вставляете огромное количество таблиц/ячеек через innerHTML я полагаю,
через .html();
Я последние минут 15 через профилирование пытался замерить, но неудобно. Надо прям в коде замерерить сколько html работает.

devote 06.02.2013 20:34

и подобным образом писать не стоит:
$("#idP").html("");
$("#idP").append('<select id="idPastleDoctors" class="styled nonEnter" name="doctor">' + sel + '</select>');

пишите так:
$("#idP").html('<select id="idPastleDoctors" class="styled nonEnter" name="doctor">' + sel + '</select>');

У вас много написано совершенно не думая о скорости работы, запросы к элементам не нужно делать так:
$("#idError").css("top",$(window).scrollTop());
$("#idError").html(text);
$("#idError").show(500);

нужно писать так:
$("#idError").css("top",$(window).scrollTop()).html(text).show(500);

ну или на крайняк так:
var elem = $("#idError");
elem.css("top",$(window).scrollTop());
elem.html(text);
elem.show(500);

Это увеличит скорость работы JavaScript в разы

lolka84 06.02.2013 20:34

Понятно. Что ничего не понятно :) Но все равно - спасибо откликнувшимся за потраченное на меня время.

lolka84 06.02.2013 20:34

Цитата:

Сообщение от DjDiablo (Сообщение 232075)
Надо прям в код вписать замер.

Что нужно сделать ?:) Что куда вписать ?

lolka84 06.02.2013 20:36

devote, благодарю, что обратили внимание, обязательно займусь оптимизацией.

devote 06.02.2013 20:42

вот еще банальный пример:
$(".loader").css("top",($(window).height()-$(".loader").height())/2 + $(window).scrollTop() + "px");
$(".loader").css("left",($(window).width()-$(".loader").width())/2 + $(window).scrollLeft() + "px");

меняем так:
var
    loader = $(".loader"), // лишь один раз заставляем jQuery искать элемент
    wnd = $(window); // лишь один раз заставляем jQuery искать элемент

loader
    .css("top",(wnd.height()-loader.height())/2 + wnd.scrollTop() + "px")
    .css("left",(wnd.width()-loader.width())/2 + wnd.scrollLeft() + "px");

Старайтесь как можно меньше делать вызовы функций к которым часто нужно обращаться.

lolka84 06.02.2013 20:46

Отлично, не знал, что так можно нужно :)

DjDiablo 06.02.2013 21:05

Цитата:

Что нужно сделать ? Что куда вписать ?
var timer= function (){
        var lastTime=new Date().getTime();
        return function(){
          var time=new Date().getTime();
          console.log('время > ', time-lastTime);
          lastTime=time;           
        }
      };

      var test=timer();
      alert('быстро выключи меня');
      test();


В консоле будет видно сколько работала функция alert.

Исследуй подобным образом время работы функции HTML.
test() при необходимости можно вызывать несколько раз, и замерить каждый интерисующий этап, но нас больше всего HTML() интересует.

меня вот эта шняга сбивает с толку, это запрос при открытии диалога.
<img width="100%" src="http://www.spbvet.org/2013.png"/>


жду замеров.

lolka84 06.02.2013 21:31

Если правильно понял куда пихать функцию, то:
1. Если вставить ее в php скрипт (т.е. после вывода таблицы идет раздел <script>, там пара функций), то время получается ~800
2. Если вставлять ее непосредственно в success: function(res) {}, то время получается ~500

Но самое главное, до меня дошло, откуда "подвисание" это берется. Только ногами сильно не пинайте..:) Это все стилизация селектов и ui datapicker. Получается в каждой строке по селекту и по календарю - из-за этой байды вся проблема :)

lolka84 06.02.2013 21:39

По ссылке обновил, можете убедиться, если интересно :)

devote 06.02.2013 22:39

уже быстрее работает.

lolka84 07.02.2013 06:49

Намного :)
Еще раз спасибо, узнал много нового.

win32s 10.11.2023 19:53

Немного на другую тему, но может кто подскажет.
Есть скрипт, который загружает файлы на сервер через AJAX. На локалхосте все работает, а в продакшне люди жалуются, что грузит например 1 файл из трех.

Как такое может быть и в какую сторону копать? Думаю на медленный интернет, но вроде это не играет роли? Разве AJAX разбивает данные на части?

Nexus 10.11.2023 20:05

win32s, тут без хрустального шара не подсказать, а свой я потерял, к сожалению.

voraa 10.11.2023 20:07

Кто же знает, как вы грузите.
Что на сервере (php? node?)

Может медленный инет, большие файлы и по таймауту серверный скрипт отключается. Тогда надо проверить настройки сервера (в php)
Тестируйте сами в продакшене, смотрите сетевые ошибки. Сделайте в серверном скрипте логи и смотрите их.

win32s 10.11.2023 21:03

Nexus, код отправки примерно такой, но врядли в нем может быть ошибка, это же копипаст с учебника
$.ajax({url: $("#imgForm").attr('action'),
		type: 'post',
		data: window.FormDataAll,
		contentType: false,
		processData: false,
		/*async:false,*/
		success: function(data) 
			{
			$("#err1").hide();
			window.FormDataAll = null;
			window.imgArr =  {};
			$("#js-file-list *").remove();
			
			},

Весь код большой, 200 строк примерно. Я не против оплатить консультацию / дебаг, если кто возьмется . Но беда в том, что неясно как отловить ошибку - люди доступ через тимвьювер не дают к своим устройствам где "не работает".

voraa 10.11.2023 21:21

Причем тут код отправки.
Допустим пользователь выбирает для отправки много файлов. Серверный скрипт работает долго, загружая их. И слетает по таймауту. Надо смотреть какой таймаут установлен и может быть увеличивать его.
Другой подход - пользователь выбирает много файлов, но вы их грузите по одному. Загрузился один, начинаете загрузку следующего. Много раз вызывается серверный скрипт, но каждый раз он работает короткое время и таймаута не возникает.

win32s 10.11.2023 21:24

voraa,серверный скрипт залогирую + увеличу таймер.
Гружу вроде все вместе, код выше так делает. По уму, правильнее разбивать по одному?

voraa 10.11.2023 21:28

Цитата:

Сообщение от win32s
По уму, правильнее разбивать по одному?

Все зависит от условий использования. Может там пользователь грузит пяток небольших файлов - это одно, а если предполагается загрузка десятков больших - это другое.
Универсального решения нет.

voraa 10.11.2023 21:33

Цитата:

Сообщение от win32s
люди доступ через тимвьювер не дают к своим устройствам где "не работает".

Отлаживайте сами. Сами грузите файлы в разных количествах и разных размеров и ловите ошибку.

Хотя метод дурной. В одной конторе мне тоже жаловались, что медленно, с ошибками....(по их локальной сети с внутренним сервером) Я прихожу к ним, сажусь за комп - все летает. Оказывается они пускали меня за комп в обед или вечером, когда сеть не нагружена. А как все принимаются за работу так труба.

win32s 10.11.2023 21:36

voraa, в том то и беда, что сложно отладить. Наверное, лучшим вариантом будет взять готовый какой-то jQuery фото плагин. Мне надо, по факту, загружать до 5 файлов картинок, это типа хостинга картинок. Может, есть уже отлаженные вещи.
p.s. не могу поставить плюс, пишет ошибку.

voraa 10.11.2023 21:41

Цитата:

Сообщение от win32s
загружать до 5 файлов картинок,

Обычно это проблем не вызывает. 10-20 Мб для нормальной сети не проблема. Надо искать в чем дело. Смотреть сетевые ошибки.
Я у вас в коде вижу success.
А функция для error есть?

win32s 11.11.2023 02:21

voraa, не было, да. По итогу - в логах апача оказались ошибки max_post_size, в общем передавалось 5 файлов, по 5 мб, а максимальный размер был 10Мб.
В итоге, взял готовый плагин отсюда https://github.com/hayageek/jquery-upload-file/ .


Часовой пояс GMT +3, время: 18:49.