Обновить
0
@phponeloveread⁠-⁠only

Пользователь

Отправить сообщение
Вам на ЛОРе уже писали что сравнение неверное, эквивалентный код будет

Не верно. На лоре в первых же сообщениях пример был изменён.

Но даже если действительно нужно воспользоваться лайфтаймами, то все равно код будет короче, потому что треугольные скобки указывать в данном случае не обязательно:

Манипуляция. А так будет ещё короче:

fn typeList<'a>(a: &'a TFile, b: u32, c: bool) -> Vec<&'a str> {

И?

То, что мы нормальные имена заменили на 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 по памяти.

Сравнения глупые, некорректные и не реализуемые в реальности. Чисто попускать хелворды.
Это вы так делаете, не я.

Где же?
Раз пошли переходы на личность — дискуссию заканчиваю.

Где же?

Ничем не отличается.

Хорошо. Сколько должно выделяться под никакое значение? Чёткий ответ.
Не можете. Потому что, как я уже говорил, в ФП функцию принимающую Void нельзя вызвать

А что с ней делать? Смотреть на неё?

Для чего вообще нужен void?

Кстати — как там дела с NaN? Интегрируется ли он в логику ФП? И каким образом.
Вы не найдете областей памяти в работающей программе, которые можно было бы классифицировать как значение ненаселенного типа.

Прям как в Си.

Как удобно врать и манипулировать. Говорим о типе а потом бам — о значении.

Я уже сказал, что никаких аргументов у вас нет.

1. Размер ненаселенного типа — минус бесконечность. Это очень странный тип данных.

Никакого размера у void нету. Мимо.

2. Когда вызывается функция которая принимает void — на стеке выделяется 0 байт для ее аргументов.

Опять же мимо. Никакие стэки к си отношения не имеют и ничего не выделяется. Срочно стоит почитать букварь.

3. Когда вызывается функция которая возвращает void — на стеке резервируется 0 байт для возвращаемого значения.

Аналогично.

Я даже не знаю плакать или смеяться. Чем отличаются «выделение 0 байт» от «не выделяется вообще»? К чему тут вообще ноль?

callabi находится за пределами языка и вообще это деталь реализации. С таким же успехом я могу сказать, что в вашем ФП у void не бесконечный размер и точно так же выделяется ноль.

Что из это следует? Да ничего. Отсутствие аргументов.

Это не ответ и я уже объяснял почему. Подобное меня удивляет.

А по поводу темы — ниже я пруфцанул из стандарта. Т.к. апеллировать к логике и пониманию перестало иметь смысл. Хотя сомневаюсь, что и до этого оно имело смысл.
Пошел за пруфами в стандарт:

The void type comprises an empty set of values; it is an incomplete object type that
cannot be completed.


Стандарт считает так же. Вариант номер раз.
В теории типов существует лишь два объекта, про которые можно сказать что они означают «ничего». Это ненаселенный тип, у которого нет значений — и тип нулевого размера, у которого 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), а не захардкоривании там нуля. И это очень просто доказывается, в частности, этим:

Если бы я знал о пилюле epoll(0) в день финала, мое решение было бы на 7-ом месте.

Т.е. если бы epoll(0) был бы реализован не путём захардкоренного нуля, а иначе( допустим, как показал выше я) — вы бы получили тот же результат. Но — без всех тех свойств, которые вы приписывали epoll(0). Это мат.

Именно результат вы определили за хак, именно то, что позволяет его добиться — вы определили за хак. Позволяет не ноль, не реализация, а именно epoll(0). Реализация — это нюансы.

И теперь, когда я на это вышел — вы переобулись, но это неправильно и некрасиво.

Прежде всего — блокирующие операции, которые вынуждены выполняться в фоновых потоках.

Какие такие операции и в каких таких потоках? Поподробнее об этом.

Далее — любые отложенные задачи. Которые могли бы нормально выполниться в периоды простоя (например, в 3-4 ночи по времени основной аудитории).

Им ничего не мешает выполнятся — планировщик устроен так, что он даёт равное время на исполнения всем процессам/потокам. Вам об этом сообщили, но вы продолжаете всё игнорировать и гнёте свою линию.

При этом — захардкоренный ноль — это лишь дыра в реализации участников, которые не смогли/не захотели это реализовать иначе.

Банальное ev = epoll_wait(..., !ev * timeout); решает почти указанные проблемы, а если пойти чуть дальше — это решает все проблемы.

Хак — это как максимум реализация участников, а не сам ноль в таймауте.

Служебные программы. Например, мониторинг. Или уже упомянутый тут ssh.

Ваши отсылки к нерабочему ssh — не соответствуют действительности. Повторю уже в какой раз. Не знаю откуда вы это взяли, но это неправда.

А еще процессор может уменьшить свое энергопотребление если никто не крутит его в вечном цикле.

А ещё процессор может уменьшить своё энергопотребление, если не использовать пхп, либо жаву. Дальше что? И опять же — вы продолжаете все мои доводы игнорировать. Зачем?

Если есть какие-то критерии по энергопотребленю — с них и надо начинать. А с них никто не начинал и о них никто не говорил. Вы их откуда-то достали и сделали каким-то определяющими.

Да и как минимум, перед тем как заявлять — надо посчитать сколько потребляет ЭЭ те же решения на пхп на той же нагрузке, а потом сравнить — стоит ли это меньше, чем пару часов epoll(0). Хотя опять же, данная ситуация — ваши выдумки. Это свойство не epell(0), а отдельных реализация. И я уже говорил почему.

Информация

В рейтинге
Не участвует
Зарегистрирован
Активность