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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
#pragma
Временно недоступен
952 / 223 / 6
Регистрация: 12.04.2009
Сообщений: 921
#1

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

09.05.2009, 23:46. Просмотров 989. Ответов 6
Метки нет (Все метки)

Есть такая задача:
Выполните какие-нибудь тесты,чтобы убедиться,что ваш компилятор создаёт эквивалентные коды для итераций по индексу и с указателем(тут говорится примерно о следующем:
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++ - C++
Здравствуйте! Посмотрел темы про редакторы - нужного не нашел. Нужен какой-нибудь нормальный редактор с интегрированным...

Перевод формулы понятной для компилятора - C++
С половиной справился, но каким образом записать крайнюю левую переменную. Формулу прикрепил. Это вроде нужно отдельной функцией как то...

указание ключа компилятора для OpenMP - C++
смотрю на сайте http://edu.chpc.ru/parallel/mainse4.html Для использования механизмов OpenMP нужно скомпилировать программу компилятором,...

Написание компилятора для С++ программ в блокноте - C++
Приветствую. Такой вопрос, можно ли написать bat файл который являлся бы компилятором для С++(нормальные среды разработки у меня есть,...

Нарисовать квадрат на C++ (желательно для компилятора Dev C++) - C++
Всем привет! Надо нарисовать квадрат размером 20 на 20 пикселей красного цвета с координатами x - 100, y - 200 в окне размером 300 на 500...

Как разработать автоматизированные тесты для программы? - C++
В программе есть класс, он имеет несколько методов. Один метод принимает массив данных, другой изменяет его, третий выводит значения на...

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
#pragma
Временно недоступен
952 / 223 / 6
Регистрация: 12.04.2009
Сообщений: 921
08.06.2009, 21:23  [ТС]     Тесты для компилятора #2
Итак,кто нибудь может откликнуться на вопрос?Как проверить скорость работы разных версий кода?
Delphin_KKC
UNIX-way
709 / 494 / 17
Регистрация: 15.01.2009
Сообщений: 1,721
08.06.2009, 21:43     Тесты для компилятора #3
Как вариант - дизассемблером разобрать экзешник и посмотреть ассемблерный код. (Эт если в асме разбираешься)
#pragma
Временно недоступен
952 / 223 / 6
Регистрация: 12.04.2009
Сообщений: 921
08.06.2009, 22:08  [ТС]     Тесты для компилятора #4
К сожалению,пока не разбираюсь.
CheshireCat
Эксперт С++
2892 / 1241 / 78
Регистрация: 27.05.2008
Сообщений: 3,363
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
Временно недоступен
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++ , &quot;Visuаl Studio 2008&quot;! Я сейчас книгу выбрал себе Дейтела,но даже начальные его примеры не...

Выбор версии компилятора для онлайн проверки кода - C++
Написал простую программку для теста на С++ в Microsoft Visual Studio Express 2012, в тесте просят указать язык: GNU C++ 4.9, GNU C++...

Несколько воп росов по выбору компилятора для новичка - C++
привет в borland 6 при создании консольного файла выдает что нужны обязательные библиотеки аж две, выбираешь одну, но даже в простейших...

Написать тесты для готового проекта, используя Boost - C++
Ребята. привет. У меня есть один готовый проект и надо его протестировать. Проект в Visual Studiо, собран с Cmake. И вот теперь...

Как изменить операторы ввода-вывода для старого компилятора - C++
Здравствуйте. Мне надо написать прогммы. Но к моему сожалению, то что я пишу дома, не подходит для компьютеров в моем иснтитуте. Вернее, я...


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

Или воспользуйтесь поиском по форуму:
Evg
Эксперт CАвтор FAQ
17533 / 5771 / 369
Регистрация: 30.03.2009
Сообщений: 15,874
Записей в блоге: 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     Тесты для компилятора
Ответ Создать тему
Опции темы

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