HahaSula
先來按表操課
sula@sula-IdeaPad-U430p:~/workspace/raytracing$ gprof ./raytracing | less
Flat profile:
Each sample counts as 0.01 seconds.
% cumulative self self total
time seconds seconds calls s/call s/call name
24.01 0.66 0.66 56956357 0.00 0.00 subtract_vector
20.74 1.23 0.57 69646433 0.00 0.00 dot_product
8.73 1.47 0.24 31410180 0.00 0.00 multiply_vector
8.37 1.70 0.23 13861875 0.00 0.00 rayRectangularIntersection
8.00 1.92 0.22 10598450 0.00 0.00 normalize
5.82 2.08 0.16 17821809 0.00 0.00 cross_product
5.64 2.24 0.16 17836094 0.00 0.00 add_vector
5.09 2.38 0.14 4620625 0.00 0.00 ray_hit_object
4.00 2.49 0.11 13861875 0.00 0.00 raySphereIntersection
2.55 2.56 0.07 1048576 0.00 0.00 ray_color
1.46 2.60 0.04 4221152 0.00 0.00 multiply_vectors
1.46 2.64 0.04 1 0.04 2.75 raytracing
0.91 2.66 0.03 2110576 0.00 0.00 compute_specular_diffuse
0.91 2.69 0.03 2110576 0.00 0.00 localColor
0.73 2.71 0.02 1241598 0.00 0.00 refraction
0.36 2.72 0.01 2520791 0.00 0.00 idx_stack_top
0.36 2.73 0.01 1241598 0.00 0.00 protect_color_overflow
0.36 2.74 0.01 1241598 0.00 0.00 reflection
0.36 2.75 0.01 1048576 0.00 0.00 rayConstruction
0.18 2.75 0.01 3838091 0.00 0.00 length
於是從計算時間最多的下手
//math-toolkit.h
//before
//
//static inline
double dot_product(const double *v1, const double *v2)
{
double dp = 0.0;
for (int i = 0; i < 3; i++)
dp += v1[i] * v2[i];
return dp;
}
//after
static inline
double dot_product(const double *v1, const double *v2)
{
double dp = 0.0;
//for (int i = 0; i < 3; i++)
// dp += v1[i] * v2[i];
dp = v1[0] * v2[0] + v1[1] * v2[1] + v1[2] * v2[2] ;
return dp;
}
執行時間 0.57>>>0.26(應該多做幾次做統計比較好)
Flat profile:
Each sample counts as 0.01 seconds.
% cumulative self self total
time seconds seconds calls s/call s/call name
21.41 0.43 0.43 56956357 0.00 0.00 subtract_vector
12.94 0.69 0.26 69646433 0.00 0.00 dot_product
接著來對subtract_vector,multiply_vector,add_vector,multiply_vector下手看看
static inline
void subtract_vector(const double *a, const double *b, double *out)
{
out[0] = a[0] - b[0] ;
out[1] = a[1] - b[1] ;
out[2] = a[2] - b[2] ;
//for (int i = 0; i < 3; i++)
// out[i] = a[i] - b[i];
}
static inline
void add_vector(const double *a, const double *b, double *out)
{
out[0] = a[0] + b[0] ;
out[1] = a[1] + b[1] ;
out[2] = a[2] + b[2] ;
//for (int i = 0; i < 3; i++)
// out[i] = a[i] + b[i];
}
static inline
void subtract_vector(const double *a, const double *b, double *out)
{
out[0] = a[0] - b[0] ;
out[1] = a[1] - b[1] ;
out[2] = a[2] - b[2] ;
//for (int i = 0; i < 3; i++)
// out[i] = a[i] - b[i];
}
static inline
void multiply_vectors(const double *a, const double *b, double *out)
{
out[0] = a[0] * b[0];
out[1] = a[1] * b[1];
out[2] = a[2] * b[2];
//for (int i = 0; i < 3; i++)
// out[i] = a[i] * b[i];
}
static inline
void multiply_vector(const double *a, double b, double *out)
{
out[0] = a[0] * b;
out[1] = a[1] * b;
out[2] = a[2] * b;
//for (int i = 0; i < 3; i++)
// out[i] = a[i] * b;
}
Each sample counts as 0.01 seconds.
% cumulative self self total
time seconds seconds calls s/call s/call name
15.14 0.23 0.23 69646433 0.00 0.00 dot_product
13.17 0.43 0.20 56956357 0.00 0.00 subtract_vector
11.19 0.60 0.17 10598450 0.00 0.00 normalize
9.22 0.74 0.14 4620625 0.00 0.00 ray_hit_object
7.90 0.86 0.12 13861875 0.00 0.00 raySphereIntersection
7.24 0.97 0.11 13861875 0.00 0.00 rayRectangularIntersection
6.25 1.07 0.10 17821809 0.00 0.00 cross_product
4.61 1.14 0.07 1 0.07 1.51 raytracing
4.28 1.20 0.07 4221152 0.00 0.00 multiply_vectors
3.95 1.26 0.06 31410180 0.00 0.00 multiply_vector