16,472
社区成员
发帖
与我相关
我的任务
分享
class CLine
{
public:
float x1,y1,x2,y2;
float GetLength();
};
class CLine
{
public:
void SetPosition(x1,y1,x2,y2);
void SetHead(x1,y1);
void SetTail(x2,y2);
void GetHeadX();
void GetHeadY();
void GetTailX();
void GetTailY();
void GetLength();
private:
float _x1,_y1,_x2,_y2;
};
#include <math.h>
#include <Windows.h>
#include <iostream>
#include <stdlib.h>
#define M_PI 3.14159265358979323846f
#define M_PI_2 1.57079632679489661923f
#define M_PI_4 0.785398163397448309616f
#define M_1_PI 0.318309886183790671538f
#define M_2_PI 0.636619772367581343076f
using namespace std;
class Line1
{
public:
float m_x1,m_y1,m_x2,m_y2,v,rotate;
Line1(float x1, float y1, float x2, float y2)
{
m_x1 = x1;
m_x2 = x2;
m_y1 = y1;
m_y2 = y2;
}
float GetLen(int a){m_x1 = a;return sqrt((m_x2 - m_x1)*(m_x2 - m_x1) + (m_y2 - m_y1)*(m_y2 - m_y1));}
float Getrot(int a)
{
m_x1 = a;
float lx = m_x2 - m_x1,ly = m_y2 - m_y1;
if(lx!=0)
{
rotate = atan(ly/lx);
//在第一、四象限
if(lx > 0)
{
if(ly < 0)rotate += 2 * M_PI;
}
//在第二、三象限
else rotate += M_PI;
}
else
{
if(ly>0)rotate = M_PI_2;
else if(ly<0)rotate = M_PI_4 * 3;
else rotate = 0;
}
return rotate;
}
};
class Line2
{
private:
float m_x1,m_y1,m_x2,m_y2,m_len,v,rotate;
public:
Line2(float x1, float y1, float x2, float y2)
{
m_x1 = x1;
m_x2 = x2;
m_y1 = y1;
m_y2 = y2;
m_len = sqrt((x2 - x1)*(x2 - x1) + (y2 - y1)*(y2 - y1));
float lx = m_x2 - m_x1,ly = m_y2 - m_y1;
if(lx!=0)
{
rotate = atan(ly/lx);
//在第一、四象限
if(lx > 0)
{
if(ly < 0)rotate += 2 * M_PI;
}
//在第二、三象限
else rotate += M_PI;
}
else
{
if(ly>0)rotate = M_PI_2;
else if(ly<0)rotate = M_PI_4 * 3;
else rotate = 0;
}
}
float GetLen(int a){m_x1 = a;return m_len;}
float Getrot(int a){m_x1 = a;return rotate;}
};
void main()
{
Line1 L1(5,3,10,20);
Line2 L2(5,3,10,20);
float fResult;
DWORD dwTime1 = GetTickCount();
for (unsigned long long i=0; i<1000000000; ++i)
{
fResult = L1.GetLen(rand());
}
DWORD dwTime2 = GetTickCount();
cout<<dwTime2 - dwTime1<<endl;
dwTime1 = GetTickCount();
for (unsigned long long i=0; i<1000000000; ++i)
{
fResult = L2.GetLen(rand());
}
dwTime2 = GetTickCount();
cout<<dwTime2 - dwTime1<<endl;
system("pause");
}
每循环加入了随机数,以防简单循环直接被优化掉。
除了计算长度,还计算了倾角
在计算长度时,第二种方法只比第一种方法快几百毫秒。
在计算倾角时,第二种方法用时是第一种方法的一半。
看来在if语句的时候速度就慢了。如果只需要长度的话,两种方法基本没区别了。
不知道我的计算倾角的算法有没有可以优化的地方
#include <math.h>
#include <Windows.h>
#include <iostream>
using namespace std;
class Line1
{
public:
float m_x1,m_y1,m_x2,m_y2;
Line1(float x1, float y1, float x2, float y2)
{
m_x1 = x1;
m_x2 = x2;
m_y1 = y1;
m_y2 = y2;
}
float GetLen(){return sqrt((m_x2 - m_x1)*(m_x2 - m_x1) + (m_y2 - m_y1)*(m_y2 - m_y1));}
};
class Line2
{
private:
float m_x1,m_y1,m_x2,m_y2,m_len;
public:
Line2(float x1, float y1, float x2, float y2)
{
m_x1 = x1;
m_x2 = x2;
m_y1 = y1;
m_y2 = y2;
m_len = sqrt((x2 - x1)*(x2 - x1) + (y2 - y1)*(y2 - y1));
}
float GetLen(){return m_len;}
};
void main()
{
Line1 L1(5,3,10,20);
Line2 L2(5,3,10,20);
float fResult;
DWORD dwTime1 = GetTickCount();
for (unsigned long long i=0; i<1000000000; ++i)
{
fResult = L1.GetLen();
}
DWORD dwTime2 = GetTickCount();
cout<<dwTime2 - dwTime1<<endl;
dwTime1 = GetTickCount();
for (unsigned long long i=0; i<1000000000; ++i)
{
fResult = L2.GetLen();
}
dwTime2 = GetTickCount();
cout<<dwTime2 - dwTime1<<endl;
}
我刚试了下,Release编译出来运行。
在一个十亿次的循环中分别调用两种类获取长度的方法。
第一种耗时1594毫秒,第二种耗时1516毫秒。
调用十亿次,第二种只比第一种快78毫秒。
如果你的调用量只是几千万次甚至一亿次的话,几乎没有差别。
而事实上在实际应用的程序中,再频繁也就调用几千次最多几万次,结果就。。。。效率相差几微秒,哦不,纳秒