Griboks, это частично правда, switch приводит к 3 вариантам в скомпилированном коде:
1) генерация статичного Dictionary + jump table, к примеру, switch по 10 строкам
2) генерация ceq, Brtrue цепочек (ака if), к примеру switch по 3 строкам
3) генерация jump table, если все case этого switch это числа в непрерывном ряду (1,2,3,4), сюда же входит switch по еnum т.к. в IL это тоже число. Этот вариант самый быстрый т.к. за одно вычитание получается индекс в jump table и туда делается безусловный переход.
вариант 3 самый быстрый на любом количестве переходов, вариант 2 аналогичен if
xmoonlight, это он к тому что если просто серверу говорить "у меня 100 монет", и забирать "сколько у меня монет", либо "сколько времени", то это хакнет школьник, надо выносить туда функционал. Он же написал:
тогда вы отправляете все действия игрока на сервер, а сервер сам всё проверяет (как описано выше), запускает действие и возвращает результат.
это хакнуть можно только эмуляцией сервера, для сингловых игр (далеко не тривиальная задачка, на которую хацкеры забивают), либо невозможная для мультиплеера.
xmoonlight, любая попытка защитить данные на клиенте обречена на провал.
единственный способ не дать читерить, это считать/хранить все на своем сервере и присылать на клиент.
нет сервера - можно только усложнить задачу взломщику.
Сергей Веремеенко, Перфоманс нужен либам т.к. у либ всегда есть требование - "лучший перформанс за разумное время", он почти никогда не нужен продуктам т.к. там требования, в основном, про фичи. Так что не удивлен, что проекты про перфоманс мертвы. mishkaaaaaa, Там где есть БД, про перфоманс уже можно не говорить, его похоронили. И это не связано с самими БД, он умер в голове того, кто это проектировал. Все остальные описанные кейсы параллелизуются, пулятся и вызываются асинхронно.
Как можно просесть на коллекциях я описал пример выше. Ну, и конечно можно взять коллекция на 100к элементов, потом добавить сверху LINQ, сделать OrderBy, потом Where, и вернуть ее методу который внутри ее будет итерировать для поиска каждого элемента через ElementAt. Ведь ему вернули IEnumerable<>, а он хотел IList<>, а фичу программисту надо сдавать сегодня.
mishkaaaaaa, второй помогает писать более производительный код. Вот если у вас есть на выходе List<> или Array и вы не владеете этим списком/массивом, но отдаете его как IEnumerable, то получатель что бы получить 10000 элемент должен:
а) перебрать 9999 элементов
б) нарушить типизацию и попробовать скастовать к IList<>
Конечно возвращая IEnumerable можно менять реализацию метода как хочешь. К примеру, вместо List<> возвращать HashSet<> и за абстракцией IEnumerable это будет не видно. Или вообще сделать реализацию через генераторы.
НО очень часто такая гибкость не нужна. А перфоманс лишним не бывает, в отличии от гибкости.
We should forget about small efficiencies, say about 97% of the time: premature optimization is the root of all evil. Yet we should not pass up our opportunities in that critical 3%.
maximus9909, доступность программистов знающих JS больше, чем знающих PHP,
node.js из коробки быстрее PHP (без всяких FPM), более активное комьюнити. Один стек фронт-энда и бек-энда, позволяет держать команду в которой каждый может подменить коллегу (хотя бы частично).
асинхронный IO (диск/сеть) реализуется несколькими способами.
либо через событие и метод start() - это ваш пример, событие onload и метод send()
либо через коолбек - это типа read(() => myOnReadCompletedHandler);
либо через Promise - это типа read() который возвращает Promise в котором потом будет результат
Владимир Коротенко, Да там написано что КЛИЕНТ не может открыть больше соединений чем доступно эфемерных портов. Советую открыть те ссылки выше и почитать внимательнее.
Почитать и подумать, как ограничение на эфемерные порты на КЛИЕНТЕ относится к тому что автор на СЕРВЕРЕ хочет получать WS соединения? И ответить по существу.
Владимир Коротенко, Хорошо читаю. Ничего подобного нет. TCP соединение ака "сессия" идентифицируется уникальной четверкой значений, remote_ip, remote_port, local_ip, local_port,
Для клиента, что бы открыть соединение, надо забиндить один айпи и один порт, для сервера просто слушать один айпи и один порт. На один порт сервера можно открыть практически любое (2^32 * 2^16) количество соединений. Файловые дескрипторы выставляются в бесконечность. Хардовый лимит в предел (1кк или больше).
О каких 65536 портах вы тут говорите не понятно.
Foggy Finder, он годами не обновлялся, а еще в году 2016 авторы в бложике писали что не будут поддерживать новые платформы. Похоже ожил, но всё равно я уже сижу на ILRepack c его фичами
Дополню, что работу можно передать на физическом носителе вместе с Актами. К примеру компакт-диск, где исполнитель подготовит диск и поставит свою подпись на нем (есть такие диски с возможностью писать ручкой на обратной стороне), а вы примите по акту этот диск. Что находится на диске должно быть отражено в акте.
Я не юрист, но мне кажется тут вопрос в 2х плоскостях, технически что было внесено можно посмотреть по гиту, юридически это всё закрывается актами, где обе стороны согласны что всё было передано, ничего не было сломано.
evgeniy_matveev, в .NET исполнение метода может "прерваться" в середине исполнения в 2х случаях:
1) произошла синхронная ошибка (кто-то вызвал throw)
2) произошла асинхронная ошибка (кто-то вызвал Thread.Abort)
оба варианта можно обработать через try/catch
Либо он "завис". Либо ваше заявление "код не выполняется." не правда. Это можно проверив поставив брейкпоинт или сделав вывод в лог.
Сильных духом не отпугнуть ничем.