Скорость работы защищённого режима Эльбрус. Наивный тест.

Начнём с наивного сравнения скорости заполнения массива целых чисел размером в 1 миллион ячеек.

Так как защищённый режим влияет на работу с памятью, логично тестировать в первую очередь обращения к ней.

Для удобства дальнейшей работы определим макрос для проверки текущего режима выполнения программы.

protected_utils.h

#define E2K_PROTECTED_MODE sizeof(void*) == 16

protected_benchmark.c

#include <stdio.h>
#include <time.h>
#include <sys/time.h>
#include <stdint.h>
#include "protected_utils.h"

void main() {
    int sizeOfArray = 1000000;
    int numberOfRuns = 50;

    unsigned long accumulatedDuration = 0;

    for(int retry = 0; retry < numberOfRuns; retry++) {
        struct timeval timestampBegin;
        gettimeofday(&timestampBegin, NULL);

        int x[sizeOfArray];
        for(int i = 0; i < sizeOfArray; i++ ) {
            x[i] = i;
        }

        struct timeval timestampEnd;
        gettimeofday(&timestampEnd, NULL);

        unsigned long timeInterval = 1000000 * (timestampEnd.tv_sec - timestampBegin.tv_sec) +
        timestampEnd.tv_usec - timestampBegin.tv_usec;
        accumulatedDuration += timeInterval;
    }

    printf("Array assignment benchmark executed in: %lu\n", accumulatedDuration / (unsigned long)numberOfRuns);
    if(E2K_PROTECTED_MODE) {
        printf("Benchmark executed in protected mode.\n");
    } else {
        printf("Benchmark executed in non-protected mode.\n");
    }
}

Обычный режим:

Array assignment benchmark executed in: 10071
Benchmark executed in non-protected mode.

Что интересно, в обычном режиме многократный запуск теста практически не влияет на результаты, разброс в пределах 0.6%

Защищённый режим:

Array assignment benchmark executed in: 19899
Benchmark executed in protected mode.

Однако, многократный запуск даёт разброс вплоть до 23057, что составляет разницу в целых 15%.

Если сравнивать минимальные результаты, то на таком наивном тесте без оптимизаций защищенный режим медленнее обычного на 98%.

Скомпилируем наш пример с оптимизацией О3.

Обычный режим.

Array assignment benchmark executed in: 507
Benchmark executed in non-protected mode.

Защищённый режим.

Array assignment benchmark executed in: 5322
Benchmark executed in protected mode.

При этом в защищённом режиме практически пропал разброс результатов между запусками, но он стал на 950% медленнее обычного.

Пока сложно сказать, что именно вызывает такую разницу - плохие оптимизации lcc в режиме m128 или физические ограничения защищённого режима на уровне процессора.