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)?