 
			
				20.04.2012, 18:58
			
			
			
		  
	 | 
 
	
		
		
		
			
			| 
			
				
				
				 Профессор 
				
				
				
				
	
 
 
 
			 | 
			  | 
			
				
				
					Регистрация: 02.07.2010 
					
					
					
						Сообщений: 642
					 
					
					
			
		
 
		 
		
			 | 
		 
		 
		
	 | 
 
	| 
	
	
		
		
			
			 
				Где лучше выполнять арифметические операции? На клиенте или на сервере?
			 
			
		
		
		
		Вроде простой технический вопрос, но превратился в философский. Кого больше грузить: компьютер Клиента, или сервер? 
Задачка такая: надо отобразить таблицу из трех колонок и тысячи строк. В первом столбце - число А, во втором - число B, в третьем - С, где C = A+B. 
Пусть лучше считает javascript, или сервер? Если javascript, то мы уменьшаем нагрузку на сервер, уменьшаем клиентский трафик, но замедляем работу браузера. Если наоборот, то сотня клиентов, подключившись к серверу тоже могут замедлить общий процесс получения данных... Причем формула сложения - это простейший случай. А может быть формула по теореме Пифагора вычисления гипотенузы как квадратного корня из суммы квадратов катетов, а может быть сложная формула, учитывающая с десяток переменных... 
У кого есть опыт в подобных задачах? Прошу совета. 
		
	
		
		
		
		
		
		
	
		
		
	
	
	 | 
 
 
	 
		 | 
 
 
	
	
	
		
	
		
		
		
			
			 
			
				20.04.2012, 19:43
			
			
			
		  
	 | 
 
	
		
		
		
			
			| 
			
				
				
				 Кандидат Javascript-наук 
				
				
				
				
	
 
 
 
			 | 
			  | 
			
				
				
					Регистрация: 16.02.2012 
					
					
					
						Сообщений: 109
					 
					
					
			
		
 
		 
		
			 | 
		 
		 
		
	 | 
 
	
	
	
		
		
		
		
		По мне так, максимально надо скидывать всю оработку информации клиенту, пусть его машина думает. Клиентов много, а сервер один, ему и без этой ерунды хватает занятий. Если у кого-то что-то тормозит - это его проблемы, пусть покупают компы получше    
		
	
		
		
		
		
		
		
	
		
		
	
	
	 | 
 
 
	 
		 | 
 
 
	
	
	
		
	
		
		
		
			
			 
			
				21.04.2012, 13:42
			
			
			
		  
	 | 
 
	
		
		
		
			
			| 
			
				
				
				 Профессор 
				
				
				
				
	
 
 
 
			 | 
			  | 
			
				
				
					Регистрация: 02.07.2010 
					
					
					
						Сообщений: 642
					 
					
					
			
		
 
		 
		
			 | 
		 
		 
		
	 | 
 
	
	
	
		
		
		
		
		
	
 
	
		
			Сообщение от nasqad
			 
		
	 | 
 
	| 
		делаете тест, прогоняете 100000 выдач...
	 | 
 
	
 
 Я уже сделал много разных тестов на своей машине и на сервере. Но проблема в том, что затруднительно имитировать одновременное подключение к серверу сотни компьютеров, причем каждый запрашивает свой вариант вычислений. Поэтому тесты получаются довольно приблизительные.
 
	
 
	
		
			Сообщение от nasqad
			 
		
	 | 
 
	| 
		... так что вы переоцениваете нагрузку
	 | 
 
	
 
 Проблема в том, что парк компьютеров очень разнообразен. Среди 5000 компьютеров предприятия есть памятники, у которых еще 256 KByte ОЗУ. Также если знаете что такое "компьютерные политики", то их на предприятии немерено (всякие проги, висящие в памяти и следящие за чем-то). Всё это в конечном итоге приводит к торможению всех процессов, в том числе и работу javascript. Некоторые операции выливаются не в 300 ms, а в 3 сек., а это уже пользователей раздражает. Поэтому хотелось бы не портить им настроение. 
Ну и как я уже говорил, формула сложения - это простейший случай. Могут быть формулы вычисления типа: возьми ячейки с 1-й по 10-ю, сложи их содержимое и раздели на сумму ячеек с 11-й по 20-ю..., т.е. групповые операции.  
		
	
		
		
		
		
		
		
	
		
			
			
	
			
			
			
			
			
				 
			
			
			
			
			
			
				
			
			
			
		 
		
	
	
	 | 
 
 
	 
		 | 
 
 
	
	
	
		
	
		
		
		
			
			 
			
				21.04.2012, 13:48
			
			
			
		  
	 | 
 
	
		
		
		
			
			| 
			
				
				
				 Профессор 
				
				
				
				
	
 
 
 
			 | 
			  | 
			
				
				
					Регистрация: 02.07.2010 
					
					
					
						Сообщений: 642
					 
					
					
			
		
 
		 
		
			 | 
		 
		 
		
	 | 
 
	
	
	
		
		
		
		
		
	
 
	
		
			Сообщение от vuler
			 
		
	 | 
 
	
		По мне так, максимально надо скидывать всю оработку информации клиенту, пусть его машина думает. Клиентов много, а сервер один, ему и без этой ерунды хватает занятий. Если у кого-то что-то тормозит - это его проблемы, пусть покупают компы получше  
	 | 
 
	
 
 Я тоже так раньше думал. Но это жить как я говорю "без любви к людям". Учусь у Гугла. Знаете сколько серверов у Гугла? - Говорят больше миллиона. Если бы Гугл сказал: мы сделали классный поисковый механизм, а то что оно медленно отображает информацию на вашем компьютере - это ваши проблемы! Покупайте новый компьютер! Если бы Гугл сказал, что медленный интернет - это ваши проблемы! и т.д.... - мы бы Гугл не уважали. А мы уважаем. За что? -За то, что они думают в первую очередь о пользователях. 
P.S. Гуглу легче. У него милли...милли...миллиарды $     
		
	
		
		
		
		
		
		
	
		
		
	
	
	 | 
 
 
	 
		 | 
 
 
	
	
	
		
	
		
		
		
			
			 
			
				21.04.2012, 13:51
			
			
			
		  
	 | 
 
	
		
		
		
			
			| 
			
				
				
				 Профессор 
				
				
				
				
	
 
 
 
			 | 
			  | 
			
				
				
					Регистрация: 02.07.2010 
					
					
					
						Сообщений: 642
					 
					
					
			
		
 
		 
		
			 | 
		 
		 
		
	 | 
 
	
	
	
		
		
		
		
		
	
 
	
		
			Сообщение от Maxmaxmахimus
			 
		
	 | 
 
	| 
		то что не требует проверки, на клиент, очевидно же.
	 | 
 
	
 
 Проверки чего? Речь же не идет о вводе данных пользователем. Речь идет о том, что всю информацию можно сначала посчитать на сервере, а потом отправить клиенту, либо отправить клиенту исходные данные и формулу - пусть считает сам.  
		
	
		
		
		
		
		
		
	
		
		
	
	
	 | 
 
 
	 
		 | 
 
 
	
	
	
		
	
		
		
		
			
			 
			
				21.04.2012, 14:36
			
			
			
		  
	 | 
 
	
		
		
		
			  | 
			
			
				
				
				 сегодня в 12:34|Комментир 
				
				
				
				
	
 
 
 
			 | 
			  | 
			
				
				
					Регистрация: 12.04.2011 
					
					
					
						Сообщений: 1,180
					 
					
					
			
		
 
		 
		
			 | 
		 
		 
		
	 | 
 
	
	
	
		
		
		
		
		
	
 
	| 
		
			Сообщение от Маэстро
			
		
	 | 
 
	| 
		Знаете сколько серверов у Гугла? - Говорят больше миллиона.
	 | 
 
	
 
 да не говорят, так и есть, и не миллион, а (1300+)млн, когда у яндекса есл не ошибаюсь: (300+) тысяч  
		
	
		
		
		
		
		
			
				__________________ 
				оляля, ололо
			 
		
		
		
		
	
		
		
	
	
	 | 
 
 
	 
		 | 
 
 
	
	
	
		
	
		
		
		
			
			 
			
				21.04.2012, 14:46
			
			
			
		  
	 | 
 
	
		
		
		
			
			| 
			
				
				
				 Профессор 
				
				
				
				
	
 
 
 
			 | 
			  | 
			
				
				
					Регистрация: 02.07.2010 
					
					
					
						Сообщений: 642
					 
					
					
			
		
 
		 
		
			 | 
		 
		 
		
	 | 
 
	
	
	
		
		
		
		
		
	
 
	
		
			Сообщение от Maxmaxmахimus
			 
		
	 | 
 
	| 
		Проверки это то что человек может захотеть взломать. например голосовалки и прочее.
	 | 
 
	
 
 Та нет в задаче никаких голосовалок! Есть отображение таблицы: 
В первой колонке - Наименование товара. 
Во второй - Остаток на складе [штук] 
В третьей - Цена за штуку [$] 
В четвертую колонку надо положить (посчитать) произведение количества штук по строке на цену товара, т.е. стоимость данного конкретного товара. 
И так 5000 строк. 
Ниже всей таблицы надо в ячейке поместить сумму значений всей четвертой колонки, т.е. ответить на вопрос: на какую сумму товара хранится на складе?
 
Где будете всё это считать? Неужели на клиенте?  
		
	
		
		
		
		
		
		
	
		
		
	
	
	 | 
 
 
	 
		 | 
 
 
	
	
	
		
	
		
		
		
			
			 
			
				21.04.2012, 15:06
			
			
			
		  
	 | 
 
	
		
		
		
			
			| 
			
				
				
				 х.з 
				
				
				
				
	
 
 
			 | 
			  | 
			
				
				
					Регистрация: 21.11.2010 
					
					
					
						Сообщений: 4,588
					 
					
					
			
		
 
		 
		
			 | 
		 
		 
		
	 | 
 
	
	
	
		
		
		
		
		
	
 
	| 
		
			Сообщение от Маэстро
			
		
	 | 
 
	| 
		Ну и как я уже говорил, формула сложения - это простейший случай. Могут быть формулы вычисления типа: возьми ячейки с 1-й по 10-ю, сложи их содержимое и раздели на сумму ячеек с 11-й по 20-ю..., т.е. групповые операции.
	 | 
 
	
 
 вот из за этого и не стоит переносить на клиент.у Js приблизительное вычисление и выйдут не точные результаты
 http://javascript.ru/blog/Andrej-Par...e-vychisleniya 
		
	
		
		
		
		
		
		
		
						  
				
				Последний раз редактировалось dmitriymar, 21.04.2012 в 15:10.
				
				
			
		
		
	
		
		
	
	
	 | 
 
 
	 
		 | 
 
 
	
	
	
		
	
		
		
		
			
			 
			
				21.04.2012, 17:12
			
			
			
		  
	 | 
 
	
		
		
		
			
			| 
			
				
				
				 Профессор 
				
				
				
				
	
 
 
 
			 | 
			  | 
			
				
				
					Регистрация: 02.07.2010 
					
					
					
						Сообщений: 642
					 
					
					
			
		
 
		 
		
			 | 
		 
		 
		
	 | 
 
	
	
	
		
		
		
		
		
	
 
	
		
			Сообщение от dmitriymar
			 
		
	 | 
 
	| 
		вот из за этого и не стоит переносить на клиент.у Js приблизительное вычисление и выйдут не точные результаты
	 | 
 
	
 
 Не знаю как насчет неточности вычислений (а кстати есть JS-библиотека, которая работает точно с биллионными числами), но давайте посмотрим на примере. Итак решили считать на сервере. 
Вот ситуация: клиенту приехала 1000-строковая таблица с тремя колонками. 
В первой колонке - Наименование товара. 
Во второй колонке - Себестоимость товара. 
В третью колонку надо посчитать Продажную цену товара, которая, как известно, равна себестоимости товара плюс некий процент от  себестоимости товара. 
Менеджер выставляет этот процент (а может это "скидка" была постоянному клиенту) и желает видеть результат в третьей колонке - это раз. И два - он хочет увидеть общую потенциальную прибыль после продажи товара, т.е., разницу между суммой X и суммой Y. Менеджер может "поиграть" процентом: поставить 15%, 16%,.. 23%,.. 
Казалось бы что еще проще? Javascript перемножит себестоимости на проценты, сложит за секунду. Но мы решили это делать на сервере! 
В результате начинается гоняние интернет-трафика туда/сюда и соответствующая бестолковая нагрузка на сервер...
 
P.S. Вы не подумайте, что я шарахаюсь то в одну, то в другую сторону. Я понимаю, что одни задачи лучше решать "тут", а другие "там". Но вот есть ли более-менее строгий критерий, по которому эти задачи можно разделить на там/тут?  
		
	
		
		
		
		
		
		
	
		
			
			
	
			
			
			
			
			
				 
			
			
			
			
			
			
				
			
			
			
		 
		
	
	
	 | 
 
 
	 
		 | 
 
 
	
	
	
		
	
		
		
		
			
			 
			
				22.04.2012, 15:21
			
			
			
		  
	 | 
 
	
		
		
		
			  | 
			
			
				
				
				 Модератор 
				
				
				
				
	
 
 
 
			 | 
			  | 
			
				
				
					Регистрация: 27.04.2010 
					
					
					
						Сообщений: 3,417
					 
					
					
			
		
 
		 
		
			 | 
		 
		 
		
	 | 
 
	
	
	
		
		
		
		
		Маэстро, на клиенте, конечно. Если есть возможность снять нагрузку с сервера - её надо снять. Тем более, какая разница - будет человек ждать, пока оно у вас на сервере посчитается, или пока оно посчитается на клиенте. Дальше: вычисления можно сделать "асинхронными" - тогда клиент не будет подвисать, а на время их выполнения поставить весёлую анимацию загрузки.
 dmitriymar, в js есть функция toFixed, с её помощью можно вполне сделать вычисления удовлетворяюще точными.
 
Ну и напоследок... Бивас, тест! (с)
 Внимание, этот код может повесить ваш браузер!
<div id="log"></div>
<script>
var log= document.getElementById("log");
var t1= +(new Date());
for (var a=0, b=0, c; a!==1000; ++a, b+=2) {
 c= Math.pow(Math.pow(a, 2) + Math.pow(b, 2), 1/2);
 log.innerHTML+="<br>"+c;
};
alert(+(new Date()) - t1);
</script>
На моём компе - не самом мощном, между прочим - около 5 секунд. И то, такое значение - лишь из-за операций вставки в дом, которые, как известно, весьма тяжёлые. А теперь этот же пример - с оптимизацией:
 
1) Сначала всё в строку:
 
<div id="log"></div>
<script>
var log = "";
var t1= +(new Date());
for (var a=0, b=0, c; a!==1000; ++a, b+=2) {
 c= Math.pow(Math.pow(a, 2) + Math.pow(b, 2), 1/2);
 log+="<br>"+c;
};
document.getElementById("log").innerHTML= log;
alert(+(new Date()) - t1); // 10 миллисекунд
</script>
2) Сначала всё в documentFragment:
 
<div id="log"></div>
<script>
var log = document.createDocumentFragment();
var t1= +(new Date());
for (var a=0, b=0, c; a!==1000; ++a, b+=2) {
 c= Math.pow(Math.pow(a, 2) + Math.pow(b, 2), 1/2);
 log.appendChild(document.createElement("br"));
 log.appendChild(document.createTextNode(c));
};
document.getElementById("log").appendChild(log);
alert(+(new Date()) - t1); // 10 миллисекунд
</script>
 
		
	
		
		
		
		
		
			
		
		
		
		
		
						  
				
				Последний раз редактировалось trikadin, 22.04.2012 в 15:28.
				
				
			
		
		
	
		
		
	
	
	 | 
 
 
	 
		 | 
 
 
 
 |  
  |