Podejrzewam, że informacje o konsolach Xbox 360 i PS3 będą znajdować się za ścianami tylko dla licencjonowanych programistów, podobnie jak większość szczegółów niskiego poziomu. Możemy jednak zbudować równoważny program x86 i go zdemontować, aby uzyskać ogólny pomysł.
Najpierw zobaczmy, jakie koszty rozszerzenia bez podpisu:
unsigned char x = 1;
unsigned int y = 1;
unsigned int z;
z = x;
z = y;
Odpowiednia część rozkłada się na (za pomocą 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)
Więc w zasadzie to samo - w jednym przypadku przenosimy bajt, w drugim przenosimy słowo. Kolejny:
signed char x = 1;
signed int y = 1;
signed int z;
z = x;
z = y;
Zamienia się w:
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)
Koszt rozszerzenia znaku jest więc niezależnie od kosztu, movsbl
a nie movzbl
- poziomu podinstrukcji. Zasadniczo jest to niemożliwe do oszacowania na nowoczesnych procesorach ze względu na sposób, w jaki działają nowoczesne procesory. Wszystko inne, od szybkości pamięci do buforowania do tego, co było wcześniej w potoku, zdominuje środowisko uruchomieniowe.
W ciągu ~ 10 minut, które zajęło mi napisanie tych testów, mogłem łatwo znaleźć prawdziwy błąd wydajności, a gdy tylko włączę dowolny poziom optymalizacji kompilatora, kod staje się nierozpoznawalny dla tak prostych zadań.
To nie jest przepełnienie stosu, więc mam nadzieję, że nikt tutaj nie twierdzi, że mikrooptymalizacja nie ma znaczenia. Gry często działają na danych, które są bardzo duże i bardzo liczbowe, więc uważna uwaga na rozgałęzienia, rzutowania, harmonogramowanie, wyrównanie struktury itd. Może dać bardzo krytyczne ulepszenia. Każdy, kto spędził dużo czasu na optymalizacji kodu PPC, prawdopodobnie ma co najmniej jedną horror o sklepach z ładowaniem hitów. Ale w tym przypadku to naprawdę nie ma znaczenia. Rozmiar pamięci typu liczb całkowitych nie wpływa na wydajność, o ile jest wyrównany i mieści się w rejestrze.