По своей природе абстракция уменьшает обмен информацией как с программистом, так и с нижними уровнями системы (компилятором, библиотеками и системой времени выполнения). В пользу абстракции это, как правило, позволяет нижним уровням предполагать, что программист не имеет отношения к какому-либо неопределенному поведению, обеспечивая большую гибкость в предоставлении указанного поведения.
Примером потенциальной выгоды от этого аспекта «все равно» является макет данных. В C (низкая абстракция) компилятор более ограничен в оптимизации макета данных. Даже если компилятор может распознать (например, через информацию профиля), что оптимизация «горячая / холодная» или «ложное совместное использование» была бы полезной, он, как правило, не позволяет применять такую оптимизацию. (Существует некоторая свобода в определении «как будто», т. Е. В том, что спецификация рассматривается более абстрактно, но получение всех потенциальных побочных эффектов добавляет нагрузку компилятору.)
Более абстрактная спецификация также более устойчива к изменениям в компромиссах и использовании. Нижние уровни менее ограничены в повторной оптимизации программы для новых системных характеристик или новых применений. Более конкретная спецификация должна быть переписана программистом, или нижние уровни должны приложить дополнительные усилия, чтобы гарантировать «как бы» поведение.
Сдерживающим производительность аспектом абстракции, скрывающей информацию, является «не выразить», который нижние уровни обычно воспринимают как «не знаю». Это означает, что нижние уровни должны различать информацию, полезную для оптимизации, от других средств, таких как типичное общее использование, целевое использование или конкретная информация профиля.
Воздействие сокрытия информации работает и в другом направлении. Программист может быть более продуктивным, не имея необходимости рассматривать и указывать каждую деталь, но у программиста может быть меньше информации о влиянии выбора дизайна более высокого уровня.
С другой стороны, когда код более специфичен (менее абстрактен), нижние уровни системы могут более просто делать то, что им велено, как им приказано это делать. Если код хорошо написан для целевого использования, он хорошо подойдет для целевого использования. Менее абстрактный язык (или парадигма программирования) позволяет программисту оптимизировать реализацию за счет детального проектирования и использования информации, которую нелегко передать на данном языке нижним уровням.
Как уже отмечалось, менее абстрактные языки (или методы программирования) привлекательны, когда дополнительные навыки и усилия программиста могут дать достойные результаты. Если приложить больше усилий и навыков программиста, результаты, как правило, будут лучше. Кроме того, языковая система, которая используется в меньшей степени для приложений, критичных к производительности (вместо этого подчеркивается необходимость разработки или надежность - проверки границ и сборка мусора связаны не только с производительностью программиста, но и с корректностью, абстракция, уменьшающая умственную нагрузку на программиста, может повысить надежность). будет иметь меньшее давление для улучшения производительности.
Специфичность также работает против принципа «не повторяйся», потому что оптимизация обычно возможна путем адаптации кода к конкретному использованию. Это имеет очевидные последствия для надежности и программирования.
Абстракции, предоставляемые языком, также могут включать в себя нежелательную или ненужную работу без возможности выбора менее тяжелой абстракции. В то время как ненужные работы могут иногда обнаруживаться и удаляться нижними уровнями (например, проверки границ могут быть извлечены из тела цикла и полностью удалены в некоторых случаях), определение того, что такая действительная оптимизация требует больше «навыков и усилий», компилятор.
Возраст и популярность языка также являются важными факторами как доступности квалифицированных программистов, так и качества нижних уровней системы (включая зрелые библиотеки и примеры кода).
Другим смежным фактором в таких сравнениях является несколько ортогональная разница между опережающей компиляцией и компиляцией точно в срок. В то время как своевременная компиляция может более легко использовать информацию профиля (не полагаясь на то, что программист обеспечит выполнение профилей), и специфичную для системы оптимизацию (преждевременная компиляция может быть ориентирована на более широкую совместимость), издержки агрессивной оптимизации учитываются как часть производительности во время выполнения. Результаты JIT могут быть кэшированы, уменьшая накладные расходы для часто используемого кода. (Альтернатива бинарной повторной оптимизации может обеспечить некоторые преимущества компиляции JIT, но традиционные двоичные форматы распространения отбрасывают большую часть информации исходного кода, потенциально вынуждая систему пытаться отличить намерения от конкретной реализации.)
(Языки с более низкой абстракцией, поскольку они делают упор на управление программистами, предпочитают использовать заблаговременную компиляцию. Компиляция во время установки может быть допущена, хотя выбор реализации во время компоновки обеспечит больший контроль программиста. Компиляция JIT жертвует значительным контролем. )
Существует также проблема методологии сравнительного анализа. Равное усилие / умение фактически невозможно установить, но даже если это так, то можно достичь языковых целей, которые могут повлиять на результаты. Если требуется небольшое максимальное время программирования, программа для менее абстрактного языка может даже не быть полностью написанной по сравнению с простым идиоматическим выражением на более абстрактном языке. Если бы было разрешено большое максимальное время / усилие программирования, у языков с низким уровнем абстракции было бы преимущество. Тесты, представляющие лучшие результаты, естественно, будут смещены в пользу менее абстрактных языков.
Иногда возможно программировать менее идиоматическим образом на языке, чтобы получить преимущества других парадигм программирования, но даже когда выразительная сила доступна, компромиссы для этого могут быть не выгодны.