Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 20.04.2012, 18:58
Профессор
Отправить личное сообщение для Маэстро Посмотреть профиль Найти все сообщения от Маэстро
 
Регистрация: 02.07.2010
Сообщений: 642

Где лучше выполнять арифметические операции? На клиенте или на сервере?
Вроде простой технический вопрос, но превратился в философский. Кого больше грузить: компьютер Клиента, или сервер?
Задачка такая: надо отобразить таблицу из трех колонок и тысячи строк. В первом столбце - число А, во втором - число B, в третьем - С, где C = A+B.
Пусть лучше считает javascript, или сервер? Если javascript, то мы уменьшаем нагрузку на сервер, уменьшаем клиентский трафик, но замедляем работу браузера. Если наоборот, то сотня клиентов, подключившись к серверу тоже могут замедлить общий процесс получения данных... Причем формула сложения - это простейший случай. А может быть формула по теореме Пифагора вычисления гипотенузы как квадратного корня из суммы квадратов катетов, а может быть сложная формула, учитывающая с десяток переменных...
У кого есть опыт в подобных задачах? Прошу совета.
Ответить с цитированием
  #2 (permalink)  
Старый 20.04.2012, 19:43
Кандидат Javascript-наук
Отправить личное сообщение для vuler Посмотреть профиль Найти все сообщения от vuler
 
Регистрация: 16.02.2012
Сообщений: 109

По мне так, максимально надо скидывать всю оработку информации клиенту, пусть его машина думает. Клиентов много, а сервер один, ему и без этой ерунды хватает занятий. Если у кого-то что-то тормозит - это его проблемы, пусть покупают компы получше
Ответить с цитированием
  #3 (permalink)  
Старый 21.04.2012, 13:42
Профессор
Отправить личное сообщение для Маэстро Посмотреть профиль Найти все сообщения от Маэстро
 
Регистрация: 02.07.2010
Сообщений: 642

Сообщение от nasqad Посмотреть сообщение
делаете тест, прогоняете 100000 выдач...
Я уже сделал много разных тестов на своей машине и на сервере. Но проблема в том, что затруднительно имитировать одновременное подключение к серверу сотни компьютеров, причем каждый запрашивает свой вариант вычислений. Поэтому тесты получаются довольно приблизительные.
Сообщение от nasqad Посмотреть сообщение
... так что вы переоцениваете нагрузку
Проблема в том, что парк компьютеров очень разнообразен. Среди 5000 компьютеров предприятия есть памятники, у которых еще 256 KByte ОЗУ. Также если знаете что такое "компьютерные политики", то их на предприятии немерено (всякие проги, висящие в памяти и следящие за чем-то). Всё это в конечном итоге приводит к торможению всех процессов, в том числе и работу javascript. Некоторые операции выливаются не в 300 ms, а в 3 сек., а это уже пользователей раздражает. Поэтому хотелось бы не портить им настроение.
Ну и как я уже говорил, формула сложения - это простейший случай. Могут быть формулы вычисления типа: возьми ячейки с 1-й по 10-ю, сложи их содержимое и раздели на сумму ячеек с 11-й по 20-ю..., т.е. групповые операции.
Ответить с цитированием
  #4 (permalink)  
Старый 21.04.2012, 13:48
Профессор
Отправить личное сообщение для Маэстро Посмотреть профиль Найти все сообщения от Маэстро
 
Регистрация: 02.07.2010
Сообщений: 642

Сообщение от vuler Посмотреть сообщение
По мне так, максимально надо скидывать всю оработку информации клиенту, пусть его машина думает. Клиентов много, а сервер один, ему и без этой ерунды хватает занятий. Если у кого-то что-то тормозит - это его проблемы, пусть покупают компы получше
Я тоже так раньше думал. Но это жить как я говорю "без любви к людям". Учусь у Гугла. Знаете сколько серверов у Гугла? - Говорят больше миллиона. Если бы Гугл сказал: мы сделали классный поисковый механизм, а то что оно медленно отображает информацию на вашем компьютере - это ваши проблемы! Покупайте новый компьютер! Если бы Гугл сказал, что медленный интернет - это ваши проблемы! и т.д.... - мы бы Гугл не уважали. А мы уважаем. За что? -За то, что они думают в первую очередь о пользователях.
P.S. Гуглу легче. У него милли...милли...миллиарды $
Ответить с цитированием
  #5 (permalink)  
Старый 21.04.2012, 13:51
Профессор
Отправить личное сообщение для Маэстро Посмотреть профиль Найти все сообщения от Маэстро
 
Регистрация: 02.07.2010
Сообщений: 642

Сообщение от Maxmaxmахimus Посмотреть сообщение
то что не требует проверки, на клиент, очевидно же.
Проверки чего? Речь же не идет о вводе данных пользователем. Речь идет о том, что всю информацию можно сначала посчитать на сервере, а потом отправить клиенту, либо отправить клиенту исходные данные и формулу - пусть считает сам.
Ответить с цитированием
  #6 (permalink)  
Старый 21.04.2012, 14:36
Аватар для 9xakep
сегодня в 12:34|Комментир
Отправить личное сообщение для 9xakep Посмотреть профиль Найти все сообщения от 9xakep
 
Регистрация: 12.04.2011
Сообщений: 1,180

Сообщение от Маэстро
Знаете сколько серверов у Гугла? - Говорят больше миллиона.
да не говорят, так и есть, и не миллион, а (1300+)млн, когда у яндекса есл не ошибаюсь: (300+) тысяч
__________________
оляля, ололо
Ответить с цитированием
  #7 (permalink)  
Старый 21.04.2012, 14:46
Профессор
Отправить личное сообщение для Маэстро Посмотреть профиль Найти все сообщения от Маэстро
 
Регистрация: 02.07.2010
Сообщений: 642

Сообщение от Maxmaxmахimus Посмотреть сообщение
Проверки это то что человек может захотеть взломать. например голосовалки и прочее.
Та нет в задаче никаких голосовалок! Есть отображение таблицы:
В первой колонке - Наименование товара.
Во второй - Остаток на складе [штук]
В третьей - Цена за штуку [$]
В четвертую колонку надо положить (посчитать) произведение количества штук по строке на цену товара, т.е. стоимость данного конкретного товара.
И так 5000 строк.
Ниже всей таблицы надо в ячейке поместить сумму значений всей четвертой колонки, т.е. ответить на вопрос: на какую сумму товара хранится на складе?

Где будете всё это считать? Неужели на клиенте?
Ответить с цитированием
  #8 (permalink)  
Старый 21.04.2012, 15:06
х.з
Посмотреть профиль Найти все сообщения от dmitriymar
 
Регистрация: 21.11.2010
Сообщений: 4,589

Сообщение от Маэстро
Ну и как я уже говорил, формула сложения - это простейший случай. Могут быть формулы вычисления типа: возьми ячейки с 1-й по 10-ю, сложи их содержимое и раздели на сумму ячеек с 11-й по 20-ю..., т.е. групповые операции.
вот из за этого и не стоит переносить на клиент.у Js приблизительное вычисление и выйдут не точные результаты
http://javascript.ru/blog/Andrej-Par...e-vychisleniya

Последний раз редактировалось dmitriymar, 21.04.2012 в 15:10.
Ответить с цитированием
  #9 (permalink)  
Старый 21.04.2012, 17:12
Профессор
Отправить личное сообщение для Маэстро Посмотреть профиль Найти все сообщения от Маэстро
 
Регистрация: 02.07.2010
Сообщений: 642

Сообщение от dmitriymar Посмотреть сообщение
вот из за этого и не стоит переносить на клиент.у Js приблизительное вычисление и выйдут не точные результаты
Не знаю как насчет неточности вычислений (а кстати есть JS-библиотека, которая работает точно с биллионными числами), но давайте посмотрим на примере. Итак решили считать на сервере.
Вот ситуация: клиенту приехала 1000-строковая таблица с тремя колонками.
В первой колонке - Наименование товара.
Во второй колонке - Себестоимость товара.
В третью колонку надо посчитать Продажную цену товара, которая, как известно, равна себестоимости товара плюс некий процент от себестоимости товара.
Менеджер выставляет этот процент (а может это "скидка" была постоянному клиенту) и желает видеть результат в третьей колонке - это раз. И два - он хочет увидеть общую потенциальную прибыль после продажи товара, т.е., разницу между суммой X и суммой Y. Менеджер может "поиграть" процентом: поставить 15%, 16%,.. 23%,..
Казалось бы что еще проще? Javascript перемножит себестоимости на проценты, сложит за секунду. Но мы решили это делать на сервере!
В результате начинается гоняние интернет-трафика туда/сюда и соответствующая бестолковая нагрузка на сервер...

P.S. Вы не подумайте, что я шарахаюсь то в одну, то в другую сторону. Я понимаю, что одни задачи лучше решать "тут", а другие "там". Но вот есть ли более-менее строгий критерий, по которому эти задачи можно разделить на там/тут?
Ответить с цитированием
  #10 (permalink)  
Старый 22.04.2012, 15:21
Аватар для trikadin
Модератор
Отправить личное сообщение для trikadin Посмотреть профиль Найти все сообщения от trikadin
 
Регистрация: 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>
__________________
Читайте:
Ты любопытный) Всё-таки, ничему в этом мире не помешает хорошая доля юмора)
Как спросить, чтобы вам ответили
Часто Задаваемые Вопросы (FAQ)

Последний раз редактировалось trikadin, 22.04.2012 в 15:28.
Ответить с цитированием
Ответ



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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
30(1|2) редирект от сервера. Или как лучше сделать редирект при верной отсылке форма. pizzZ AJAX и COMET 2 18.02.2010 09:06