Народ, помогите! Поиск "на вскидку" ничего не дал Товарищ просил помочь - нужна информация о количестве тактов (от скольки и до скольки) для P4 при выполнении следующих операций: -сложение; -умножение; -деление; -вычитание; -сравнение. Нужно просто для примера (т.е. не все возможные варианты данных операций, а хотя бы основные). Из всего, что находил - наиболее подошли пару статей на этом сайте про оптимизацию , но они для PIII Если что упустил - ткните пальцем, буду признателен. Заранее спасибо!
Количество тактов на операцию во всех более-менее современных процессорах -- вещь очень относительная, потому что процессоры совмещают разные этапы выполнения (выборка, декодирование, загрузка исходных операндов, собственно операция, запись результата) нескольких команд довольно сложным образом. В зависимости от местоположения команды и её данных (только в памяти или в кэше, а если в кэше, то в каком) время выполнения команд типа сложения, вычитания, сравнения, пересылки может составлять от одного "виртуального" такта до нескольких десятков, а то и сотен ("виртуального" из-за того, что совмещается выполнение разных этапов разных команд). В общем, никакого однозначного ответа при такой постановке вопроса быть не может -- в том числе и для пня-3.
naTpuoT Это ж как надо было вскинуть, чтобы не заглянуть на официальный сайт. http://www.intel.com/products/processor/manuals/ В частности Intel® 64 and IA-32 Architectures Optimization Reference Manual. В частности Appendix C. В частности Table C-12.
SII Это да, разве что самому не измерить воспользововшись rdtsc. В моей практике по тесту производимого кода (в основном HLL компилей) я использую простейший тест Код (Text): {$apptype console} program xtest; function Div100(xz:integer):integer; begin result := xz div 100; end; function AsmDiv100 (xz:integer):integer; asm mov ecx, eax mov eax, 51EB851Fh imul ecx sar edx, 5 sar ecx, 1Fh sub edx, ecx mov eax, edx end; function rdtsc: int64; asm RDTSC end; var takt:int64; cc:integer; begin takt:=rdtsc; // калибровка rdtsc cc:=rdtsc-takt; takt:=rdtsc; AsmDiv100 (100000); takt:=rdtsc-takt; writeln (takt-cc); takt:=rdtsc; Div100 (100000); takt:=rdtsc-takt; writeln (takt-cc); end. /off SII представляете, а разница-то исполнения различных вариантов DIV оказываеться копеешная! :-P
bugaga Я пишу на дельфи либу с оптимизацией. Так вот замена деление на умножение в разных местах дала выигрышь от 15% до 100%(в 2 раза). Если учесть что у меня цикл на милион кругов, то выигрыш существенный.
Pavia Ну если компилятор у него не умеет оптимизировать код, то div по сравнению с call покажется ерундой
Зря смеешься, скачал 7 мануалов с того сайта, но не угадал Именно на этот внимания не обратил . Времени просто очень мало было вникать... Всем ответившим большое человеческое спасибо, особенно l_inc!
naTpuoT Загляни к Агнеру Фогу. Там и instruction_tables.pdf с латентностями практически всех инструкций (а не выборочно, как у Intel) для всех современных процев и еще масса всего интересного CrystalIC Как ни странно, но я тоже его юзаю Там где компилер не тянет, там встроенный асм рулит
CrystalIC а какой компилятор хороший? msvc2008? он мне недавно скомпилил "lea esp,[esp]". я долго медитировал над этой инструкцией, но ее сакральный смысл остался мне непонятен. возможно это был nop, только нахрена он мне? все же оптимальность кода в первую очередь определяется программистом, а не компилятором.
Velheart Ты прав. К примеру масм генерирует при выравнивании, когда требуетсо добавить 3 байта инструкцию lea ecx,d[ecx].