Начнём с наивного сравнения скорости заполнения массива целых чисел размером в 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(×tampBegin, NULL);
int x[sizeOfArray];
for(int i = 0; i < sizeOfArray; i++ ) {
x[i] = i;
}
struct timeval timestampEnd;
gettimeofday(×tampEnd, 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 или физические ограничения защищённого режима на уровне процессора.