Avatar ·

Warum verlangsamt das Ersetzen von 0.1f durch 0 den Code um das 10-fache in Visual Studio 2010?

Hallo zusammen! Ich programmiere in C++ in Visual Studio 2010. Ich habe eine einfache Schleife für Fließkommaberechnungen geschrieben, aber ein seltsames Verhalten bemerkt. Wenn in der Schleifenbedingung die Zahl 0.1f steht, läuft der Code schnell. Wenn ich sie durch 0 (oder eine andere ganze Zahl, z.B. 1) ersetze, sinkt die Leistung um etwa das 10-fache. Hier ist ein Beispiel:\n\n```cpp\nconst float x = 1.0f;\nfor (int i = 0; i < 100000000; ++i) {\n // Schnelle Variante: if (x < 0.1f)\n // Langsame Variante: if (x < 0)\n}\n```\n\nIch kompiliere im Release-Modus mit Optimierungen /O2. Warum dieser Unterschied? Macht der Compiler etwas falsch? Oder ist das eine Besonderheit von SSE/FPU? Ich wäre für eine Erklärung dankbar, denn ich bin ratlos. Vielen Dank im Voraus!\n<<>>\n

Ursache des Problems: denormalisierte Zahlen und die Strafe für deren Verarbeitung

\n

Der Leistungsunterschied