это считает за наносекунды?
да: https://godbolt.org/z/PsWdnchzx
https://godbolt.org/z/9drvjf3d6 сверху - оптимизации выключены (как при debug билде) снизу - максимальные оптимизации 3-го уровня может так понятнее станет
насколько я помню это называется констант фолдинг https://llvm.org/doxygen/ConstantFolding_8cpp_source.html компилятор видит что набор инструкций выполняется над константами (да ещё и без всяких промежуточных ио и тд) то есть pure function следовательно это всё можно свернуть в одно константное значение что вы и наблюдаете когда весь вызов схлопыается в 1 асм операцию по установки регистра в нужное значение
вспоминаю мем компилятора фортрана который такие циклы оптимизировал в формулы суммы ряда
Ллвм тоже оптимизирует бтв
ну про ллвм байки не сочиняют
ну что-то он наоптимизировал, но не то как нужно
Это ведь ещё 128 числа
бывает, я на u32 проверяю
pub fn main() { let n: u32 = 1000; let now = std::time::Instant::now(); let res: u32 = sum(n); let t = now.elapsed(); dbg!(res); dbg!(t); } #[inline(never)] pub fn sum(n : u32) -> u32 { return (0..n).sum(); } sum схлопнулось до формулы example::sum: test edi, edi je .LBB1_1 lea eax, [rdi - 1] lea ecx, [rdi - 2] imul rcx, rax shr rcx lea eax, [rdi + rcx] add eax, -1 ret
вообще там ещё смешно что на плейграунде, стабильном / найтли, годболте везде разный асм выходит
почему он параметры со стека забирает что за аби такой странный
Где? Через lea просто арифметические операции идут.
Обсуждают сегодня