Ich vermute, dass sich Informationen über die Xbox 360 und die PS3 wie die meisten Details auf niedriger Ebene hinter Wänden befinden, die nur für Entwickler lizenziert sind. Wir können jedoch ein äquivalentes x86-Programm erstellen und es zerlegen, um eine allgemeine Vorstellung zu erhalten.
Lassen Sie uns zunächst sehen, welche Kosten für die Erweiterung ohne Vorzeichen anfallen:
unsigned char x = 1;
unsigned int y = 1;
unsigned int z;
z = x;
z = y;
Der relevante Teil zerlegt sich in (unter Verwendung von GCC 4.4.5):
z = x;
27: 0f b6 45 ff movzbl -0x1(%ebp),%eax
2b: 89 45 f4 mov %eax,-0xc(%ebp)
z = y;
2e: 8b 45 f8 mov -0x8(%ebp),%eax
31: 89 45 f4 mov %eax,-0xc(%ebp)
Also im Grunde das gleiche - in einem Fall bewegen wir ein Byte, in dem anderen bewegen wir ein Wort. Nächster:
signed char x = 1;
signed int y = 1;
signed int z;
z = x;
z = y;
Verwandelt sich in:
z = x;
11: 0f be 45 ff movsbl -0x1(%ebp),%eax
15: 89 45 f4 mov %eax,-0xc(%ebp)
z = y;
18: 8b 45 f8 mov -0x8(%ebp),%eax
1b: 89 45 f4 mov %eax,-0xc(%ebp)
Die Kosten für die Vorzeichenerweiterung sind also unabhängig von den Kosten movsbl
und nicht movzbl
- der Unteranweisungsebene. Das ist auf modernen Prozessoren aufgrund der Arbeitsweise der modernen Prozessoren im Grunde unmöglich zu quantifizieren. Alles andere, angefangen von der Speichergeschwindigkeit über das Caching bis hin zu dem, was zuvor in der Pipeline war, wird die Laufzeit dominieren.
In den ~ 10 Minuten, die ich für das Schreiben dieser Tests benötigt habe, hätte ich leicht einen echten Leistungsfehler finden können, und sobald ich eine Stufe der Compileroptimierung aktiviert habe, ist der Code für solch einfache Aufgaben nicht mehr erkennbar.
Dies ist kein Stapelüberlauf, daher hoffe ich, dass hier niemand behaupten wird, dass die Mikrooptimierung keine Rolle spielt. Spiele arbeiten oft mit sehr großen und numerischen Daten. Daher kann die sorgfältige Berücksichtigung von Verzweigungen, Besetzungen, Zeitplanung, Strukturanpassung usw. zu wichtigen Verbesserungen führen. Jeder, der viel Zeit mit der Optimierung von PPC-Code verbracht hat, hat wahrscheinlich mindestens eine Horrorgeschichte über Load-Hit-Stores. Aber in diesem Fall ist es wirklich egal. Die Speichergröße Ihres Integer-Typs wirkt sich nicht auf die Leistung aus, solange er ausgerichtet ist und in ein Register passt.