Комментарии 6
Деление на константу нынче не такое уж и медленное. Компиляторы умеют заменять его умножением на обратное значение: https://godbolt.org/z/1achaeK8W
Да, это несколько инструкций и операция всё ещё дороже других, но при этом значительно быстрее, чем честное деление.
Ссылкой порадовали, залип)
Премного благодарен.
Ну насколько я понимаю, эта оптимизация основана на том, что вычисления в unsigned происходят в кольце вычетов по 2^32, и поэтому там есть обратный элемент. В signed так не получится, во всяком случае в лоб (не работает для отрицательных). Другое дело, что тут компилятор всё равно мог бы доказать, что при отрицательном индексе у него будет UB, при условии, что этот индекс когда-то станет меньше -6. В общем, попробовать поприседать можно, но в данном случае от деления избавиться довольно трудно.
Но наблюдение отличное!
Еще одна выгода от размотки цикла - спекулятивное выполнение: все вероятные и невероятные продолжения посчитаются параллельно и выигрыш в производительности на нескольких ядрах будет в разы.
А в каком языке выполнение возможно на нескольких ядрах без специальных конструкций/вызовов в коде?
Не очень понял, как связано спекулятивное исполнение и несколько ядер. Для этого бы пришлось задействовать (как минимум) протоколы когерентности кэша, а это довольно дорого. Насколько я понимаю, процессоры спекулируют на одном ядре.
А что мешает процессору, который умеет спекулировать обе ветки, делать это на неразмотанном цикле?
Поговорим об оптимизирующих компиляторах. Сказ восьмой: размотка циклов