Настройка производительности сборки

Я пишу компилятор (больше для развлечения, чем для чего-либо еще), но я хочу попытаться сделать его максимально эффективным. Например, мне сказали, что в архитектуре 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: Есть много ответов указывает на выполнение цикла миллион раз. Чтобы уточнить, это на самом деле только усугубляет ситуацию. ЦП с большей вероятностью переключит контекст, и тест будет касаться всего, кроме того, что я тестирую.

9
задан Nate Zaugg 30 June 2011 в 20:25
поделиться