Започва да учи асемблер знам C / C ++. Затова реших да се започне от знанието, че е вече там, и аз започнах да разглобявате писан закон и да видим как става това.
И веднага попаднах алогично момент.
Ако комплектът е функция на увеличаване на стойността на EAX аргумента вкл. тя трябва да се различава от добавяне на 1 до регистъра с добавка EAX, 1.
Аз обикновено се предположи, че ако има някои функции, така че те са по-ефективни. но ако погледнете кода аз ++:
Какво е по-добре да се използват: вкл, или да добавите в този случай?
Мисля, че компилаторът е глупак. Вероятно повлияни от факта, че теоретично резултат аз ++ все още може да се използва и след това заради това той се опитва да спаси резултата в R \ EAX. В действителност, компилаторът може да генерира
В допълнение, има ясно колкото три инструкции, вместо от един, и то със сигурност е по-бавно (освен ако стойността на аз ++ не е необходимо след това).
Що се отнася до изрична сравнението добавите EAX, 1 и с включени EAX, а след това аз подозирам, че разликата в скоростта е не, но цифрата 1 се извършва, което означава, че тя ще се проведе в кода на опашката за предварително извличане и може да играе отрицателна роля. И не мога да играя.
От друга страна, компилаторът използва Наистина е трудно да добавите EAX, 1:
Тя дава резултат, без да inc'a
От друга страна, Java JIT-компилатор понякога използва вкл. той видя ..
Е, и въпросите, разбира се, се питат! Всичко е толкова желязо зависими неща!
Общото правило е проста: по отношение на генерирането на асемблер съставител винаги по-умен код (осъзнаване) от теб. Ако той не направи това, то би било по-добре.
Втората мисъл: Вие сте основани на погрешна обещание. Въвеждането на нови машинни инструкции, не винаги са продиктувани от ефективността на компютри. Все още има такова нещо като ефективността на програмист - съгласен, вкл EAX да пиша много по-лесно, отколкото да добавите EAX, 1). И операция е изключително често.
Сега за това, защо се добави по-бързо от вкл. (Всичко, което ще напиша не се изисква за да е истина - аз просто мисля така). Фактът, че вкл. За разлика от добавката. Това не променя състоянието на флага за носене. Някои други знамена се променят. Тъй като аз не съм наясно с всяка архитектура, на която е възможно да се постави знамената един по един, не всички заедно, аз се опитвам да се посочат следните данни: Inc "в първо трябва да се помисли за текущото състояние на флага за носене (което води до фалшива връзка с последващото спирането на конвейера). И добави "в него не е необходимо, тъй като тя ще се записват. Следователно, увеличаването на производителността.
Послепис Отказ от отговорност отново: Направих това не е много добър, все още се разбере (контакт шест месеца по-късно - както изглежда, от времето, когато аз съм експерт в тази област =)). Просто някъде нещо такова чух \ чете.
Отговорено 14 '11 февруари в 21:57
GCC (GCC) 3.4.5 (MinGW-изглед специално R3)
вкл използва за аз ++ й ++
при съставянето с -O3 като цяло запазва променливи в регистрите. ССЗ -S -O3
вземане (за време) Код:
По отношение на скорост на изпълнение. Лично аз мисля, че скоростта на изпълнение x86 в цикличен код на един разумен размер за една модерна архитектура е изпълнение, колкото може да изглежда на пръв поглед изглежда по същия начин. Това се дължи на предварително извличане команди и превръщане на команди RISC-подобен процесор.
Свързани статии