Einzelnen Beitrag anzeigen

Cöster

Registriert seit: 6. Jun 2006
589 Beiträge
 
Turbo Delphi für Win32
 
#1

seltsames Phänomen: mehr Operationen = weniger Rechenzeit

  Alt 3. Apr 2007, 17:11
Hi!

Mir ist was mir absolut unerkärliches aufgefallen: Ich wollte eine Schleife (252000 Durchläufe) optimieren, indem ich einen (wie ich merkte unnötigen) Sqrt-Aufruf weglasse. Die Rechenzeit für die Abarbeitung der Schleife ist allerdings anschließend von 55-57 auf 60-62 ms gestiegen. Hier erstmal die Funktion, in der ich den Sqrt-Aufruf weglassen wollte (er befindet sich in der zweiten kommentierten Zeile):

Delphi-Quellcode:
function TTriangle.GetIntersectInfo(const Ray: T3DRay): TIntersectInfo;
var
   l, m, k: Single;
begin
   // Ray.Origin + k*Ray.Direction = FPoint + l * FDirection1 + m * FDirection2
   SolveSystemOfLinearEquations(FDirection1.X, FDirection2.X, -Ray.Direction.X,
      Ray.Origin.X - FPoint.X,
      FDirection1.Y, FDirection2.Y, -Ray.Direction.Y,
      Ray.Origin.Y - FPoint.Y,
      FDirection1.Z, FDirection2.Z, -Ray.Direction.Z,
      Ray.Origin.Z - FPoint.Z,
      l, m, k);
   if not IsNaN(l) and (l >= 0) and (m >= 0) and (m + l <= 1) then
   begin
      Result.Color := FColor;
      Result.Distance := k * Sqrt(Sqr(Ray.Direction.X) + Sqr(Ray.Direction.Y) +
         Sqr(Ray.Direction.Z)); // k * Length
   end
   else
   begin
      Result.Color := clWhite;
      Result.Distance := Infinity;
   end;
end;
Ich wollte euch eigentlich einen reduzierteren Code vorlegen, bei dem sich das Gleiche zeigt. Bei der kleinsten Änderung im Code drumherum (wenn ich z.B. "1" als Parameter in der zuvor aufgerufenen Prozedur übergebe, den else-Block lösche oder eine der Bedingungen des "If"s entferne) verschwindet dieses komische Verhalten allerdings sofort wieder. Das finde ich noch komischer.

Hat einer von euch schonmal sowas ähnliches gehabt oder hat irgendeinen Ansatz einer Erklärung (oder vielleicht sogar eine vollständige Erklärung)?
  Mit Zitat antworten Zitat