В отличие от классического матана (который вот на самом деле сушит мозги и бесконечно скучен), матлог — это постоянный источник космических мультиоргазмов.
И, ИМХО, куда полезнее для, скажем, программиста, а мы же тут на сайте программистов.
Как-то всё очень запущено в этом кроссплатформенном инструменте.
Да, именно. Правда, опять же, учитывая, что под окнами оно тоже использует yield, то всё это обсуждение не имеет особого смысла.
Я только хотел сказать, что опасно предполагать семантику по созвучию синтаксиса.
Здесь нет созвучия синтаксиса, здесь есть созвучие имён и описаний, а имена призваны именно для того, чтобы называть вещи.
Где-то на стыке когнитивной лингвистики, психологии, эволюционной теории и всякой подобной ерунды есть такая штука, как ма́ксимы Грайса. Из этих максим следует, в частности, что в данном конкретном случае наиболее естественной интерпретацией слов «Yield - это не Питоновский Yield, это ОС функция, которая говорит ОС, о том, что поток хочет отдать своё время другим потокам, т.к. ничего не делает» будет интерпретация этого как ОС-функции sched_yield или её аналогов (потому что иначе человек бы уточнил про sleep(0), или про ожидание до конца слайса, или хотя бы указал бы про всё это в ответ на первое возражение про семантику yield).
Поэтому вполне естественно предполагать не по созвучию имён, а по тому объёму информации, которое было передано. И если человек это использует как gotcha-тезис, то самая правильная реакция на это — применение уринированного текстиля. Тем более, что данный конкретный человек, как дело доходит до практики, просто молча сливается уже трижды (раз — здесь, два — с дженериками, три — с наркоманским тезисом о том, что дельфи на три порядка популярнее плюсов в Бразилии), предпочитая аргументировать свои ошибки минусами за комменты и в карму вместо того, чтобы про них просто написать.
Функция называется Yield, наш ведущий специалист по Delphi (где вакансий на порядок больше C++, нет, дарта, нет, го!) описывает поведение а-ля sched_yield (или как там она называется в винде), документация описывает поведение а-ля sched_yield, но вы почему-то думаете, что речь о sleep.
А почему именно sleep? Почему не, скажем, fflush(stdout)? Почему не kill(-1, 9)? Я много хороших системных вызовов знаю.
Кстати, очередные прелести дельфи — найти онлайн реализацию этого System.Classes.pas не представляется возможным, и, похоже, не является легальным по условиям распространения дельфей. Сравните с реализацией стдлибки в плюсах, расте, хаскеле или любом другом языке.
Остановит процессор до окончания кванта диспетчеризации или другого прерывания.
Нет (ну или, вернее, «мягко скажем, не обязательно»). Оно просто всё время сжигает в сисколле и ядре:
% time ./main
^C
./main 0,88s user 4,04s system 99% cpu 4,918 total
Но так, конечно, измерять ничего не надо. Лучше так:
#include <algorithm>
#include <chrono>
#include <iostream>
#include <sched.h>
int main()
{
long max = 0;
long sum = 0;
const auto count = 10'000'000;
for (int i = 0; i < count; ++i)
{
const auto begin = std::chrono::high_resolution_clock::now();
sched_yield();
const auto end = std::chrono::high_resolution_clock::now();
const auto duration = std::chrono::duration_cast<std::chrono::nanoseconds>(end - begin).count();
max = std::max(max, duration);
sum += duration;
}
std::cout << max << ' ' << static_cast<double>(sum) / count << '\n';
}
Это даёт 6890 103.38 на моей системе. Как думаете, у меня тут средний квант диспетчеризации — 100 наносекунд (минус время на сам факт сисколла, который в среднем по исключительно случайному совпадению как раз в окрестности соточки наносекунд), или таки побольше?
Метод не элегантный, но рабочий.
Это метод замены «сжирает 100% ядра» до «дожирает до 100% ядра», не более.
Чё-т не понял логического перехода от «20 лет в разработке» к процитированному.
Я в начале 90-х только родился, что не помешало мне написать первую строчку кода в этак 2001-м году, в этак 2003-м — в первый раз написать оплаченную строчку кода (потом, правда, было несколько проблематично выводить переведенные мне через webmoney деньги, потому что там требовали паспорт, а у меня его не было по излишней молодости), а в 2006-м начать пет-проект, который я иногда пописываю до сих пор.
А, ведь, есть ещё и т.н. "нестандартный" анализ Дэвиса, где бесконечно малая величина рассматривается ка конечная (со своими особенностями).
Там на самом деле просто рассматривается нестандартная модель (и именно поэтому анализ нестандартный) аксиом ℝ, в которую через повышение мощности Левенгеймом-Сколемом и компактность (логическую, не топологическую, хотя какая разница?) можно засунуть элемент (дальновидно назовём его ∞), для которого в этой модели верно, что он больше всех элементов ℝ — сиречь, ∞ на самом деле есть бесконечность. Дальше 1/∞ будет бесконечно малой в интуитивном смысле, и при этом с ними (а также с производными, и так далее) можно работать как с нормальными числами, без плясок с пределами, эпсилонами и дельтами.
Я это всё, конечно, очень неаккуратно написал, но общая идея такова.
Но преподавание анализа таким образом потребует сначала семестра-другого матлога и теории моделей, поэтому так, конечно, не делают. А жаль.
Я хочу написать сигнатуру отвечающей за парсинг функции, параметризованной типом s потока (например, строка, или массив байт, или стрим, или что-то такое), типом e ошибки парсинга, и типом a результата, чтобы все эти три типа были связны неким констрейнтом (назовём его Parsec), и чтобы нижележащий тип символов в s был Char. В хаскеле я могу сделать
foo :: (Parsec s e a, CharType s ~ Char) => ...
Как это будет выглядеть в дельфи?
Дальше я хочу написать функцию, скажем, из либы по линейной алгебре, которая принимает три (возможно разных) типа и возвращает четвёртый тип, соответствующий их произведению слева направо. Ну там, попарно произведение можно делать как
Vect n a → Vect n a → a (скалярное произведение)
Matrix n k a → Matrix k m a → Matrix n m a (обычное произведение матриц)
и потом их скомпозировать. В хаскеле я могу написать
mulThree :: (Mul a b r1, Mul r1 c r2) => a -> b -> c -> r2
Тем что поле может быть изменено внутри класса, самим классом или косвенно снаружи.
Не понял. Как readonly-поле может быть изменено хоть внутри, хоть снаружи?
Повторяю, это пример кода, принцип, а не рабочий код.
Да это я понял. Просто очень смешно получается, когда человек приводит пример кода о форматировании (где подошёл бы любой код), но первый же приведённый им код жрёт 100% CPU, и человека ничего не смущает такое постить.
Я очень рад, что в дельфях это можно (большое достижение!), но вопрос не о дельфях, а о том, что @vadimrимел в виду.
Но если хотите поговорить о дельфях, то я не против. Как навесить требование, что типы T и U (два разных параметра дженерика) связаны каким-то констрейнтом?
Диссернет, например, мусорными журналами также называет просто любые журналы со слабой редакционной политикой (а нижний квартиль или смешной IF — это показатель низкой редакционной политики).
Впрочем, если весь наш спор об определениях, то можете заменить «мусорный журнал» на «слабый ни о чём не говорящий журнал», я не против.
У автора этой статьи есть прекрасное свойство - он приводит источники.
Для исторического обзора это естественно. Для обзора по самой математике это не очень естественно, потому что мало кто говорит «ах, сложение коммутативно? приведите ваши источники!»
Так вот, на странице 72 [2004], стр. 82 [1965], вводится понятие пары с помошью специального субстантивного (substantific) знака. Так, что если U и T термы, то (U, T) также терм для которого вводится аксиома пары.
Тогда это не ZF, только и всего. Можете работать в этой формальной системе, никто не против, но тогда, по идее, вы должны понимать, что в некоторых других формальных системах (которые, похоже, принимаются по умолчанию) этой аксиомы нет, поэтому ваше рассуждение там не работает.
Кстати, мне лень читать Бурбаки — вводится ли там аналогично фундаментальное понятие тройки? Вводится ли там аналогично фундаментальное понятие произвольного кортежа, индексированного произвольным множеством (чтобы можно было определить декартово произведение произвольного семейства множеств)? Как упорядоченность (и декартовы произведения) работает, когда индексирующее множество несчётно и вообще произвольное? Не вылезает там вдобавок к ZF ещё и C?
то разве это означает, что пара не существует? и что означает по вашему не "существует"?
Это означает, что пара не существует как примитив — для этого достаточно прочитать следующее же предложение (поясняющее предыдущее).
Это говорит о том, что первый язык легко читается любым человеком, а второй, без дополнительной подготовки именно в этом языке, не читабелен.
Я в своё время для отца делал разные вычислительные эксперименты, и, короче, код на хаскеле ему читать проще (и убеждаться, что именно там происходит, и соответствует ли оно его модели), чем на плюсах. Притом, что у него за спиной опыт фортрана в его годы, а опыта ML-подобных языков нет.
Если знания Паскаля применимы в понимании программирования в целом, то знания Хаскеля применимы только к Хаскелю и больше ни к чему вообще.
Ну вот вы паскаль знаете, а хаскель не смогли прочитать. Я паскаль не знаю, а прочитать его смог. Так что эмпирически дважды нет!
В отличие от классического матана (который вот на самом деле сушит мозги и бесконечно скучен), матлог — это постоянный источник космических мультиоргазмов.
И, ИМХО, куда полезнее для, скажем, программиста, а мы же тут на сайте программистов.
Да, именно. Правда, опять же, учитывая, что под окнами оно тоже использует
yield, то всё это обсуждение не имеет особого смысла.Здесь нет созвучия синтаксиса, здесь есть созвучие имён и описаний, а имена призваны именно для того, чтобы называть вещи.
Где-то на стыке когнитивной лингвистики, психологии, эволюционной теории и всякой подобной ерунды есть такая штука, как ма́ксимы Грайса. Из этих максим следует, в частности, что в данном конкретном случае наиболее естественной интерпретацией слов «Yield - это не Питоновский Yield, это ОС функция, которая говорит ОС, о том, что поток хочет отдать своё время другим потокам, т.к. ничего не делает» будет интерпретация этого как ОС-функции
sched_yieldили её аналогов (потому что иначе человек бы уточнил проsleep(0), или про ожидание до конца слайса, или хотя бы указал бы про всё это в ответ на первое возражение про семантикуyield).Поэтому вполне естественно предполагать не по созвучию имён, а по тому объёму информации, которое было передано. И если человек это использует как gotcha-тезис, то самая правильная реакция на это — применение уринированного текстиля. Тем более, что данный конкретный человек, как дело доходит до практики, просто молча сливается уже трижды (раз — здесь, два — с дженериками, три — с наркоманским тезисом о том, что дельфи на три порядка популярнее плюсов в Бразилии), предпочитая аргументировать свои ошибки минусами за комменты и в карму вместо того, чтобы про них просто написать.
Гиперклоунада.
Плюс-минус, да.
Правда, это был HTML.Плюс-минус, да.
«Асоциальный задрот» было бы ближе к истине.
Функция называется
Yield, наш ведущий специалист по Delphi (где вакансий на порядок больше C++, нет, дарта, нет, го!) описывает поведение а-ляsched_yield(или как там она называется в винде), документация описывает поведение а-ляsched_yield, но вы почему-то думаете, что речь оsleep.А почему именно
sleep? Почему не, скажем,fflush(stdout)? Почему неkill(-1, 9)? Я много хороших системных вызовов знаю.Кстати, очередные прелести дельфи — найти онлайн реализацию этого
System.Classes.pasне представляется возможным, и, похоже, не является легальным по условиям распространения дельфей. Сравните с реализацией стдлибки в плюсах, расте, хаскеле или любом другом языке.Зачем мне его менять на
sleep, если изначально я отвечал на?
Нет (ну или, вернее, «мягко скажем, не обязательно»). Оно просто всё время сжигает в сисколле и ядре:
Но так, конечно, измерять ничего не надо. Лучше так:
Это даёт
6890 103.38на моей системе. Как думаете, у меня тут средний квант диспетчеризации — 100 наносекунд (минус время на сам факт сисколла, который в среднем по исключительно случайному совпадению как раз в окрестности соточки наносекунд), или таки побольше?Это метод замены «сжирает 100% ядра» до «дожирает до 100% ядра», не более.
Чё-т не понял логического перехода от «20 лет в разработке» к процитированному.
Я в начале 90-х только родился, что не помешало мне написать первую строчку кода в этак 2001-м году, в этак 2003-м — в первый раз написать оплаченную строчку кода (потом, правда, было несколько проблематично выводить переведенные мне через webmoney деньги, потому что там требовали паспорт, а у меня его не было по излишней молодости), а в 2006-м начать пет-проект, который я иногда пописываю до сих пор.
Там на самом деле просто рассматривается нестандартная модель (и именно поэтому анализ нестандартный) аксиом ℝ, в которую через повышение мощности Левенгеймом-Сколемом и компактность (логическую, не топологическую, хотя какая разница?) можно засунуть элемент (дальновидно назовём его ∞), для которого в этой модели верно, что он больше всех элементов ℝ — сиречь, ∞ на самом деле есть бесконечность. Дальше 1/∞ будет бесконечно малой в интуитивном смысле, и при этом с ними (а также с производными, и так далее) можно работать как с нормальными числами, без плясок с пределами, эпсилонами и дельтами.
Я это всё, конечно, очень неаккуратно написал, но общая идея такова.
Но преподавание анализа таким образом потребует сначала семестра-другого матлога и теории моделей, поэтому так, конечно, не делают. А жаль.
А если других желающих поработать потоков нет, то что ОС сделает?
Сколько процессора будет есть вот это вот?
В следующем посте вы их переписали, и сейчас продолжаете говорить, что в продакшен-коде надо просто добавить yield, ничего страшного!
Ну вот такая вот читабельность, что мне потребовалось посмотреть на них дважды, чтобы заметить busy loop за попыткой отследить логику.
Речь не совсем об этом. Вот вам пара примеров.
Я хочу написать сигнатуру отвечающей за парсинг функции, параметризованной типом
sпотока (например, строка, или массив байт, или стрим, или что-то такое), типомeошибки парсинга, и типомaрезультата, чтобы все эти три типа были связны неким констрейнтом (назовём егоParsec), и чтобы нижележащий тип символов вsбылChar. В хаскеле я могу сделатьКак это будет выглядеть в дельфи?
Дальше я хочу написать функцию, скажем, из либы по линейной алгебре, которая принимает три (возможно разных) типа и возвращает четвёртый тип, соответствующий их произведению слева направо. Ну там, попарно произведение можно делать как
Vect n a → Vect n a → a (скалярное произведение)
Matrix n k a → Matrix k m a → Matrix n m a (обычное произведение матриц)
и потом их скомпозировать. В хаскеле я могу написать
Как это будет выглядеть в дельфи?
Не понял. Как
readonly-поле может быть изменено хоть внутри, хоть снаружи?Да это я понял. Просто очень смешно получается, когда человек приводит пример кода о форматировании (где подошёл бы любой код), но первый же приведённый им код жрёт 100% CPU, и человека ничего не смущает такое постить.
Уровень понятен, тащем.
Вы так говорите, будто это что-то хорошее.
Я очень рад, что в дельфях это можно (большое достижение!), но вопрос не о дельфях, а о том, что @vadimrимел в виду.
Но если хотите поговорить о дельфях, то я не против. Как навесить требование, что типы
TиU(два разных параметра дженерика) связаны каким-то констрейнтом?Диссернет, например, мусорными журналами также называет просто любые журналы со слабой редакционной политикой (а нижний квартиль или смешной IF — это показатель низкой редакционной политики).
Впрочем, если весь наш спор об определениях, то можете заменить «мусорный журнал» на «слабый ни о чём не говорящий журнал», я не против.
А чем readonly от иммутабельных отличается?
И что? Код всё равно жрёт 100% ядра процессора вот просто на ровном месте.
Или, чуть более общо, тайпкласс. Как это означает требование конкретного типа?
Для этого нужно как минимум понимать, что статус задачи — мутабельное поле, и имеет смысл его спрашивать снова.
Кстати, это busy loop, что ли? Лол. Узнаю запах старой школы.
Спасибо за ещё одну иллюстрацию vision of the anointed.
Какие конкретно права попираются при анкапе?
Для исторического обзора это естественно. Для обзора по самой математике это не очень естественно, потому что мало кто говорит «ах, сложение коммутативно? приведите ваши источники!»
Тогда это не ZF, только и всего. Можете работать в этой формальной системе, никто не против, но тогда, по идее, вы должны понимать, что в некоторых других формальных системах (которые, похоже, принимаются по умолчанию) этой аксиомы нет, поэтому ваше рассуждение там не работает.
Кстати, мне лень читать Бурбаки — вводится ли там аналогично фундаментальное понятие тройки? Вводится ли там аналогично фундаментальное понятие произвольного кортежа, индексированного произвольным множеством (чтобы можно было определить декартово произведение произвольного семейства множеств)? Как упорядоченность (и декартовы произведения) работает, когда индексирующее множество несчётно и вообще произвольное? Не вылезает там вдобавок к ZF ещё и C?
Это означает, что пара не существует как примитив — для этого достаточно прочитать следующее же предложение (поясняющее предыдущее).
Только для того, чтобы убедиться, что
whileделает то, что нужно, уже надо построить нетривиальный граф выполнения в своей голове.Ассемблер ещё больше читается по словам, в конце концов, но это не делает его проще.
Я в своё время для отца делал разные вычислительные эксперименты, и, короче, код на хаскеле ему читать проще (и убеждаться, что именно там происходит, и соответствует ли оно его модели), чем на плюсах. Притом, что у него за спиной опыт фортрана в его годы, а опыта ML-подобных языков нет.
Ну вот вы паскаль знаете, а хаскель не смогли прочитать. Я паскаль не знаю, а прочитать его смог. Так что эмпирически дважды нет!