С-программистское

13 июнь, 2008 - 17:20Андрей Зубинский

1. Всем программистам рекомендую настоятельно маленький (меньше 100 KB) pdf-файлик - Феликс фон Лейтнер, "Оптимизация [на уровне] исходных кодов".

Фактически это сборник примеров реакций нескольких самых ходовых компиляторов (свежих) на разные фрагменты кода и приёмы, часто испольуземые программистами. Компиляторы - GCC 4.3, Sun C 5.9, Intel C и MSVC 2008.

В целом получается очевидное - элита программирования (разработчики компиляторов) потому и элита, что много грамотнее многих обычных программистов-прикладников. Ну а задачи оптимизации исходного кода, похоже, сейчас ограничиваются умелым и эффективным использованием иерархии памяти - разные трюки и традиционные приёмы дают несоизмеримо меньший эффект. Например, замена умножения операцией сдвига позволяет выиграть всего несколько машинных тактов, а вот неверно выбранные структуры данных и объем данных обеспечивают проигрыш 250 тактов при каждом обращении к непопавшим в кэш-память данным.

Выводы самого фон Лейтнера лаконичны:

- если вы оптимизируете код, тестируйте его производительность на реальных данных;

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

2. Отыскался ещё изящный прием (точнее даже идиома) комментирования кода, правда, головоломный и небезопасный в том смысле, что визуально плохо воспринимается. В общем, - одним символом включать-выключать кусок исходного текста можно так:

фрагмент выключен из кода

/*

фрагмент_A

// */

фрагмент включен, если в начало первой строки добавить один символ "/"

//*

фрагмент_A

// */

Можно обойтись без стилевой смеси С/C++ комментариев (хоть она и разрешена новыми стандартами C), и получить даже более читабельный код:

фрагмент выключен из исходного текста:

/* /

фрагмент_A

/**/

фрагмент включен в исходный текст:

/**/

фрагмент_A

/**/

3. Опасности трамбовки типов (type punning).