Очевидно, если очередная вершина вычисляется подпрограммой на асемблере, к скорости вычисления предъявляются очень высокие требования (иначе зачем это баловство?). Следовательно, нужна серьезная оптимизация.
Во-первых, совершенно непонятно, зачем
каждый раз заново вычислять произведение 2*pi? Со времени предыдущего вызова это значение вряд ли изменится. Поэтому эту константу можно вычислить единственный раз, лучше всего - на этапе компиляции. Компилятор на фазе оптимизации именно так бы и сделал, если бы ему предоставили такой шанс; более того, по возможности еще и закэшировал бы на свободных регистрах. Это одна из причин, по которой гуру крайне не рекомендуют отбивать хлеб у компилятора и выполнять за него "оптимизацию", кодируя вручную. Практика показывает, что крайне редко кому удается действительно превзойти компилятор по части эффективности кода. Я уже не говорю о том, что этот трюк сразу отметает возможность выполнить программу на платформе, отличной от x86.
Во-вторых, тригонометрические операции вычисляются на Pentium IV за 140 тактов, насколько мне известно. Не самая дешевая операция. В то же время, например, если число вершин четно, достаточно посчитать лишь
половину точек, скажем, в диапазоне от 0 до pi, а затем получить другую половину, зеркально отразив их на нижнюю полуплоскость (оставив абсциссы теми же, а ординатам сменить знак). Смена знака делается гораздо эффективнее тригонометрии, а значит, каждый второй полигон будет считаться почти вдвое быстрее.
Можно пойти дальше и проверить, не кратно ли число вершин четырем. Тогда достаточно посчитать только квадрант и воспользоваться симметрией. Ну и так далее по степеням двойки. Если число вершин полигона велико (например, он используется для аппроксимации окружности или ее дуги), выигрыш может оказаться очень существенным.
В-третьих, я бы еще попробовал такой, более общий алгоритм.
1. Получаем угол между соседними вершинами как fi = 2*pi/N.
2. Вычисляем синус/косинус этого угла (один раз!!!).
3. Располагаем первую точку, скажем, в (1, 0).
4. N-1 раз крутим эту точку вокруг начала координат на угол fi.
5. ...
6. Profit!!!
К сожалению, не имею достаточно свободного времени, чтобы сравнить времена выполнения обсуждаемой реализации и предложенных мной вариантов (эта задача неприменима ни к одной из решаемых мной в данный момент проблем, хотя наверняка пригодится впоследствии). Но очень сильно убежден, что такая оптимизация многократно перекроет эффект ассемблерной вставки, особенно при полностью включенной оптимизации кода в компиляторе.
Ну и в качестве бонуса - замечательная статья на злобу дня "
Оптимизация: ваш злейший враг", которую я перевел 6 лет назад, но актуальность она вряд ли когда-нибудь утратит.