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.
|
|
|
|