Форум программистов, компьютерный форум CyberForum.ru

Тесты для компилятора - C++

Войти
Регистрация
Восстановить пароль
 
#pragma
Временно недоступен
 Аватар для #pragma
952 / 223 / 6
Регистрация: 12.04.2009
Сообщений: 921
09.05.2009, 23:46     Тесты для компилятора #1
Есть такая задача:
Выполните какие-нибудь тесты,чтобы убедиться,что ваш компилятор создаёт эквивалентные коды для итераций по индексу и с указателем(тут говорится примерно о следующем:
C++
1
2
3
4
5
6
7
8
9
void function_using_index(char massive[])
{
      for (int i=0;massive[i]!=0;i++) use (massive[i]);
}
*******************************************************
void function_using_pointer(char massive[])
{
      for (char p*=massive;p!=0;p++) use (*p);
}
).Если у компилятора есть несколько уровней оптимизации,посмотрите,как это влияет на качество сгенерированного кода.
Какие тесты нужно/можно сделать,чтобы посмотреть на разницу?Я работаю в среде Code::Blocks,компилятор gcc версия 4.2.4.Опции оптимизации для компилятора нашёл,а где смотреть качество/скорость кода?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
09.05.2009, 23:46     Тесты для компилятора
Посмотрите здесь:

Выбор редактора + компилятора для C++ C++
указание ключа компилятора для OpenMP C++
Как разработать автоматизированные тесты для программы? C++
C++ Примеры из книги не для установленного компилятора. Что поменять?
Нарисовать квадрат на C++ (желательно для компилятора Dev C++) C++
C++ Выбор версии компилятора для онлайн проверки кода
C++ Перевод формулы понятной для компилятора
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
#pragma
Временно недоступен
 Аватар для #pragma
952 / 223 / 6
Регистрация: 12.04.2009
Сообщений: 921
08.06.2009, 21:23  [ТС]     Тесты для компилятора #2
Итак,кто нибудь может откликнуться на вопрос?Как проверить скорость работы разных версий кода?
Delphin_KKC
UNIX-way
 Аватар для Delphin_KKC
710 / 494 / 17
Регистрация: 15.01.2009
Сообщений: 1,721
08.06.2009, 21:43     Тесты для компилятора #3
Как вариант - дизассемблером разобрать экзешник и посмотреть ассемблерный код. (Эт если в асме разбираешься)
#pragma
Временно недоступен
 Аватар для #pragma
952 / 223 / 6
Регистрация: 12.04.2009
Сообщений: 921
08.06.2009, 22:08  [ТС]     Тесты для компилятора #4
К сожалению,пока не разбираюсь.
CheshireCat
Эксперт С++
2907 / 1235 / 78
Регистрация: 27.05.2008
Сообщений: 3,316
08.06.2009, 23:20     Тесты для компилятора #5
Цитата Сообщение от #pragma Посмотреть сообщение
Итак,кто нибудь может откликнуться на вопрос?Как проверить скорость работы разных версий кода?
Хм, ну вот например так (возможно, "крутить цикл" придется больше или меньше - зависит от требуемой точности....):
C++
1
2
3
4
5
6
7
8
9
const int NUM_LOOPS = 1000000;
.......
time_t start, finish;
time(&start);
for(int i = 0; i < NUM_LOOPS; ++i)
{
    // тут измеряемый кусок кода....
}
time(&finish);
#pragma
Временно недоступен
 Аватар для #pragma
952 / 223 / 6
Регистрация: 12.04.2009
Сообщений: 921
08.06.2009, 23:34  [ТС]     Тесты для компилятора #6
Прикольный "хак" а что-то всем известное,стандартное,"нормальное",есть? Не с секундомером же бегать каждый раз ))
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
09.06.2009, 00:00     Тесты для компилятора
Еще ссылки по теме:

Написание компилятора для С++ программ в блокноте C++
C++ Тесты с++ для новичков
Как изменить операторы ввода-вывода для старого компилятора C++
Написать тесты для готового проекта, используя Boost C++
Несколько воп росов по выбору компилятора для новичка C++

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
Evg
Эксперт С++Автор FAQ
 Аватар для Evg
16946 / 5351 / 329
Регистрация: 30.03.2009
Сообщений: 14,389
Записей в блоге: 26
09.06.2009, 00:00     Тесты для компилятора #7
В исходном примере "for (char p*=massive;p!=0;p++) use (*p);" - ошибочный код, правильно было бы "for (char *p=massive;*p!=0;p++) use (*p);"

Чтобы проверить скорость работы - в посте #5 тебе расписали. Только вместо time надо использовать clock (почитай по нему документацию) - он мерит "чистое" время задачи (т.е. всякие системные задержки в это время включаться не будут)

"Стандартое" - написать программу в цикле и исполняемый файл запустить через утилиту time (если ничего не путаю) - она тебе покажет время исполнения. Но это будет время исполнения всей задачи, а не твоего фрагмента. Поэтому тебе нужно свой фрагмент исполнять в цикле большое количество раз. При этом нужно уметь писать код, чтобы в результате работы оптимизаций что-то не схлопнулось. Типа того, что если напишешь в цикле "a = 3 + 5", то у тебя не будет в цикле исполняться операция сложения, а будет просто иполняться присваивание "a = 8"

Поэтому качество кода следует оценивать глазами в ассемблерном файле:

C
1
2
3
4
5
6
7
8
extern void use (char);
void function_using_index(char massive[])
{
  int i;
  asm volatile ("------------");
  for (i=0;massive[i]!=0;i++) use (massive[i]);
  asm volatile ("------------");
}
Палки нарисовал для того, чтобы ввизуально проще было бы отличить "твой" код, от того кода, который компилятор должен построить в каждой процедуре

Для данного исходника без оптимизаций:

Код
$ gcc a.c -S -o a.s
$ cat a.s
...
	------------
#NO_APP
	movl	$0, -4(%ebp)
	jmp	.L2
.L3:
	movl	-4(%ebp), %eax
	addl	8(%ebp), %eax
	movzbl	(%eax), %eax
	movsbl	%al,%eax
	movl	%eax, (%esp)
	call	use
	addl	$1, -4(%ebp)
.L2:
	movl	-4(%ebp), %eax
	addl	8(%ebp), %eax
	movzbl	(%eax), %eax
	testb	%al, %al
	jne	.L3
#APP
	------------
...
Для данного исходника с оптимизациями:

Код
$ gcc -O2 a.c -S -o a.s
$ cat a.s
...
	------------
#NO_APP
	movzbl	(%edx), %eax
	testb	%al, %al
	je	.L2
	movl	%edx, %ebx
	.p2align 4,,7
.L4:
	movsbl	%al,%eax
	movl	%eax, (%esp)
	call	use
	movzbl	1(%ebx), %eax
	addl	$1, %ebx
	testb	%al, %al
	jne	.L4
.L2:
#APP
	------------
...
Даже если не разбираешься в ассембелер, то глазками его можно посмотреть. В обоих случаях есть операция "jne", которая делает условный переход назад на метку (образуя при этом цикл). Посчитай хотя количество операций в цикле - это даст хотя бы приблизительную оценку качества кода
Yandex
Объявления
09.06.2009, 00:00     Тесты для компилятора
Ответ Создать тему
Опции темы

Текущее время: 00:41. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru