Raytracing speed again, this time with gdc. -- "oops" remedied

Jascha Wetzel firstname at mainia.de
Thu Nov 8 08:22:21 PST 2007


downs wrote:
> Here we go again.
> 
> D version.
> 
> Each sample counts as 0.01 seconds.
>   %   cumulative   self              self     total
>  time   seconds   seconds    calls   s/call   s/call  name
>  73.09      5.08     5.08  6164146     0.00     0.00  void ray1.Group.intersect(inout typedef ray1.Hit, inout struct ray1.Ray, void*)
>  19.57      6.44     1.36 38551270     0.00     0.00  void ray1.Sphere.intersect(inout typedef ray1.Hit, inout struct ray1.Ray, void*)
>   3.74      6.70     0.26        1     0.26     6.88  _Dmain
>   2.59      6.88     0.18  4194304     0.00     0.00  double ray1.ray_trace(inout struct ray1.Vec, inout struct ray1.Ray, class ray1.Scene)
>   0.43      6.91     0.03                             struct gcx.Pool* gcx.Gcx.findPool(void*, void*)
>   0.14      6.92     0.01                             void* gcx.GC.mallocNoSync(uint, void*)
>   0.14      6.93     0.01                             uint gcbits.GCBits.test(uint, void*)
>   0.14      6.94     0.01                             _d_callfinalizer
>   0.14      6.95     0.01                             _d_newclass
>   0.00      6.95     0.00        1     0.00     0.00  void ray1._staticCtor1()
>   0.00      6.95     0.00        1     0.00     0.00  class ray1.Scene ray1.create(int, inout struct ray1.Vec, double)
>   0.00      6.95     0.00        1     0.00     0.00  void ray1.__modinit()
> 
> C++ version.
> 
> Each sample counts as 0.01 seconds.
>   %   cumulative   self              self     total
>  time   seconds   seconds    calls  ms/call  ms/call  name
>  76.88      4.19     4.19  6164146     0.00     0.00  Group::intersect(std::pair<double, Vec>&, Ray const&) const
>  18.35      5.19     1.00 38551282     0.00     0.00  Sphere::intersect(std::pair<double, Vec>&, Ray const&) const
>   3.30      5.37     0.18                             main
>   1.28      5.44     0.07  4194304     0.00     0.00  ray_trace(Vec const&, Ray const&, Scene const&)
>   0.18      5.45     0.01        1    10.00    10.00  create(int, Vec const&, double)
>   0.00      5.45     0.00    87381     0.00     0.00  Sphere::~Sphere()
>   0.00      5.45     0.00        1     0.00     0.00  global constructors keyed to real
>   0.00      5.45     0.00        1     0.00     0.00  __static_initialization_and_destruction_0(int, int)
>   0.00      5.45     0.00        1     0.00     0.00  Group::~Group()

in Sphere.intersect, instead of
hit = Hit(lambda, (ray.orig + lambda*ray.dir - center).unitise);
try
hit.first = lamdba;
hit.second = ...
it might not optimize away the creation on stack + copy.

now i'd look at the asm code for ray_sphere in both versions, since that 
seems to where the time is burnt.

also curious: why does the C++ version call Sphere::intersect 12 times 
more often than the D version?


More information about the Digitalmars-d-learn mailing list