Я підозрюю, що інформація про Xbox 360 та PS3 конкретно збирається за стінами, що мають лише ліцензійні розробники, як і більшість деталей низького рівня. Однак ми можемо побудувати еквівалентну програму x86 і розібрати її, щоб отримати загальне уявлення.
По-перше, давайте подивимося, що коштує безпідписане розширення:
unsigned char x = 1;
unsigned int y = 1;
unsigned int z;
z = x;
z = y;
Відповідна частина розбирається на (використовуючи 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)
Так що в основному те саме - в одному випадку ми переміщуємо байт, в іншому переміщуємо слово. Далі:
signed char x = 1;
signed int y = 1;
signed int z;
z = x;
z = y;
Перетворюється на:
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)
Таким чином, вартість розширення знаку - це будь-яка вартість, movsbl
а не movzbl
- рівень підказі. Це в принципі неможливо кількісно оцінити на сучасних процесорах через спосіб роботи сучасних процесорів. Все інше, починаючи від швидкості пам’яті до кешування до того, що раніше було в конвеєрі, буде домінувати у процесі виконання.
За десять хвилин мені знадобилося написати ці тести, я міг легко знайти справжню помилку продуктивності, і як тільки я включаю будь-який рівень оптимізації компілятора, код стає невпізнанним для таких простих завдань.
Це не переповнення стека, тому я сподіваюся, що тут ніхто не буде заявляти, що мікрооптимізація не має значення. Ігри часто працюють на дуже великих і дуже чисельних даних, тому ретельна увага до розгалуження, кастингу, планування, вирівнювання структури тощо може дати дуже критичні покращення. Кожен, хто витратив багато часу на оптимізацію коду PPC, мабуть, має принаймні одну історію жахів про завантаження магазинів. Але в цьому випадку це насправді не має значення. Розмір пам’яті вашого цілого типу не впливає на продуктивність, якщо він вирівняний і вписується в реєстр.