Pull to refresh
-1
Karma
0
Rating
  • Followers 5
  • Following 3

Так ли нужно избавляться от ветвлений? — На примере sign, abs, min и max

Нигде не говорил подобного. Я отрицаю именно то, что вы на самом деле утверждаете. То, что замер не является точным, — понятно. Это само собой. Речь идёт о том, что он также не является ни чистым, ни почти чистым. Условия замера в случае «пустого» цикла и в случае цикла с функцией совершенно разные.

Так ли нужно избавляться от ветвлений? — На примере sign, abs, min и max

Это я понял. И из моего предыдущего комментария видно, что я это понял. Я назвал цикл пустым только потому, что соответствующий этому циклу тайминг у вас сохраняется в переменную empty.

Так ли нужно избавляться от ветвлений? — На примере sign, abs, min и max

Пока вам удалось показать это лишь с опорой на предположение о том, что будто бы вам удаётся измерять время работы функции в цикле отдельно от времени работы самой циклической конструкции. Это не так. Именно поэтому я и начал говорить о способе измерения времени. Я считаю, что измерить время работы настолько крохотных функций путём многократного их повторения в цикле на современном процессоре вообще невозможно. Тем более при использовании ключа -O3.

Так ли нужно избавляться от ветвлений? — На примере sign, abs, min и max

Тогда измерять тем более бессмысленно. Чтобы измерения имели смысл, нужно знать логику работы с этими таблицами и учитывать её.

Так ли нужно избавляться от ветвлений? — На примере sign, abs, min и max

Это некорректно. Когда вы убираете из цикла вызов тестируемой функции, выполнение кода распределяется по конвейерам процессора совсем по-другому. Условие продолжения цикла (while (a != 0)) — это тоже ветвление. Процессор начинает выполнять следующую итерацию цикла ещё до того, как вычислит формулу, в надежде на то, что a действительно не будет равно нулю. В случае пустого цикла каждая следующая итерация цикла использует один дополнительный конвейер. Пока предыдущее значение a ещё не готово, на этом конвейере уже можно делать всё, что не зависит от a: 1) выбрать какие именно из блоков умножения и сложения будут использованы (и тех и других много); 2) загрузить в них обе константы (19993 и 1); 3) подготовить два временных места для размещения результатов умножения и сложения (внутренних для конвейера); 4) хрен знает что ещё (конвейер делает много такого, что не сразу приходит в голову). А когда в цикле есть ещё и функция, которая тоже зависит от a, то каждая следующая итерация задействует два дополнительных конвейера. Один делает всё то же самое, что и в случае пустого цикла, а второй параллельно начинает выполнять тестируемую функцию и делает всю возможную работу, которую можно сделать до того, как реально упрётся в отсутствие значения a, вычисленного на предыдущей итерации. Короче говоря, я хочу сказать, что замер на пустом цикле вообще никак не соотносится с замером на цикле с тестовой функцией.

Так ли нужно избавляться от ветвлений? — На примере sign, abs, min и max

Не вижу, чтобы в программе измерялось время вычисления нового значения по формуле. Там измеряется только общее время работы всего цикла. Да это и невозможно сделать. На сам замер уйдёт несравнимо больше времени, чем на вычисление формулы.

Так ли нужно избавляться от ветвлений? — На примере sign, abs, min и max

Эта разница объясняется иначе. Ветвление тут ни при чём. Это другая оптимизация, которая относится к циклам. Когда оптимизатор видит, что в коде есть цикл, в котором переменная монотонно возрастает/убывает, он переделывает код таким образом, чтобы эта переменная всегда была в регистре. И прямо в регистре он её инкрементит/декрементит, не перекладывая постоянно из регистра в память/кэш и обратно.

Так ли нужно избавляться от ветвлений? — На примере sign, abs, min и max

Ветвление на современном процессоре стоит 0 тактов. В оптимистичном сценарии. Причём ничего не стоит не только сам if, но и условие внутри него. Это возможно благодаря так называемому предсказанию переходов. Но это название не более, чем маркетинговый трюк. Никакого предсказания в строгом смысле этого слова в процессоре не делается. Просто одновременно с вычислением условия на соседнем конвейере начинается выполнение той ветки, которая будет выполнена в случае true. Таким образом, к тому моменту, когда условие будет реально просчитано, первая ветка уже будет выполнена ровно на столько тактов, сколько потребовалось на вычисление условия. Конечно, если окажется, что условие равно false, то результаты выполнения первой ветки придётся отбросить и начать выполнять вторую ветку с самого начала. Но, во-первых, в компиляторе есть специальная оптимизация. Когда компилятор уверен в том, что наиболее вероятной веткой является else, он тупо переставляет ветки местами и инвертирует условие внутри if. Во-вторых, есть программист, который иногда лучше компилятора знает, какая ветка является более вероятной. Хороший программист всегда ставит наиболее вероятную ветку первой. На тот случай, если оптимизатор в компиляторе не сможет придти к однозначному выводу о необходимости оптимизации. В этом случае оптимизатор просто ничего не меняет и оставляет так, как было у программиста.

Ubuntu интегрировали в Windows 10

А я такое видел однажды. Причём это был сознательный выбор самого разработчика. Он объяснял это тем, что у него IDEA под Linux тормозит сильнее, чем под Windows.

Ubuntu интегрировали в Windows 10

Но ведь всё началось не с моего первого комментария. Сначала была сама конференция, которая называется Build. И что-то подсказывает мне, что она проводилась не для строителей. На конференции речь шла про Ubuntu, которая тоже не очень-то распространена вне машин разработчиков. По-моему, контекст определён очень чётко. Ведь мы же не будем сейчас делать вид, что ничего этого не было, и что я якобы вдруг спонтанно заговорил о каких-то неопределённых машинах, за которыми может работать кто угодно :)
BTW, умение распознавать контекст в процессе коммуникации — это одно из главных преимуществ человека перед компьютерами. Попытки научить компьютер распознавать контекст не прекращаются, но удовлетворительного решения пока нет.

Ubuntu интегрировали в Windows 10

То, что речь идёт о машинах разработчиков, должно быть понятно из контекста. Бухгалтеру линукс в принципе не нужен — ни внутри винды, ни в виртуалке, ни отдельно. Компания, на самом деле, не полностью виндовая. Просто виндовое направление в разработке доминирует, а линуксоиды находятся в меньшинстве.

Ubuntu интегрировали в Windows 10

Такой подход к безопасности, при котором все бинарники на машине разработчика обязательно должны быть подписаны сертификатом, — это хороший способ снискать репутацию конченного параноика… находящегося далеко за гранью адекватности (тем реальным угрозам, которые действительно существуют). При этом огромные деньги можно будет наблюдать лишь во сне.

Ubuntu интегрировали в Windows 10

Это уже какая-то паранойя. У нас в компании такого нет. Виртуалки с линуксом делать можно.

Ubuntu интегрировали в Windows 10

Это хорошо. Но в любом случае, Outlook — лишь часть проблемы. В компаниях, которые традиционно используют винду в качестве основной платформы, на рабочую машину должно быть установлено очень много корпоративного виндового софта. Причём существенная часть этого софта вообще разработана внутри компании и без какой-либо оглядки на то, что Linux вообще существует. Фактически, когда ты приходишь на работу, тебе просто выдают готовый компьютер, на котором весь это софт уже установлен и настроен. И всё, что может сделать линуксоид, — это работать на этой машине в виртуалке или попытаться выбить себе вторую машину для работы в Linux.

Ubuntu интегрировали в Windows 10

Только не в той компании, где ты даже вопрос на Stackoverflow не можешь запостить без согласования со специальным человеком, который отвечает за безопасность и утечку информации (точнее, за её отсутствие). Думаю, сама идея использовать для рабочей переписки облачный сервис вызовет у этого человека нервный смех (сквозь слёзы сочувствия к тому, кто эту идею предложит).

Ubuntu интегрировали в Windows 10

И ведь побегут. Я имею в виду тех, кто сейчас вынужден страдать из-за того, что рабочая машина должна быть на Win (из-за Outlook'а), а основную работу приходится работать в виртуалке с Ubuntu.

Уличная грязь и симуляция движения пешеходов

Про дома я не говорю. У домов само собой приоритет. Для проектировщика пешеходных дорожек дома должны быть как элементы ландшафта — он ничего не может с ними сделать и просто должен удобно соединить все подъезды (парадные — по-вашему) со всеми расположенными рядом остановками общественного транспорта. Я говорю про мелкие объекты дворовой инфраструктуры: магазинчик, пул скамеек, детская площадка и т.д. Их расположение должно быть подчинено заранее продуманной сети пешеходных дорожек. А расположение домов должно подчиняться лишь заранее спроектированной сети путей сообщения с большой пропускной способностью (автомобильных дорог, ж/д, метро).

Уличная грязь и симуляция движения пешеходов

Согласен, что в тех случаях, когда район проектируется сразу и целиком, можно устранить много косяков, если поставить такую цель. Но в общем случае нужно решать обратную задачу. Т.е. сначала нужно прокладывать сеть дорожек таким образом, чтобы к ней позже можно было удобно подсоединить как можно больше аттракторов для пешеходов. И только потом размещать сами аттракторы в тех местах, где это хорошо согласуется с графом дорожек. Но только так никто делать не будет. Это требует определённых навыков в области централизованного планирования. А это забытое искусство к настоящему моменту почти полностью утрачено. Сейчас в тренде решение сложных многофакторых проблем исключительно методом самоорганизации через множество итераций. (Даже в разработке программ итерационные методологии более популярны, чем старый добрый уотерфол.) И любой получившийся результат просто объявляется наилучшим из возможных. Подразумевается, что он является наилучшим из тех, которые возможно получить методом самоорганизации. Но для краткости такие детали опускаются.

Уличная грязь и симуляция движения пешеходов

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

Information

Rating
Does not participate
Registered
Activity