NickLion писал(а): ↑25.04.2012 12:01
Во-первых, BASE десятичное, чтобы с переводом в десятичный вид не мучаться. Как следствие, заменить & не получится в принципе.
плохо... Плохо для быстродействия.
NickLion писал(а): ↑25.04.2012 12:01
Во-вторых, работа с памятью может стоить 50 умножений.
не в этом случае. Всё это будет лежать в регистрах, которых сейчас штук 200 ЕМНИП, или на край в первом кеше, который вроде-бы работает на частоте CPU. Т.ч. ИМХО есть за что бороться.
NickLion писал(а): ↑25.04.2012 12:01
В-третьих, в ассемблерном коде big_mul нет ни одного деления, сейчас лень разбираться что к чему, но суть в том, что оптимизирует компилер очень неплохо.
это старый хакерский трюк (:
Связано это с тем, что деление на константу, есть умножение на обратную константу. Если числа целые, то обратная константа <1, но её можно предварительно домножить на 2^M, а потом результат поделить на 2^M, такое умножение/деление со времён i8086 выполняется за 1 такт, а со времён iPentium ещё быстрее. Простое умножение (не на константу) тоже делается очень быстро, это уже много десятков лет совсем не сложение и сдвиг побитно.
Например, если у нас 16 бит, то деление на 3 эквивалентно умножению на 21845, при этом надо в качестве частного брать сдвинутый на 16 бит результат (что не занимает времени, т.к. результат получается в виде двух чисел). С остатком тяжелее, ибо он получается тоже делённый на 3, и его приходится опять умножать.
NickLion писал(а): ↑25.04.2012 12:01
В-четвёртых, не будет выигрыша в 10-100 раз.
а я проверял. на каком-то i80586, уже и не помню, на каком точно. Уверен, что на современном CPU выигрыш будет ещё больше (особенно если заюзать SSE, и множить аж по 128 бит за раз).