БлогNot. Компиляция Small и Large - что быстрее? :)

Компиляция Small и Large - что быстрее? :)

И так ясно, что Small, но в учебных целях проверим. На примере старенького учебного компилятора Borland C++ 3.1 посмотрим, как выбор модели компиляции может влиять на быстродействие программы. Конечно, для чистоты эксперимента его бы следовало проводить на 8- или 16-разрядном процессоре, но где теперь такой возьмёшь :)

Для этого напишем собственную функцию определения длины строки my_strlen и сравним её работу со стандартной strlen из библиотеки string.h. Время работы функций будем "засекать" с помощью стандартного метода time из библиотеки bios.h:

#include <stdio.h>
#include <string.h>
#include <bios.h>

int my_strlen (char *s) {
 int len=0;
 while (*s++) len++;
 return len;
}

void main () {
 long t1,t2;
 unsigned len;
 char *s="Hello";
 t1=biostime(0,0);
 for (long int l=0; l<1e7; l++) len=my_strlen(s);
 t2=biostime(0,0);
 printf ("\nmy  len=%d, my  time=%6.2lf",len,(double)(t2-t1)/18.2);

 t1=biostime(0,0);
 for (l=0; l<1e7; l++) len=strlen(s);
 t2=biostime(0,0);
 printf ("\nhis len=%d, his time=%6.2lf",len,(double)(t2-t1)/18.2);

 getchar();
}

При модели памяти Small и выключённой опции Automatic far data выполняем 10 000 000 повторений цикла и видим, что наша функция работает быстрее стандартной:

my  len=5, my  time=  0.33
his len=5, his time=  0.44

Ставим модель памяти Large и собираем проект заново, получается вот что:

my  len=5, my  time=  0.88
his len=5, his time=  0.49

Оставляем модель Large, но дополнительно включаем опцию компилятора опцию Automatic far data (все указатели автоматически делаются "длинными"):

my  len=5, my  time=  0.88
his len=5, his time=  0.44

То есть, ничего не изменилось. Следует понимать, что доверять этим данным можно с точностью не выше 0.05 сек., так как таймер BIOS, которым мы здесь пользуемся, обновлется 18.2 раза в секунду. Поэтому 0.49 сек. при некоторых запусках может превращаться в 0.44 и наоборот.

Но тенденция очевидна - "прямая" работа с указателями быстрее работает в Small, а вот быстродействие стандартных функций не меняется - они-то работают с "длинными" указателями :)

16.11.2011, 14:58 [10282 просмотра]


теги: программирование c++ время

К этой статье пока нет комментариев, Ваш будет первым