Я пишу компилятор (больше для развлечения, чем для чего-либо еще), но я хочу попытаться сделать его максимально эффективным. Например, мне сказали, что в архитектуре Intel использование любого регистра, кроме EAX
для выполнения математических вычислений, влечет за собой затраты (предположительно, потому что он заменяется на EAX
для выполнения фактической части математики) . Вот по крайней мере один источник, который заявляет о возможности (http://www.swansontec.com/sregisters.html).
Я хотел бы проверить и измерить эти различия в характеристиках производительности. Таким образом, я написал эту программу на C ++:
#include "stdafx.h"
#include <intrin.h>
#include <iostream>
using namespace std;
int _tmain(int argc, _TCHAR* argv[])
{
__int64 startval;
__int64 stopval;
unsigned int value; // Keep the value to keep from it being optomized out
startval = __rdtsc(); // Get the CPU Tick Counter using assembly RDTSC opcode
// Simple Math: a = (a << 3) + 0x0054E9
_asm {
mov ebx, 0x1E532 // Seed
shl ebx, 3
add ebx, 0x0054E9
mov value, ebx
}
stopval = __rdtsc();
__int64 val = (stopval - startval);
cout << "Result: " << value << " -> " << val << endl;
int i;
cin >> i;
return 0;
}
Я пробовал эту замену кода eax
и ebx
, но я не получил "стабильного" числа. Я надеюсь, что тест будет детерминированным (каждый раз одно и то же число), потому что он настолько короткий, что во время теста вряд ли произойдет переключение контекста. В настоящее время статистической разницы нет, но число колеблется настолько сильно, что сделать такое определение было бы невозможно. Даже если я возьму большое количество образцов, их число все равно будет невозможно варьировать.
Я также хотел бы протестировать xor eax, eax
vs mov eax, 0
, но у меня есть та же проблема.
Есть ли способ провести такие тесты производительности в Windows (или где-либо еще)? Когда я программировал Z80 для своего TI-Calc У меня был инструмент, с помощью которого я мог выбрать некоторую сборку, и он сообщал мне, сколько тактовых циклов для выполнения кода - разве это не может быть сделано с нашими новыми современными процессорами?
EDIT: Есть много ответов указывает на выполнение цикла миллион раз. Чтобы уточнить, это на самом деле только усугубляет ситуацию. ЦП с большей вероятностью переключит контекст, и тест будет касаться всего, кроме того, что я тестирую.