Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Где лучше выполнять арифметические операции? На клиенте или на сервере? (https://javascript.ru/forum/misc/27663-gde-luchshe-vypolnyat-arifmeticheskie-operacii-na-kliente-ili-na-servere.html)

Маэстро 20.04.2012 18:58

Где лучше выполнять арифметические операции? На клиенте или на сервере?
 
Вроде простой технический вопрос, но превратился в философский. Кого больше грузить: компьютер Клиента, или сервер?
Задачка такая: надо отобразить таблицу из трех колонок и тысячи строк. В первом столбце - число А, во втором - число B, в третьем - С, где C = A+B.
Пусть лучше считает javascript, или сервер? Если javascript, то мы уменьшаем нагрузку на сервер, уменьшаем клиентский трафик, но замедляем работу браузера. Если наоборот, то сотня клиентов, подключившись к серверу тоже могут замедлить общий процесс получения данных... Причем формула сложения - это простейший случай. А может быть формула по теореме Пифагора вычисления гипотенузы как квадратного корня из суммы квадратов катетов, а может быть сложная формула, учитывающая с десяток переменных...
У кого есть опыт в подобных задачах? Прошу совета.

vuler 20.04.2012 19:43

По мне так, максимально надо скидывать всю оработку информации клиенту, пусть его машина думает. Клиентов много, а сервер один, ему и без этой ерунды хватает занятий. Если у кого-то что-то тормозит - это его проблемы, пусть покупают компы получше :)

Маэстро 21.04.2012 13:42

Цитата:

Сообщение от nasqad (Сообщение 170181)
делаете тест, прогоняете 100000 выдач...

Я уже сделал много разных тестов на своей машине и на сервере. Но проблема в том, что затруднительно имитировать одновременное подключение к серверу сотни компьютеров, причем каждый запрашивает свой вариант вычислений. Поэтому тесты получаются довольно приблизительные.
Цитата:

Сообщение от nasqad (Сообщение 170181)
... так что вы переоцениваете нагрузку

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

Маэстро 21.04.2012 13:48

Цитата:

Сообщение от vuler (Сообщение 170182)
По мне так, максимально надо скидывать всю оработку информации клиенту, пусть его машина думает. Клиентов много, а сервер один, ему и без этой ерунды хватает занятий. Если у кого-то что-то тормозит - это его проблемы, пусть покупают компы получше :)

Я тоже так раньше думал. Но это жить как я говорю "без любви к людям". Учусь у Гугла. Знаете сколько серверов у Гугла? - Говорят больше миллиона. Если бы Гугл сказал: мы сделали классный поисковый механизм, а то что оно медленно отображает информацию на вашем компьютере - это ваши проблемы! Покупайте новый компьютер! Если бы Гугл сказал, что медленный интернет - это ваши проблемы! и т.д.... - мы бы Гугл не уважали. А мы уважаем. За что? -За то, что они думают в первую очередь о пользователях.
P.S. Гуглу легче. У него милли...милли...миллиарды $ ;)

Маэстро 21.04.2012 13:51

Цитата:

Сообщение от Maxmaxmахimus (Сообщение 170185)
то что не требует проверки, на клиент, очевидно же.

Проверки чего? Речь же не идет о вводе данных пользователем. Речь идет о том, что всю информацию можно сначала посчитать на сервере, а потом отправить клиенту, либо отправить клиенту исходные данные и формулу - пусть считает сам.

9xakep 21.04.2012 14:36

Цитата:

Сообщение от Маэстро
Знаете сколько серверов у Гугла? - Говорят больше миллиона.

да не говорят, так и есть, и не миллион, а (1300+)млн, когда у яндекса есл не ошибаюсь: (300+) тысяч

Маэстро 21.04.2012 14:46

Цитата:

Сообщение от Maxmaxmахimus (Сообщение 170314)
Проверки это то что человек может захотеть взломать. например голосовалки и прочее.

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

Где будете всё это считать? Неужели на клиенте?

dmitriymar 21.04.2012 15:06

Цитата:

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

вот из за этого и не стоит переносить на клиент.у Js приблизительное вычисление и выйдут не точные результаты
http://javascript.ru/blog/Andrej-Par...e-vychisleniya

Маэстро 21.04.2012 17:12

Цитата:

Сообщение от dmitriymar (Сообщение 170327)
вот из за этого и не стоит переносить на клиент.у Js приблизительное вычисление и выйдут не точные результаты

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

P.S. Вы не подумайте, что я шарахаюсь то в одну, то в другую сторону. Я понимаю, что одни задачи лучше решать "тут", а другие "там". Но вот есть ли более-менее строгий критерий, по которому эти задачи можно разделить на там/тут?

trikadin 22.04.2012 15:21

Маэстро, на клиенте, конечно. Если есть возможность снять нагрузку с сервера - её надо снять. Тем более, какая разница - будет человек ждать, пока оно у вас на сервере посчитается, или пока оно посчитается на клиенте. Дальше: вычисления можно сделать "асинхронными" - тогда клиент не будет подвисать, а на время их выполнения поставить весёлую анимацию загрузки.

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>


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