Переключенный компилятор - производительность упала - пытаясь понять, почему - PullRequest
2 голосов
/ 08 марта 2012

Я пишу расширение Ruby C, которое вычисляет «мягкий выбор» набора вершин. Во многих итерациях вычисляется расстояние между 3d-точками.

Изначально я использовал Pelles C IDE - на основе найденного мной шаблона.

Затем я сделал обновление, в котором переключился на использование nmake, поставляемое с Visual Studio C ++ Express 2010. Я обнаружил снижение производительности, что было странно, потому что в любом случае это должно было быть быстрее.

Затем я вернулся к исходному коду, который я написал в Pelles C, скомпилировал его с nmake и обнаружил, что точно такой же код медленнее.

Pelles C

> Updating soft selection took 0.741 seconds (12176 of 21692 Vertices)
> Updating soft selection took 0.751 seconds (10911 of 21692 Vertices)
> Updating soft selection took 0.859 seconds (10765 of 21692 Vertices)
> Updating soft selection took 0.753 seconds (10653 of 21692 Vertices)
> Updating soft selection took 0.75 seconds (10747 of 21692 Vertices)
> Updating soft selection took 0.751 seconds (10822 of 21692 Vertices)

Visual Studio

> Updating soft selection took 1.282 seconds (11853 of 21692 Vertices)
> Updating soft selection took 1.273 seconds (12204 of 21692 Vertices)
> Updating soft selection took 1.286 seconds (11720 of 21692 Vertices)
> Updating soft selection took 1.248 seconds (12996 of 21692 Vertices)
> Updating soft selection took 1.293 seconds (10705 of 21692 Vertices)
> Updating soft selection took 1.276 seconds (12204 of 21692 Vertices)

Я очень неопытен в C и компиляции - но я предполагаю, что разница в производительности связана с различиями между компилятором и инструкциями по компиляции?

Для версии nmake я использовал Makefile, созданный extconf.rb - для версии Pelles C я использовал любую настройку для примера проекта, который нашел.

Прав ли я в том, что здесь важны CFLAGS?

CFLAGS

Для проекта Pelles C это: CCFLAGS = -Tx86-coff -MD -Ot -Ox -W1 -Gd -Ze -Zl#

Для проекта nmake это: CFLAGS = -MD -Zi -O2b2xg- -G6

Когда я смотрел CFLAGS и производительность, он обычно упоминал флаги O, O2 и O3 - теперь я вижу O2 в nmake Makefile, но с нечетным набором трейлинга символы.

Проект Pelles C имеет Ot и Ox ...?

Я не смог понять значение этого. Расширение будет скомпилировано под Windows и OSX (PPC и Intel). Какую конфигурацию компилятора я могу сделать, чтобы получить максимальную производительность от него? По крайней мере, восстановить производительность, которую я имел.

Конфигурация Makefile и Pelles C

Вот Pastie из nmake Makefile: http://pastie.org/3543595

Вот файл проекта Pastie of the Pelles C: http://pastie.org/3543597

1 Ответ

4 голосов
/ 08 марта 2012

Хорошо, я искал информацию.Я узнал, что параметры CFLAGS зависят от компилятора.

Я нашел параметры для компилятора MS * cl: http://msdn.microsoft.com/en-us/library/fwkeyyhe%28v=vs.80%29.aspx

Я сравнил их с параметрами, задокументированными в Pelles.Файл справки C.

Перекомпилирован с этими CFLAGS: $CFLAGS = '-MD -Ot -Ox -W1'

Результаты производительности после перекомпиляции:

> Updating soft selection took 0.679 seconds (12032 of 21692 Vertices)
> Updating soft selection took 0.607 seconds (13470 of 21692 Vertices)
> Updating soft selection took 0.717 seconds (13587 of 21692 Vertices)
> Updating soft selection took 0.613 seconds (13218 of 21692 Vertices)
> Updating soft selection took 0.635 seconds (9964 of 21692 Vertices)
> Updating soft selection took 0.746 seconds (10765 of 21692 Vertices)

Voilà!Производительность восстановлена ​​- даже выглядит немного быстрее.: D

Даже избавился от предупреждения о неизвестной опции -G6 и некоторых других устаревших флагах.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...