减少冗余计算的优化对比

优化前的代码如下所示,这是一个旋转点的函数,其中Sin(Angle),Cos(Angle)都各运算了两次,因此存在冗余计算。

通过2次优化 效率有 2.2秒 提升到 1.7秒,再提升到1.5秒。冗余计算优化还是非常有效果的

using System;
using System.Drawing;

namespace speed
{
    class Program
    {
        static void Main(string[] args)
        {
            int i;
            Point pt = new Point(15, 78);
            double angle = 45d;
            DateTime dt = DateTime.Now;
            for (i = 0; i < 10000000; i++)
            {
                RotatePt_1(angle, pt);
            }
            TimeSpan ts = DateTime.Now - dt;

            Console.WriteLine("RotatePt_1 cost time {0}", ts.ToString());

            dt = DateTime.Now;

            for (i = 0; i < 10000000; i++)
            {
                RotatePt_2(angle, pt);
            }

            ts = DateTime.Now - dt;

            Console.WriteLine("RotatePt_2 cost time {0}", ts.ToString());

            dt = DateTime.Now;

            for (i = 0; i < 10000000; i++)
            {
                RotatePt_3(angle, pt);
            }

            ts = DateTime.Now - dt;

            Console.WriteLine("RotatePt_3 cost time {0}", ts.ToString());

            Console.Read();
        }

        static Point RotatePt_1(double angle, Point pt)
        {

            Point pRet = new Point();

            angle = -angle;

            pRet.X = (int)((double)pt.X * Math.Cos(angle) - (double)pt.Y * Math.Sin(angle));

            pRet.Y = (int)((double)pt.X * Math.Sin(angle) + (double)pt.Y * Math.Cos(angle));

            return pRet;
        }

        static Point RotatePt_2(double angle, Point pt)
        {

            Point pRet = new Point();

            angle = -angle;

            double SIN_ANGLE = Math.Sin(angle);

            double COS_ANGLE = Math.Cos(angle);

            pRet.X = (int)(pt.X * COS_ANGLE - pt.Y * SIN_ANGLE);

            pRet.Y = (int)(pt.X * SIN_ANGLE + pt.Y * COS_ANGLE);

            return pRet;

        }

        static Point RotatePt_3(double angle, Point pt)
        {

            angle = -angle;

            double SIN_ANGLE = Math.Sin(angle);

            double COS_ANGLE = Math.Cos(angle);

            return new Point((int)(pt.X * COS_ANGLE - pt.Y * SIN_ANGLE),

                 (int)(pt.X * SIN_ANGLE + pt.Y * COS_ANGLE));

        }
    }
}

RotatePt_1 cost time 00:00:02.2381280
RotatePt_2 cost time 00:00:01.7471000
RotatePt_3 cost time 00:00:01.5130866



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值