static double getPolygonArea(double *points, int length) {
if (length < 6) {
// 无法构成多边形
return 0;
}
double area = 0.0;
double x0 = points[0], y0 = points[1];
double dx1, dy1;
double dx2, dy2;
dx1 = *(points+2) - x0;
dy1 = *(points+3) - y0;
for (int i = 4; i < length - 1; i += 2) {
dx2 = *(points+i) - x0;
dy2 = *(points+i + 1) - y0;
double subArea = (dx1 * dy2 - dx2 * dy1) / 2;
area += subArea;
dx1 = dx2;
dy1 = dy2;
}
return area;
}
这个函数在C++上的耗时比Java还高。调用次数10次的时候还不相上下,1000次的时候C++多用10%时间,10000次的时候C++多用17%的时间,100000次的时候C++多用33%的时间。虽然难以致信,但是确实是Java更快。如果把static去除,似乎编译器会自动优化,无论重复调用多少次时间都是0。如果加上inline,一点作用也没有。是否有办法把它优化到比Java更快。
if (length < 6) {
// 无法构成多边形
return 0;
}
double area = 0.0;
double x0 = points[0], y0 = points[1];
double dx1, dy1;
double dx2, dy2;
dx1 = *(points+2) - x0;
dy1 = *(points+3) - y0;
for (int i = 4; i < length - 1; i += 2) {
dx2 = *(points+i) - x0;
dy2 = *(points+i + 1) - y0;
double subArea = (dx1 * dy2 - dx2 * dy1) / 2;
area += subArea;
dx1 = dx2;
dy1 = dy2;
}
return area;
}
这个函数在C++上的耗时比Java还高。调用次数10次的时候还不相上下,1000次的时候C++多用10%时间,10000次的时候C++多用17%的时间,100000次的时候C++多用33%的时间。虽然难以致信,但是确实是Java更快。如果把static去除,似乎编译器会自动优化,无论重复调用多少次时间都是0。如果加上inline,一点作用也没有。是否有办法把它优化到比Java更快。