|
Где лучше выполнять арифметические операции? На клиенте или на сервере?
Вроде простой технический вопрос, но превратился в философский. Кого больше грузить: компьютер Клиента, или сервер?
Задачка такая: надо отобразить таблицу из трех колонок и тысячи строк. В первом столбце - число А, во втором - число B, в третьем - С, где C = A+B. Пусть лучше считает javascript, или сервер? Если javascript, то мы уменьшаем нагрузку на сервер, уменьшаем клиентский трафик, но замедляем работу браузера. Если наоборот, то сотня клиентов, подключившись к серверу тоже могут замедлить общий процесс получения данных... Причем формула сложения - это простейший случай. А может быть формула по теореме Пифагора вычисления гипотенузы как квадратного корня из суммы квадратов катетов, а может быть сложная формула, учитывающая с десяток переменных... У кого есть опыт в подобных задачах? Прошу совета. |
По мне так, максимально надо скидывать всю оработку информации клиенту, пусть его машина думает. Клиентов много, а сервер один, ему и без этой ерунды хватает занятий. Если у кого-то что-то тормозит - это его проблемы, пусть покупают компы получше :)
|
Цитата:
Цитата:
Ну и как я уже говорил, формула сложения - это простейший случай. Могут быть формулы вычисления типа: возьми ячейки с 1-й по 10-ю, сложи их содержимое и раздели на сумму ячеек с 11-й по 20-ю..., т.е. групповые операции. |
Цитата:
P.S. Гуглу легче. У него милли...милли...миллиарды $ ;) |
Цитата:
|
Цитата:
|
Цитата:
В первой колонке - Наименование товара. Во второй - Остаток на складе [штук] В третьей - Цена за штуку [$] В четвертую колонку надо положить (посчитать) произведение количества штук по строке на цену товара, т.е. стоимость данного конкретного товара. И так 5000 строк. Ниже всей таблицы надо в ячейке поместить сумму значений всей четвертой колонки, т.е. ответить на вопрос: на какую сумму товара хранится на складе? Где будете всё это считать? Неужели на клиенте? |
Цитата:
http://javascript.ru/blog/Andrej-Par...e-vychisleniya |
Цитата:
Вот ситуация: клиенту приехала 1000-строковая таблица с тремя колонками. В первой колонке - Наименование товара. Во второй колонке - Себестоимость товара. В третью колонку надо посчитать Продажную цену товара, которая, как известно, равна себестоимости товара плюс некий процент от себестоимости товара. Менеджер выставляет этот процент (а может это "скидка" была постоянному клиенту) и желает видеть результат в третьей колонке - это раз. И два - он хочет увидеть общую потенциальную прибыль после продажи товара, т.е., разницу между суммой X и суммой Y. Менеджер может "поиграть" процентом: поставить 15%, 16%,.. 23%,.. Казалось бы что еще проще? Javascript перемножит себестоимости на проценты, сложит за секунду. Но мы решили это делать на сервере! В результате начинается гоняние интернет-трафика туда/сюда и соответствующая бестолковая нагрузка на сервер... P.S. Вы не подумайте, что я шарахаюсь то в одну, то в другую сторону. Я понимаю, что одни задачи лучше решать "тут", а другие "там". Но вот есть ли более-менее строгий критерий, по которому эти задачи можно разделить на там/тут? |
Маэстро, на клиенте, конечно. Если есть возможность снять нагрузку с сервера - её надо снять. Тем более, какая разница - будет человек ждать, пока оно у вас на сервере посчитается, или пока оно посчитается на клиенте. Дальше: вычисления можно сделать "асинхронными" - тогда клиент не будет подвисать, а на время их выполнения поставить весёлую анимацию загрузки.
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, время: 09:47. |
|