Анимация
JavaScript
|
Главная Библионтека Оптимизация и эффективность Зачастую нам требуется сделать более эффективной ту или иную часть нашей профаммы, и имеется масса вариантов оптимизаций, которые могут помочь нам в этом. Время от времени появляются предположения, что использование ключевого слова const помогает компилятору при выполнении оптимизации кода. Так ли это на самом деле? Почему? Помимо const, множество программистов для повышения эффективности кода часто используют другое ключевое слово - inline. Влияет ли это слово на производительность профамм? Если да, то когда и каким образом? Когда может быть выполнено встраивание кода функции, как под контролем профаммиста, так и без него? И наконец, мы завершим этот раздел примером того, как знания предметной области помогают при разработке приложения с высокой производительностью, которой невозможно достичь никакими низкоуровневыми оптимизациями, играми с битами и другими подобными способами улучшения кода. Задача 24. Константная оптимизация Сложность: 3 Помогает ли корректное применение ключевого слова const компилятору при оптимизации кода? Обычная реакция программиста на этот вопрос: "Да, конечно!" Не будем спешить... Вопрос для новичка 1. Рассмотрим следующий исходный текст. const Y& f( const Х& X ) { ... некоторые действия с х и поиск объекта Y ... return somev; Помогает ли объявление параметра и/или возвращаемого значения с использованием const компилятору сгенерировать более оптимальный код или улучшить его каким-то иным образом? Обоснуйте ваш ответ. Вопрос для профессионала 2. Поясните, может ли в общем случае наличие или отсутствие ключевого слова const помочь компилятору улучшить генерируемый им код и почему. 3. Рассмотрим следующий исходный текст. void f( const Z 2 ) { ... Ответьте на следующие вопросы. а) При каких условиях и для каких видов классов z это конкретное указание const может помочь сгенерировать другой, лучший код? б) Говорим ли мы об оптимизации компилятором или о некотором другом типе оптимизации при условиях, рассмотренных в пункте я)? Поясните свой ответ. в) В чем состоит лучший путь достижения того же эффекта? Решение const: ненавязчивый сервис 1. Рассмотрим следующий исходный текст. Пример 24-1 const Y& fС const Х& X ) { ... некоторые действия с х и поиск объекта Y ... return somev; Помогает ли объявление параметра и/или возвращаемого значения с использованием const компилятору сгенерировать более оптимальный код или улучшить его каким-то иным образом? Коротко говоря - нет, вряд ли. Обоснуйте ваш ответ. Что же именно компилятор может улучшить? Может ли он избежать копирования аргумента или возвращаемого значения? Нет, поскольку аргумент уже передается по ссылке, и возвращаемое значение также уже является ссылкой. Может ли он разместить копию X или someY в памяти, доступной только для чтения? Нет, поскольку и х, и someY располагаются вне пределов функции и приходят в нее из "внешнего мира" и туда же возвращаются. Даже если someY динамически выделяется "на лету" в самой функции f, и сам объект, и владение им передается за пределы функции вызывающему коду. А что можно сказать о коде внутри функции f? Может ли ком пил я гор как-то улучшить генерируемый для тела функции f код на основе указаний const. Это приводит нас ко второму, более общему вопросу. 2. Поясните, может ли в общем случае наличие или отсутствие ключевого слова const помочь компилятору улучшить генерируемый им код и почему. Обращаясь вновь к примеру 24-1, становится очевидно, что здесь остается актуальной та же причина, по которой константность параметров не может привести к улучшению кода. Даже если вы вызываете константную функцию-член, компилятор не может полагаться на то, что не будут изменены биты объектов х или someY. Кроме того, имеются дополнительные проблемы (если только компилятор не выполняет глобальную оптимизацию). Компилятор может не знать, нет ли другого кода, в котором имеется неконстантная ссылка, являющаяся псевдонимом объектов х и/или somev, и не могут ли они быть случайно изменены через эту ссылку в процессе работы функции f. Компилятор может также не знать, объявлены ли реальные объекты, для которых X и someY являются простыми ссылками, как константные. Только того факта, что х и someY объявлены как const, не достаточно, чтобы их биты были физически константны. Почему? Поскольку любой класс может иметь шены, объявленные как mutable, или внутри функций-членов класса может использоваться приведение const cast. Даже код внутри самой функции f может выполнить приведение const cast либо преобразование типов в стиле С, что сведет на нет все объявления const. Есть один случай, когда ключевое слово const может действительно что-то значить, - это происходит тогда, когда объекты сделаны константными в точке их описания. В этом случае компилятор часто может поместить такие "действительно константные" объекты в память "только для чтения", в особенности если это объекты POD-, для которых их образ в памяти может быть создан в процессе ко.мпиляции и размещен в выполнимой программе. Такие объекты пригодны для размещения в ПЗУ. Как const может оптимизировать 3. Рассмотрим следующий исходный текст. Пример 24-2 void f( const z z ) { ... Ответьте на следующие вопросы. а) При каких условиях и для каких видов классов Z это конкретное указание const может помочь сгенерировать другой, лучший код? Если компилятор знает, что z - действительно константный объект, он в состоянии выполнить некоторую оптимизацию даже без глобального анализа. Например, если тело f содержит вызов наподобие g(&z), то компилятор может быть уверен, что все части z, не являющиеся mutablе, не изменятся в процессе вызова д. См, пояснения о том, что такое POD, в предыдущем разделе, на стр. 159. - Прим. перев. Задача 24. Константная оптимизация 165 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 [ 49 ] 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 |