Вам на ЛОРе уже писали что сравнение неверное, эквивалентный код будет
Не верно. На лоре в первых же сообщениях пример был изменён.
Но даже если действительно нужно воспользоваться лайфтаймами, то все равно код будет короче, потому что треугольные скобки указывать в данном случае не обязательно:
То, что мы нормальные имена заменили на a и назвали это «нормальным» — это ничего не меняет. А если туда добавить generics? А если добавить ещё один лайфтайм? Во что превратиться это?
Ваше определение чего-то чем-то не стоит ничего. Вы можете назвать что угодно чем угодно и от этого оно не станет этим просто потому, что вы это так назвали.
Вы попытались играть со мною в логику — выдавая свои определения за какие-то формальные рассуждения. Вас спросили — каким образом вы сайд эффекты записали в аргументы/возврат функции. Ведь в рамках вашей логики функция имеет только один выход — возврат. Иного не дано.
А то, что с сайд-эффектами — это совершенное иное определение, нежели то, что вы использовали вначале.
Это и есть манипуляции. Дыры в понимание подбиваются под существующую картину мира. Из этого не выйдет ничего.
Всё это маскируется под «формальными рассуждениями», которые состоят на самом деле из банального жонглирования понятиями.
В любом случае — ладно. Я в очередной раз для себя определил потолок способностей евангелистов.
Как свидетель ложного утверждения, например. Если вы вызываете такую функцию в какой-то ветке, это значит, что эта ветка никогда не может быть принята.
Её же нельзя вызвать — как я её могу вызвать?
Как и любой другой элемент типа Double. У NaN есть представление, в конце концов, и в алгебру даблов он вполне себе вписывается.
Оно не вписывает никуда. Вы просто экспортировали логику из ieee754 в даблы. И я спрашиваю не про логику даблов, а про математику и ФП.
Хотя я заранее знаю ответ — никак, но всё же. Вдруг он есть, а я просто не знаю.
Если вкратце, тем, что вы не можете написать void a = void {};.
Естественно — это не имеет смысла. Логика операции = — присваивание значения, которого у воида нету.
Опять же — каким тогда образом функцию с ФП с аргументов воидом вызвать нельзя, если записать в воид воид можно? Вы уже там определитесь. Является ли воид значением, либо нет.
Про это я уже писал рядом про сайд-эффекты.
Вы писали обратное тому, что пишу тут и там я.
Я это не распарсил.
Если проще. Реальный мир состоит из NaN, сайд-эффектов и прочего, что в логику чисто функциональную не влезает. Выше я писал о конкретных противоречиях в ваших выкладках.
Таким образом всё это ФП-великолепие просто не работает и мы обязаны интегрировать туда наны, сайдэффекты и прочее. Иначе ФП не имеет смысла.
Но при этом мы декларируем что? Что логика ФП правильная, а какая-то иная не правильна. При этом логика ФП за рамками самого ФП( в рамках реального мира) несостоятельна.
Для этого кастыляются всякие кастыли и определения, которые полностью алогичны( пример с вызовом функции, которую вызвать невозможно) и существуют только в рамках нашей веры в то, что они есть и работают/соблюдаются.
Т.е. как происходит. У нас там снизу не чистота, но мы верим в то, что у нас чистота. Как?
Это у меня и вызывает вопросы. Как то, что не может существовать само по себе можно выдавать за правильную, самодостаточную концепцию?
Декартово произведение пустого множества с любым множеством пусто, поэтому мощность множества void(void)
Какие-то манипуляции. Мы взяли аргумент и результат. Потом каиким-то образом к ним добавились сайд-эфекты. С т.з. вашей логики сайд-эфекты находятся за рамками вашей логики и ваша логика для них не работает.
Точно так же их будет поболее при любых других аргументах — из этого ровным счётом ничего не следует. Вы получите те же результаты и без воид.
Иначе, мы расширяем понятие функции на сайд-эффекты, которые являются такими же аргументами и результатами. Таким образом мы получаем void только в одних местах и они будут идентичны для всех.
Каким образом мы проводим какие-то произведения хрен пойми чего с хрен пойми чем — мне так же неясно. Из этого произведения ровным счётом ничего не следует и все следствие из него не имеет смысла.
Сайд-эффекты это не что-то левой — это всё входит в множество аргументов/возвратов функции.
Точно так же всё это зафейлится и на void(1bit, 64bit) — либо мы за множество возьмём оба аргумента? Тогда то же будет и с сайд эффектами.
В любом случае — я не понимаю что из этого должно следовать?
Смотреть. Использовать как элемент построения доказательства (или контрпримера) в пруверах. Всякое такое. В реальном продакшен-коде таких фукнций нет.
Каким образом её можно использовать в пруферах, если позвать нельзя?
В С или в языках с более целостной системой типов?
В ФП.
Как одно из значений типа Double, например.
Не, это не ответ. Именно в рамках системы типов. Естественно, что в любую логику можно просто взять и импортировать другую логику и забыть о том, что она левая.
Как именно нан интегрируется в модель ФП, в функции и значения с т.з. математики?
Я, всё же, до сир пор не понимаю чем не устраивает void в Си. Наверное только тем, что он не такой как в хаскеле. Все свойство, которые определил человек выше у него есть.
По мне так логика функций в Си намного более полная, нежели в ФП.
Насколько я понимаю( тут я совсем не эксперт), в рамках чистой функции, у воид-функции вообще нет смысла. Но ведь функции не заканчиваются на чистоте.
В моём понимании функция — это набор операций над аргументами и результат не обязательно должен быть выражен в результате — он может быть выражен и в аргументах — путём их модификации.
Я может какой-то альтернативно-одарённый и не способен понять всей мощи ФП, но смотря на всё это — когда мы можем нарушать свои правила во имя поддержания языка. Ведь в рамках этих правил он попросту бесполезен. А после выдавать эти правила за какую-то истину. По мне — это глупо. Как вам — не знаю.
Т.е. я вижу причины по которым воид сделан иначе, но я не вижу причин того — что воид с Си какой-то не такой. Он такой же.
Либо человек как-то неправильно это объяснял, либо я как-то не понял. Но вроде понял. У воида нет значений. Воид использоваться не может. Отсутствие значения не наделяет воид каким-то значением, либо не делает его значением.
И неважно какое там значение — тип это не значение. Зачем подменять понятия и спрашивать с типа свойств значения? Ничего непонятно.
Вот тут прямо и чётко написали чушь. Главный и притом неверный тезис «а они равные» упомянув невнятной скороговоркой в конце.
Где? Вы берёте мою цитату и разбираете, с явным указанием что там чушь.
Начнём, пожалуй. Я отвечал на:
Ну простите, все равно приложение на Go будет жрать больше памяти и CPU по сравнению с приложением на C++ или Rust.
Каким образом разница в потреблении памяти стала определяться только наличием ГЦ? Сколько по умолчанию в го отдаётся памяти ГЦ? Сколько по памяти стоит насувать во все объекты счётчики ссылок?
Т.е. никаким ГЦ контекст не ограничивался и это всё не более, чем попытка врать.
Это уже давно всё исследовано: чем больше вы даёте GC памяти, тем меньше ему нужно кучу сканировать и тем быстрее он работает.
К ГЦ это не имеет никакого отношения. То же самое работает и для обычных аллокаторов.
Нет. Они неравные.
Опять же.
И неважно какие это задержки по продолжительности — в сумме их столько же.
Ни о каких объёмах памяти для ГЦ я не говорил. Я говорил о паузах. Очередная попытка врать.
Это уже давно всё исследовано: чем больше вы даёте GC памяти, тем меньше ему нужно кучу сканировать и тем быстрее он работает.
Ничего не исследовано. Го/жаву вам в руки и вперёд срывать покровы. Можете начать с хайлоадкаппа, а закончить какой-нибудь in-memory database.
Примерно на 500% скорость GC сравнивается с аккуратным «ручным» распределением памяти, а если дать памяти ещё больше —
Не верно. Это результаты протухшие — раз. Для 3-4бенчмарков из spec, которым а) никто не видел, б) вы не воспроизведёте их результаты.
Ни о каком аккуратном режиме речи не шло — никаких свидетельств о том какое он — в статье нету. Это всё не более, чем бла-бла.
Ну и да, ручная аллокация не заканчивается на маллоке. Заканчивается она им только в подобных «исследованиях».
то может быть и быстрее.
Опять же — бла-бла.
Не обьяснили, а заявили. Причём заявили голословное — без ссылок на исследования. Я-то надеялся, что вы вышеупомянутую статью читали, раз берётесь обо всём этом размышлять.
Я вам не буду говорить о том на что годны эти ссылки. Есть реальный мир. Го вам в руки и вперёд срывать покровы.
Вы действительно не понимаете что чушь здесь написали? Это же азы всей теории! В случае с GC затраты времени не просто зависят от того, сколько у вас «лишней» памяти,
Вот типичный пример вранья. Я говорил о времени пауз в ответ на рассуждения о времени пауз. Ни о каких затратах памяти речь не шла. Нигде. И вы этого не покажете.
И сейчас меня цитируют БЕЗ СЛОВА О ПАМЯТИ, но рассказывают о том, ЧТО Я ГОВОРИЛ О ПАМЯТИ.
а очень сильно от этого зависят. Как и в случае с обычным распределением памяти, впрочем (локальная память для потока в каком-нибудь tcmalloc'е тоже ведь требует некоторого «запаса»).
Обычное распределение памяти находится далеко за рамками маллока. Эти все рассуждения ничего не стоят вне академической среды. Как и х5 по памяти.
Сравнения глупые, некорректные и не реализуемые в реальности. Чисто попускать хелворды.
1. Размер ненаселенного типа — минус бесконечность. Это очень странный тип данных.
Никакого размера у void нету. Мимо.
2. Когда вызывается функция которая принимает void — на стеке выделяется 0 байт для ее аргументов.
Опять же мимо. Никакие стэки к си отношения не имеют и ничего не выделяется. Срочно стоит почитать букварь.
3. Когда вызывается функция которая возвращает void — на стеке резервируется 0 байт для возвращаемого значения.
Аналогично.
Я даже не знаю плакать или смеяться. Чем отличаются «выделение 0 байт» от «не выделяется вообще»? К чему тут вообще ноль?
callabi находится за пределами языка и вообще это деталь реализации. С таким же успехом я могу сказать, что в вашем ФП у void не бесконечный размер и точно так же выделяется ноль.
Что из это следует? Да ничего. Отсутствие аргументов.
Это не ответ и я уже объяснял почему. Подобное меня удивляет.
А по поводу темы — ниже я пруфцанул из стандарта. Т.к. апеллировать к логике и пониманию перестало иметь смысл. Хотя сомневаюсь, что и до этого оно имело смысл.
В теории типов существует лишь два объекта, про которые можно сказать что они означают «ничего». Это ненаселенный тип, у которого нет значений — и тип нулевого размера, у которого 1 значение.
И воид — это именно тот тип, у которого нет значений.
Но void гораздо больше похож на второй вариант чем на первый.
Вот я и спрашиваю — чем же он похож. Я объяснил чем он похож на первый. Теперь ваша очередь.
10 лет назад самый быстрый CPU — это примерно 5GHz, сегодня — плюс-минус столько же. Правда их побольше стало, но не в 100 раз. А память в «тяжёлых» системах выросла со 128GiB до 128TiB (не так давно этот рубеж штурмовали).
Вы либо не понимаете того, о чём вам пишут, либо делаете это специально. Вам говорили не об объёмах памяти, а необходимости траты ЦПУ на на работу с ней(памятью).
Так же — вы имели ввиду под ЦПУ — не железяку, а процессорное время. Теперь вы пытаетесь подменять понятия. Зачем?
ЦПУ читает память и время затраченное на её чтение/запись/ожидание прямо пропорционально кол-ву этой самой памяти, при прочих равных. А они равные.
Вам тут чётко и ясно определили связь между ЦПУ и памятью. И из этого выводится то, что имеет ввиду под ЦПУ.
Так что транжирить память — плохо, но транжирить CPU — ещё хуже.
Не так что.
Для компилятора, рендерера, любой «пакетной» задаче — да, важно когда вся задача будет решена. Для сервера или интерактивной программы — ой как важно. Скорость CPU-то расти перестала! Ожидать что завтра задержки из миллисекундных станут микросекундными больше нельзя…
Вы что сказали?
Памяти — да, CPU — нет.
Всё это в контексте оверхада ГЦ по сравнению с ручным управлением памятью.
Вам объяснили, что это неверно. И ответ существует именно в контексте потребления ЦПУ ГЦ. И вам так же сказали, что задержки — это ЦПУ-время. И неважно какие это задержки по продолжительности — в сумме их столько же. А на самом не столько же, а больше(го-вариант). Ведь вызов ГЦ это не только полезная работа, но оверхеды на сам вызов и уже с ним + пакетная обработка быстрее + всё это загаживает кешей больше и прочее и прочее).
Ваши попытки рассуждать о каком-то там влиянии этой задержки на разные кейсы — к теме не относятся. Об этом разговора не было.
Из контекста лично мне очевидно, что речи про алгоритм выбора тайм-аута для epoll не шло.
Про алгоритм выбора таймаута речи и не идёт.
Просто в какой-то момент часть участников услышала про нулевой тайм-аут, заменила у себя тайм-аут нулевым — и за счет этого резко поднялась в рейтинге.
Точно так же они могли узнать про что угодно.
Ваши обвинения были в чём? В неприменимости нулевого таймаута — это не так. Нулевой таймаут не является хаком.
И результат не является хаком. Я так же об этом писал с ссылками на инициатора ветки.
Хаком назывались именно ПОЛУЧЕННЫЕ РЕЗУЛЬТАТЫ, а не метод их получения. И вы сами же этому вторили своими заявлениями про неработоспособность нулевого таймаута.
Это и есть хак.
Это подмена понятий.
Нулевой таймаут — не хак. Нулевой таймаут — оптимизация. Нулевой таймаут не ограничивается захардкоренным нулём. Изначально определялось критерием хака РЕЗУЛЬТАТ. Вы выше это повторили.
А я говорил о том, что как максимум хаком можно назвать захардкоренный ноль. Но это ничего не меняет и не захардкоренный показал бы то же самое и точно так же вывел бы в топ.
Просто задача ограничить цпу-время не стояло — этим никто и не заморачивался. Я не верю в то, что участники из топ10 не осилили бы реализовать это иначе.
Поэтому такая реализация — это лишь свойство задачи. Вернее задача не требовала по иному её решать. Вы же взяли совершенно левые условия и начали с ними что-то качать. Так это не работает.
Люди создавали решения в рамках конкретных условий. И я уже доказал то, что реализовать это и для ваших условий труда не составляло. С тем же результатом.
Потому что функция, которая возвращает ненаселенный тип, не может существовать (если только она не принимает ненаселенный тип).
Я не про это спрашивал.
Поскольку в Си функции могут как возвращать void, так и принимает его в параметрах — это определенно не ненаселенный тип, а что-то другое.
Это так же не ответ. Я спрашивал не то — как не ведёт себя void, а то — почему вы решили, что он ведёт себя именно так, как вы описали.
Давайте попроще. Вы написали «void ведет себя скорее как красный». Вас спросили «почему вы решили, что воид — это красный. В моих си он не красный, а чёрный».
И вы ответили что? Оно не может быть зелёным потому что это не как «бла-бла». Поскольку в Си функция не как «бла-бла» — это не зелёный, а что-то другое.
Но вам не говорили о том, что оно зелёное. Вас спросили — почему вы говорите о том, что оно скорее красное. Всё просто.
А по поводу
Поскольку в Си функции могут как возвращать void, так и принимает его в параметрах
Нет. Никто и никак принимать void не может. void в аргументах не означает, что функция принимает какой-то воид.
По определению воид — это типа без значений. Их нет. Сигнатура функции определяет типы, а типы — это не значения. Это не значит, что воид в Си позволяет существовать тому, чего не может быть.
Существо понятие «ничего» и существует тип. Ничего. У ничего нет значений. Ничего нельзя никак и нигде использовать. Это поведение, которое не соответствует другим типам.
Т.е. типы — это некие наборы представляемых в них значений. void не может представлять себе никакого значения. Это полное его отсутствие. Воид это понятие обратное значению, обратное обычному типу.
А теперь включаем логику. Когда значение в функции, либо где-либо ещё появляется? Правильно — в момент его использования. До того момента — значение ничего не значит и ни на что не влияет.
Тем самым вызов функции void f(); В результате имеет тип воид, а значит не имеет значения. Ничего не мешает чему-то не иметь значения и мы можем это использовать, но мы не может использовать значение.
Именно так и работает void в си. Именно поэтому функции с void существуют. Существуют тогда, когда мы не пытаемся использовать значение void. Его просто нет.
Если ещё проще. Типы описывают наборы принимаемых значений. И этот набор может быть пуст. И это воид. Это не значит, что такого типа не существует, либо что у него появляется какое-то значение.
А теперь прочитайте еще раз, кто именно писал разные комментарии. Спойлер: у вас был не один оппонент.
Не верно. Если вы не определяете контекст — он экспортируется из ветки выше. Такие правила. Если я что-то написал в каком-то контексте — нельзя от него(вам) откреститься и сказать «я это не писал». Так это не работает. Я отвечал в рамках него. Вы отвечали точно так же в рамках него и никак иначе.
Если проще. Вы попытались наделить мою цитату своими смыслами, которых в ней не было. В частности:
Потому что в реальных задачах epoll(0) — это не оптимизация, а напрасное пережигание электричества.
Вы взяли определение epoll(0) у автора ветки — иного быть не может. Своего вы не дали.
Вот я дал своё определение — разграничил epoll(0) и паттерн его использования. Поэтому теперь я могу использовать и то и то отдельно.
Вы же этого не сделали — со всеми вытекающими. И теперь это выглядит обычной манипулцией.
В Си, C++ и C# void ведет себя скорее как нормальный тип размера 0 байт — у него есть ровно 20=1 возможное значение, и именно этого значение называют «ничего».
Из чего именно следует то, что он ведёт себя именно так? Это какие-то другие Си, а в моих void — это не значение.
Это мой промах, конечно. Забыл вас спросить о том, что такое epoll(0) для того, чтобы защитить себя от подобного.
Дело в том, что из epoll(0) следует именно epoll(0). Вы говорили именно об epoll(0), а не захардкоривании там нуля. И это очень просто доказывается, в частности, этим:
Если бы я знал о пилюле epoll(0) в день финала, мое решение было бы на 7-ом месте.
Т.е. если бы epoll(0) был бы реализован не путём захардкоренного нуля, а иначе( допустим, как показал выше я) — вы бы получили тот же результат. Но — без всех тех свойств, которые вы приписывали epoll(0). Это мат.
Именно результат вы определили за хак, именно то, что позволяет его добиться — вы определили за хак. Позволяет не ноль, не реализация, а именно epoll(0). Реализация — это нюансы.
И теперь, когда я на это вышел — вы переобулись, но это неправильно и некрасиво.
Прежде всего — блокирующие операции, которые вынуждены выполняться в фоновых потоках.
Какие такие операции и в каких таких потоках? Поподробнее об этом.
Далее — любые отложенные задачи. Которые могли бы нормально выполниться в периоды простоя (например, в 3-4 ночи по времени основной аудитории).
Им ничего не мешает выполнятся — планировщик устроен так, что он даёт равное время на исполнения всем процессам/потокам. Вам об этом сообщили, но вы продолжаете всё игнорировать и гнёте свою линию.
При этом — захардкоренный ноль — это лишь дыра в реализации участников, которые не смогли/не захотели это реализовать иначе.
Банальное ev = epoll_wait(..., !ev * timeout); решает почти указанные проблемы, а если пойти чуть дальше — это решает все проблемы.
Хак — это как максимум реализация участников, а не сам ноль в таймауте.
Служебные программы. Например, мониторинг. Или уже упомянутый тут ssh.
Ваши отсылки к нерабочему ssh — не соответствуют действительности. Повторю уже в какой раз. Не знаю откуда вы это взяли, но это неправда.
А еще процессор может уменьшить свое энергопотребление если никто не крутит его в вечном цикле.
А ещё процессор может уменьшить своё энергопотребление, если не использовать пхп, либо жаву. Дальше что? И опять же — вы продолжаете все мои доводы игнорировать. Зачем?
Если есть какие-то критерии по энергопотребленю — с них и надо начинать. А с них никто не начинал и о них никто не говорил. Вы их откуда-то достали и сделали каким-то определяющими.
Да и как минимум, перед тем как заявлять — надо посчитать сколько потребляет ЭЭ те же решения на пхп на той же нагрузке, а потом сравнить — стоит ли это меньше, чем пару часов epoll(0). Хотя опять же, данная ситуация — ваши выдумки. Это свойство не epell(0), а отдельных реализация. И я уже говорил почему.
Не верно. На лоре в первых же сообщениях пример был изменён.
Манипуляция. А так будет ещё короче:
И?
То, что мы нормальные имена заменили на a и назвали это «нормальным» — это ничего не меняет. А если туда добавить generics? А если добавить ещё один лайфтайм? Во что превратиться это?
Ваше определение чего-то чем-то не стоит ничего. Вы можете назвать что угодно чем угодно и от этого оно не станет этим просто потому, что вы это так назвали.
Вы попытались играть со мною в логику — выдавая свои определения за какие-то формальные рассуждения. Вас спросили — каким образом вы сайд эффекты записали в аргументы/возврат функции. Ведь в рамках вашей логики функция имеет только один выход — возврат. Иного не дано.
А то, что с сайд-эффектами — это совершенное иное определение, нежели то, что вы использовали вначале.
Это и есть манипуляции. Дыры в понимание подбиваются под существующую картину мира. Из этого не выйдет ничего.
Всё это маскируется под «формальными рассуждениями», которые состоят на самом деле из банального жонглирования понятиями.
В любом случае — ладно. Я в очередной раз для себя определил потолок способностей евангелистов.
Её же нельзя вызвать — как я её могу вызвать?
Оно не вписывает никуда. Вы просто экспортировали логику из ieee754 в даблы. И я спрашиваю не про логику даблов, а про математику и ФП.
Хотя я заранее знаю ответ — никак, но всё же. Вдруг он есть, а я просто не знаю.
Естественно — это не имеет смысла. Логика операции = — присваивание значения, которого у воида нету.
Опять же — каким тогда образом функцию с ФП с аргументов воидом вызвать нельзя, если записать в воид воид можно? Вы уже там определитесь. Является ли воид значением, либо нет.
Вы писали обратное тому, что пишу тут и там я.
Если проще. Реальный мир состоит из NaN, сайд-эффектов и прочего, что в логику чисто функциональную не влезает. Выше я писал о конкретных противоречиях в ваших выкладках.
Таким образом всё это ФП-великолепие просто не работает и мы обязаны интегрировать туда наны, сайдэффекты и прочее. Иначе ФП не имеет смысла.
Но при этом мы декларируем что? Что логика ФП правильная, а какая-то иная не правильна. При этом логика ФП за рамками самого ФП( в рамках реального мира) несостоятельна.
Для этого кастыляются всякие кастыли и определения, которые полностью алогичны( пример с вызовом функции, которую вызвать невозможно) и существуют только в рамках нашей веры в то, что они есть и работают/соблюдаются.
Т.е. как происходит. У нас там снизу не чистота, но мы верим в то, что у нас чистота. Как?
Это у меня и вызывает вопросы. Как то, что не может существовать само по себе можно выдавать за правильную, самодостаточную концепцию?
Какие-то манипуляции. Мы взяли аргумент и результат. Потом каиким-то образом к ним добавились сайд-эфекты. С т.з. вашей логики сайд-эфекты находятся за рамками вашей логики и ваша логика для них не работает.
Точно так же их будет поболее при любых других аргументах — из этого ровным счётом ничего не следует. Вы получите те же результаты и без воид.
Иначе, мы расширяем понятие функции на сайд-эффекты, которые являются такими же аргументами и результатами. Таким образом мы получаем void только в одних местах и они будут идентичны для всех.
Каким образом мы проводим какие-то произведения хрен пойми чего с хрен пойми чем — мне так же неясно. Из этого произведения ровным счётом ничего не следует и все следствие из него не имеет смысла.
Сайд-эффекты это не что-то левой — это всё входит в множество аргументов/возвратов функции.
Точно так же всё это зафейлится и на void(1bit, 64bit) — либо мы за множество возьмём оба аргумента? Тогда то же будет и с сайд эффектами.
В любом случае — я не понимаю что из этого должно следовать?
Каким образом её можно использовать в пруферах, если позвать нельзя?
В ФП.
Не, это не ответ. Именно в рамках системы типов. Естественно, что в любую логику можно просто взять и импортировать другую логику и забыть о том, что она левая.
Как именно нан интегрируется в модель ФП, в функции и значения с т.з. математики?
Я, всё же, до сир пор не понимаю чем не устраивает void в Си. Наверное только тем, что он не такой как в хаскеле. Все свойство, которые определил человек выше у него есть.
По мне так логика функций в Си намного более полная, нежели в ФП.
Насколько я понимаю( тут я совсем не эксперт), в рамках чистой функции, у воид-функции вообще нет смысла. Но ведь функции не заканчиваются на чистоте.
В моём понимании функция — это набор операций над аргументами и результат не обязательно должен быть выражен в результате — он может быть выражен и в аргументах — путём их модификации.
Я может какой-то альтернативно-одарённый и не способен понять всей мощи ФП, но смотря на всё это — когда мы можем нарушать свои правила во имя поддержания языка. Ведь в рамках этих правил он попросту бесполезен. А после выдавать эти правила за какую-то истину. По мне — это глупо. Как вам — не знаю.
Т.е. я вижу причины по которым воид сделан иначе, но я не вижу причин того — что воид с Си какой-то не такой. Он такой же.
Либо человек как-то неправильно это объяснял, либо я как-то не понял. Но вроде понял. У воида нет значений. Воид использоваться не может. Отсутствие значения не наделяет воид каким-то значением, либо не делает его значением.
И неважно какое там значение — тип это не значение. Зачем подменять понятия и спрашивать с типа свойств значения? Ничего непонятно.
Где? Вы берёте мою цитату и разбираете, с явным указанием что там чушь.
Начнём, пожалуй. Я отвечал на:
Каким образом разница в потреблении памяти стала определяться только наличием ГЦ? Сколько по умолчанию в го отдаётся памяти ГЦ? Сколько по памяти стоит насувать во все объекты счётчики ссылок?
Т.е. никаким ГЦ контекст не ограничивался и это всё не более, чем попытка врать.
К ГЦ это не имеет никакого отношения. То же самое работает и для обычных аллокаторов.
Опять же.
Ни о каких объёмах памяти для ГЦ я не говорил. Я говорил о паузах. Очередная попытка врать.
Ничего не исследовано. Го/жаву вам в руки и вперёд срывать покровы. Можете начать с хайлоадкаппа, а закончить какой-нибудь in-memory database.
Не верно. Это результаты протухшие — раз. Для 3-4бенчмарков из spec, которым а) никто не видел, б) вы не воспроизведёте их результаты.
Ни о каком аккуратном режиме речи не шло — никаких свидетельств о том какое он — в статье нету. Это всё не более, чем бла-бла.
Ну и да, ручная аллокация не заканчивается на маллоке. Заканчивается она им только в подобных «исследованиях».
Опять же — бла-бла.
Я вам не буду говорить о том на что годны эти ссылки. Есть реальный мир. Го вам в руки и вперёд срывать покровы.
Вот типичный пример вранья. Я говорил о времени пауз в ответ на рассуждения о времени пауз. Ни о каких затратах памяти речь не шла. Нигде. И вы этого не покажете.
И сейчас меня цитируют БЕЗ СЛОВА О ПАМЯТИ, но рассказывают о том, ЧТО Я ГОВОРИЛ О ПАМЯТИ.
Обычное распределение памяти находится далеко за рамками маллока. Эти все рассуждения ничего не стоят вне академической среды. Как и х5 по памяти.
Сравнения глупые, некорректные и не реализуемые в реальности. Чисто попускать хелворды.
Где же?
Где же?
Хорошо. Сколько должно выделяться под никакое значение? Чёткий ответ.
А что с ней делать? Смотреть на неё?
Для чего вообще нужен void?
Кстати — как там дела с NaN? Интегрируется ли он в логику ФП? И каким образом.
Прям как в Си.
Как удобно врать и манипулировать. Говорим о типе а потом бам — о значении.
Никакого размера у void нету. Мимо.
Опять же мимо. Никакие стэки к си отношения не имеют и ничего не выделяется. Срочно стоит почитать букварь.
Аналогично.
Я даже не знаю плакать или смеяться. Чем отличаются «выделение 0 байт» от «не выделяется вообще»? К чему тут вообще ноль?
callabi находится за пределами языка и вообще это деталь реализации. С таким же успехом я могу сказать, что в вашем ФП у void не бесконечный размер и точно так же выделяется ноль.
Что из это следует? Да ничего. Отсутствие аргументов.
А по поводу темы — ниже я пруфцанул из стандарта. Т.к. апеллировать к логике и пониманию перестало иметь смысл. Хотя сомневаюсь, что и до этого оно имело смысл.
Стандарт считает так же. Вариант номер раз.
И воид — это именно тот тип, у которого нет значений.
Вот я и спрашиваю — чем же он похож. Я объяснил чем он похож на первый. Теперь ваша очередь.
Нет.
Вы либо не понимаете того, о чём вам пишут, либо делаете это специально. Вам говорили не об объёмах памяти, а необходимости траты ЦПУ на на работу с ней(памятью).
Так же — вы имели ввиду под ЦПУ — не железяку, а процессорное время. Теперь вы пытаетесь подменять понятия. Зачем?
Вам тут чётко и ясно определили связь между ЦПУ и памятью. И из этого выводится то, что имеет ввиду под ЦПУ.
Не так что.
Вы что сказали?
Всё это в контексте оверхада ГЦ по сравнению с ручным управлением памятью.
Вам объяснили, что это неверно. И ответ существует именно в контексте потребления ЦПУ ГЦ. И вам так же сказали, что задержки — это ЦПУ-время. И неважно какие это задержки по продолжительности — в сумме их столько же. А на самом не столько же, а больше(го-вариант). Ведь вызов ГЦ это не только полезная работа, но оверхеды на сам вызов и уже с ним + пакетная обработка быстрее + всё это загаживает кешей больше и прочее и прочее).
Ваши попытки рассуждать о каком-то там влиянии этой задержки на разные кейсы — к теме не относятся. Об этом разговора не было.
Про алгоритм выбора таймаута речи и не идёт.
Точно так же они могли узнать про что угодно.
Ваши обвинения были в чём? В неприменимости нулевого таймаута — это не так. Нулевой таймаут не является хаком.
И результат не является хаком. Я так же об этом писал с ссылками на инициатора ветки.
Хаком назывались именно ПОЛУЧЕННЫЕ РЕЗУЛЬТАТЫ, а не метод их получения. И вы сами же этому вторили своими заявлениями про неработоспособность нулевого таймаута.
Это подмена понятий.
Нулевой таймаут — не хак. Нулевой таймаут — оптимизация. Нулевой таймаут не ограничивается захардкоренным нулём. Изначально определялось критерием хака РЕЗУЛЬТАТ. Вы выше это повторили.
А я говорил о том, что как максимум хаком можно назвать захардкоренный ноль. Но это ничего не меняет и не захардкоренный показал бы то же самое и точно так же вывел бы в топ.
Просто задача ограничить цпу-время не стояло — этим никто и не заморачивался. Я не верю в то, что участники из топ10 не осилили бы реализовать это иначе.
Поэтому такая реализация — это лишь свойство задачи. Вернее задача не требовала по иному её решать. Вы же взяли совершенно левые условия и начали с ними что-то качать. Так это не работает.
Люди создавали решения в рамках конкретных условий. И я уже доказал то, что реализовать это и для ваших условий труда не составляло. С тем же результатом.
Я не про это спрашивал.
Это так же не ответ. Я спрашивал не то — как не ведёт себя void, а то — почему вы решили, что он ведёт себя именно так, как вы описали.
Давайте попроще. Вы написали «void ведет себя скорее как красный». Вас спросили «почему вы решили, что воид — это красный. В моих си он не красный, а чёрный».
И вы ответили что? Оно не может быть зелёным потому что это не как «бла-бла». Поскольку в Си функция не как «бла-бла» — это не зелёный, а что-то другое.
Но вам не говорили о том, что оно зелёное. Вас спросили — почему вы говорите о том, что оно скорее красное. Всё просто.
А по поводу
Нет. Никто и никак принимать void не может. void в аргументах не означает, что функция принимает какой-то воид.
По определению воид — это типа без значений. Их нет. Сигнатура функции определяет типы, а типы — это не значения. Это не значит, что воид в Си позволяет существовать тому, чего не может быть.
Существо понятие «ничего» и существует тип. Ничего. У ничего нет значений. Ничего нельзя никак и нигде использовать. Это поведение, которое не соответствует другим типам.
Т.е. типы — это некие наборы представляемых в них значений. void не может представлять себе никакого значения. Это полное его отсутствие. Воид это понятие обратное значению, обратное обычному типу.
А теперь включаем логику. Когда значение в функции, либо где-либо ещё появляется? Правильно — в момент его использования. До того момента — значение ничего не значит и ни на что не влияет.
Тем самым вызов функции void f(); В результате имеет тип воид, а значит не имеет значения. Ничего не мешает чему-то не иметь значения и мы можем это использовать, но мы не может использовать значение.
Именно так и работает void в си. Именно поэтому функции с void существуют. Существуют тогда, когда мы не пытаемся использовать значение void. Его просто нет.
Если ещё проще. Типы описывают наборы принимаемых значений. И этот набор может быть пуст. И это воид. Это не значит, что такого типа не существует, либо что у него появляется какое-то значение.
Не верно. Если вы не определяете контекст — он экспортируется из ветки выше. Такие правила. Если я что-то написал в каком-то контексте — нельзя от него(вам) откреститься и сказать «я это не писал». Так это не работает. Я отвечал в рамках него. Вы отвечали точно так же в рамках него и никак иначе.
Если проще. Вы попытались наделить мою цитату своими смыслами, которых в ней не было. В частности:
Вы взяли определение epoll(0) у автора ветки — иного быть не может. Своего вы не дали.
Вот я дал своё определение — разграничил epoll(0) и паттерн его использования. Поэтому теперь я могу использовать и то и то отдельно.
Вы же этого не сделали — со всеми вытекающими. И теперь это выглядит обычной манипулцией.
Из чего именно следует то, что он ведёт себя именно так? Это какие-то другие Си, а в моих void — это не значение.
Это мой промах, конечно. Забыл вас спросить о том, что такое epoll(0) для того, чтобы защитить себя от подобного.
Дело в том, что из epoll(0) следует именно epoll(0). Вы говорили именно об epoll(0), а не захардкоривании там нуля. И это очень просто доказывается, в частности, этим:
Т.е. если бы epoll(0) был бы реализован не путём захардкоренного нуля, а иначе( допустим, как показал выше я) — вы бы получили тот же результат. Но — без всех тех свойств, которые вы приписывали epoll(0). Это мат.
Именно результат вы определили за хак, именно то, что позволяет его добиться — вы определили за хак. Позволяет не ноль, не реализация, а именно epoll(0). Реализация — это нюансы.
И теперь, когда я на это вышел — вы переобулись, но это неправильно и некрасиво.
Какие такие операции и в каких таких потоках? Поподробнее об этом.
Им ничего не мешает выполнятся — планировщик устроен так, что он даёт равное время на исполнения всем процессам/потокам. Вам об этом сообщили, но вы продолжаете всё игнорировать и гнёте свою линию.
При этом — захардкоренный ноль — это лишь дыра в реализации участников, которые не смогли/не захотели это реализовать иначе.
Банальное ev = epoll_wait(..., !ev * timeout); решает почти указанные проблемы, а если пойти чуть дальше — это решает все проблемы.
Хак — это как максимум реализация участников, а не сам ноль в таймауте.
Ваши отсылки к нерабочему ssh — не соответствуют действительности. Повторю уже в какой раз. Не знаю откуда вы это взяли, но это неправда.
А ещё процессор может уменьшить своё энергопотребление, если не использовать пхп, либо жаву. Дальше что? И опять же — вы продолжаете все мои доводы игнорировать. Зачем?
Если есть какие-то критерии по энергопотребленю — с них и надо начинать. А с них никто не начинал и о них никто не говорил. Вы их откуда-то достали и сделали каким-то определяющими.
Да и как минимум, перед тем как заявлять — надо посчитать сколько потребляет ЭЭ те же решения на пхп на той же нагрузке, а потом сравнить — стоит ли это меньше, чем пару часов epoll(0). Хотя опять же, данная ситуация — ваши выдумки. Это свойство не epell(0), а отдельных реализация. И я уже говорил почему.