Оптимизация кода в уме, или «Ну так же однозначно быстрее»

Намедни работая над одной ошибкой в одном опенсорсном проекте, увидел как коллега (тоже работающий параллельно над той же проблемой) залил такой вот коммит [31a078bec7]:

   	/*
-	 * Select the list item based on the index. Negative operand means
-	 * end-based indexing (-2, ...), and -1 means out of range.
+	 * Decode end-offset index values.
   	 */
-	if (opnd < -1) {
-	    index = opnd+1 + objc;
-	} else {
-	    index = opnd;
-	}
+	index = opnd + (opnd <= TCL_INDEX_END)*(objc - 1 - TCL_INDEX_END);
   	pcAdjustment = 5;

Изменение само по себе правильное (теперь TCL_INDEX_END есть константное определение (-2)).
И грубо говоря в уме это разворачивается в следующее (все переменные int):

index = opnd + cmp(opnd, (-2))==>(0 | 1) * (objc - 1 - (-2));

Т. е. он как бы тем самым хотел сэкономить здесь один условный переход.
И всё как бы ничего, однако меня всё же насторожила такая казалось бы пустячная «оптимизация» с уклоном в арифметику.

Во первых, это изменение касается самой «главной» функции в этом проекте (TEBCresume), ибо она ответственна за исполнение байт-кода (JIT скомпилированных инструкций языка TCL). По этой причине эта функция еще и самая большая (порядка 6 тысяч строк + примитивы и макросы) и одна из самых сложных в кодовой базе проекта, с множественными `goto`, головоломными макросами для работы со «стеком» исполнения, свёртка/развертка NRE (nonrecursive evaluation) и т.д. и т.п.
Т.е. изменения этой функции нередко рассматриваются под лупой, а то и под микроскопом (т.к. бывало что даже незначительные модификации могут перевернуть весь код этой функции с ног на голову)…

Во вторых, по роду деятельности мне часто приходится оптимизировать сишный код, разглядывая его ассемблерное отражение, выжимая доли микро- а то и нано-секунд, и я часто вижу, что там очень всё совсем не однозначно бывает. Как минимум иногда разворачивая такие вот «экономящие» условный jump конструкции обратно в if или даже if/else, я видел улучшение как и в результирующем ассемблерном коде, так и явно при конечном сравнении производительности результатов исполнения.

Собственно к чему я все это писал — хотелось на примере показать как оно бывает, ну и раз уж коснулись этой темы, собрать немного статистики. Посему пара опросов в конце статьи…
Развернуть в ассемблер …
Оптимизация кода в уме, или «Ну так же однозначно быстрее»
Source: habrahabr

Пост №3425793

Автор: commissarmanul

Развернуть { «@context»: «http://schema.org», «@type»: «BlogPosting», «mainEntityOfPage»:{ «@type»:»WebPage», «@id»:»/post/3425793″ }, «headline»: «THE SHAPE OF WATER :: Гильермо Дель Торо :: фильмы», «image»: { «@type»: «ImageObject», «url»: «http://img0.joyreactor.cc/pics/post/full/THE-SHAPE-OF-WATER-%D0%93%D0%B8%D0%BB%D1%8C%D0%B5%D1%80%D0%BC%D0%BE-%D0%94%D0%B5%D0%BB%D1%8C-%D0%A2%D0%BE%D1%80%D0%BE-%D1%84%D0%B8%D0%BB%D1%8C%D0%BC%D1%8B-4349706.jpeg», «height»: 801, «width»: 733 }, «datePublished»: «2018-03-08T18:13:05+03:00», «dateModified»: «2018-03-08T18:13:05+03:00», «author»: { «@type»: «Person», «name»: «commissarmanul» }, «publisher»: { «@type»: «Organization», «name»: «JoyReactor.cc», «logo»: { «@type»: «ImageObject», «url»: «http://joyreactor.cc/images/joyreactor_ie6.png», «width»: 207, «height»: 54 } }, «description»: «» }
Комментировать 
Пост №3425793
Source: Joyreactor

[Перевод] Создаем своих криптокотиков (Часть 1)

В первых числах декабря 2017 года, пользователи блокчейн-проекта Ethereum столкнулись с неприятным открытием — любые их транзакции просто перестали подтверждаться. Фактически, вся сеть перестала функционировать из-за неожиданно разросшегося в размерах мемпула.

Совсем скоро стало понятно в чем же дело — во всем виноват оказался проект CryptoKitties. Это забавная игрушка, работающая на блокчейне Ethereum и позволяющая пользователям разводить «котят», скрещивать их и продавать как обычные критовалютные токены. В какой-то момент 15% всех транзакций в Ethereum приходились на криптокотят! А к моменту написания этой статьи, игроки потратили на котят уже 23 миллиона долларов!

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

cryptocat
Хочу криптокотика
[Перевод] Создаем своих криптокотиков (Часть 1)
Source: habrahabr

M.O.B.A

Посвящается всем любителям и фанатам онлайн игр жанра MOBA (Multiplayer Online Battle Arena, буквально «многопользовательская онлайновая боевая арена») — жанр компьютерных игр, сочетающий в себе элементы стратегий в реальном времени и компьютерных ролевых игр и выделяющийся схожестью с DotA.

Каждый может быть Героем, нужно лишь найти свой мир.
Читать дальше →
M.O.B.A
Source: geektimes

Пост №3425783

Автор: Ali-dgi

Развернуть { «@context»: «http://schema.org», «@type»: «BlogPosting», «mainEntityOfPage»:{ «@type»:»WebPage», «@id»:»/post/3425783″ }, «headline»: «tokafan :: Смешные комиксы (веб-комиксы с юмором и их переводы)», «image»: { «@type»: «ImageObject», «url»: «http://img0.joyreactor.cc/pics/post/full/tokafan-%D0%9A%D0%BE%D0%BC%D0%B8%D0%BA%D1%81%D1%8B-4349696.jpeg», «height»: 1545, «width»: 1044 }, «datePublished»: «2018-03-08T18:05:06+03:00», «dateModified»: «2018-03-08T18:05:06+03:00», «author»: { «@type»: «Person», «name»: «Ali-dgi» }, «publisher»: { «@type»: «Organization», «name»: «JoyReactor.cc», «logo»: { «@type»: «ImageObject», «url»: «http://joyreactor.cc/images/joyreactor_ie6.png», «width»: 207, «height»: 54 } }, «description»: «» }
Комментировать 
Пост №3425783
Source: Joyreactor

Microsoft рассказала про режим S Mode для Windows 10

Компания Microsoft поделилась некоторыми подробностями нового режима S Mode для операционной системы Windows 10. Напомним, он заменит Windows 10 S и будет предлагать те же возможности, но […]
Microsoft рассказала про режим S Mode для Windows 10
Source: 4pda

Пост №3425774

Автор: uni-snake

Развернуть { «@context»: «http://schema.org», «@type»: «BlogPosting», «mainEntityOfPage»:{ «@type»:»WebPage», «@id»:»/post/3425774″ }, «headline»: «арт барышня (арт девушка, art барышня, art девушка,) :: Nina Galinska :: art (арт)», «image»: { «@type»: «ImageObject», «url»: «http://img0.joyreactor.cc/pics/post/full/%D0%B0%D1%80%D1%82-%D0%B1%D0%B0%D1%80%D1%8B%D1%88%D0%BD%D1%8F-art-Nina-Galinska-4349688.jpeg», «height»: 2973, «width»: 1920 }, «datePublished»: «2018-03-08T17:52:58+03:00», «dateModified»: «2018-03-08T17:52:58+03:00», «author»: { «@type»: «Person», «name»: «uni-snake» }, «publisher»: { «@type»: «Organization», «name»: «JoyReactor.cc», «logo»: { «@type»: «ImageObject», «url»: «http://joyreactor.cc/images/joyreactor_ie6.png», «width»: 207, «height»: 54 } }, «description»: «» }
Комментировать 
Пост №3425774
Source: Joyreactor

Пост №3425752

Автор: Constantinos

o. kurwy!Развернуть { «@context»: «http://schema.org», «@type»: «BlogPosting», «mainEntityOfPage»:{ «@type»:»WebPage», «@id»:»/post/3425752″ }, «headline»: «o. kurwy! / Польша :: стоп-кадр :: страны :: гимнастки :: тян :: правительство», «image»: { «@type»: «ImageObject», «url»: «http://img1.joyreactor.cc/pics/post/full/%D0%9F%D0%BE%D0%BB%D1%8C%D1%88%D0%B0-%D1%81%D1%82%D1%80%D0%B0%D0%BD%D1%8B-%D1%82%D1%8F%D0%BD-%D0%B3%D0%B8%D0%BC%D0%BD%D0%B0%D1%81%D1%82%D0%BA%D0%B8-4349663.jpeg», «height»: 640, «width»: 960 }, «datePublished»: «2018-03-08T17:32:23+03:00», «dateModified»: «2018-03-08T17:32:23+03:00», «author»: { «@type»: «Person», «name»: «Constantinos» }, «publisher»: { «@type»: «Organization», «name»: «JoyReactor.cc», «logo»: { «@type»: «ImageObject», «url»: «http://joyreactor.cc/images/joyreactor_ie6.png», «width»: 207, «height»: 54 } }, «description»: «» }
Комментировать 
Пост №3425752
Source: Joyreactor

DSP на Java

Java — язык программирования общего назначения. Общего назначения — значит можно писать почти любые программы. Вот я и попытался написать программу, которую обычно пишут на С или C++. Под катом я попытаюсь рассказать, как я декодировал спутниковые снимки с Метеор-М №2.

DSP in Java

Читать дальше →
DSP на Java
Source: habrahabr

Пост №3425742

Автор: uni-snake

Развернуть { «@context»: «http://schema.org», «@type»: «BlogPosting», «mainEntityOfPage»:{ «@type»:»WebPage», «@id»:»http://wh.reactor.cc/post/3425742″ }, «headline»: «Praetorian Guard :: Tallarn Desert Raiders :: Raven Guard :: Astra Militarum (Imperial Guard, ig) :: Adeptus Mechanicus (Mechanicum) :: Inquisition :: Servo Skull :: Space Marine (Adeptus Astartes) :: Imperium (Империум) :: Psyker :: Warhammer 40000 (warhammer40000, warhammer40k, warhammer 40k, ваха, сорокотысячник) :: DiegoGisbertLlorens :: фэндомы», «image»: { «@type»: «ImageObject», «url»: «http://img1.joyreactor.cc/pics/post/full/Warhammer-40000-%D1%84%D1%8D%D0%BD%D0%B4%D0%BE%D0%BC%D1%8B-Adeptus-Mechanicus-Imperium-4349649.jpeg», «height»: 2500, «width»: 4041 }, «datePublished»: «2018-03-08T17:16:42+03:00», «dateModified»: «2018-03-08T17:16:42+03:00», «author»: { «@type»: «Person», «name»: «uni-snake» }, «publisher»: { «@type»: «Organization», «name»: «JoyReactor.cc», «logo»: { «@type»: «ImageObject», «url»: «http://joyreactor.cc/images/joyreactor_ie6.png», «width»: 207, «height»: 54 } }, «description»: «» }
Комментировать 
Пост №3425742
Source: Joyreactor