通过其本质,抽象减少了程序员和系统较低层(编译器,库和运行时系统)的信息交流。有利于抽象,这通常允许较低的层假定程序员不关心任何未指定的行为,从而在提供指定的行为方面提供了更大的灵活性。
从“无关”方面获得潜在好处的一个例子是数据布局。在C(低抽象度)中,编译器在数据布局优化方面受到更多限制。即使编译器可以(例如,通过配置文件信息)识别出热/冷或错误共享避免优化将是有益的,但通常也无法应用这种优化。(在指定“好像”时有一定的自由度,即更抽象地处理规范,但是派生所有潜在的副作用给编译器增加了负担。)
更加抽象的规范对于权衡和使用方面的更改也更加健壮。在为新的系统特性或新用途重新优化程序时,较低层的约束较少。必须由程序员重写更具体的规范,或者较低层必须做出额外的努力以保证“好像”行为。
信息隐藏抽象的性能阻碍方面是“无法表达”,下层通常将其处理为“不知道”。这意味着下层必须从其他手段(例如典型的一般用途,目标用途或特定的配置文件信息)中识别出对优化有用的信息。
信息隐藏的影响也在另一个方向起作用。通过不必考虑和指定每个细节,程序员可以提高生产率,但是程序员可能对高层设计选择的影响了解较少。
另一方面,当代码更加具体(不那么抽象)时,系统的较低层可以更轻松地完成被告知要做的事情。如果代码针对其目标用途编写得当,则将非常适合其目标用途。较不抽象的语言(或编程范例)允许程序员通过详细的设计和使用信息来优化实现,这些信息不容易以给定语言传达给下层。
如前所述,当额外的程序员技能和精力可以产生有价值的结果时,较少的抽象语言(或编程技术)就很有吸引力。如果应用更多的程序员精力和技能,结果通常会更好。此外,一种语言系统在性能关键型应用程序中使用较少(而是强调开发工作或可靠性-边界检查和垃圾回收不仅与程序员的工作效率有关,而且与正确性有关,抽象可以减轻程序员的心理负担,从而可以提高可靠性)改进性能的压力将较小。
特异性也违反了不要重复自己的原则,因为通常可以通过针对特定用途定制代码来实现优化。这具有明显的可靠性和编程工作意义。
语言提供的抽象也可能包括不需要的或不必要的工作,而没有选择重量较轻的抽象的方法。尽管有时可以通过较低的层发现并删除不必要的工作(例如,可以从循环主体中提取边界检查,在某些情况下可以完全删除边界检查),但确定这是有效的优化需要付出更多的“技巧和精力”编译器。
语言的年龄和流行度也是熟练程序员的可用性以及系统较低层的质量(包括成熟的库和代码示例)的重要因素。
这种比较中的另一个混淆因素是提前编译和即时编译之间有些正交的差异。尽管即时编译可以更轻松地利用概要文件信息(不依赖程序员来提供概要文件运行)和特定于系统的优化(提前编译可能会针对更广泛的兼容性),但积极的优化开销被认为是:运行时性能的一部分。可以缓存JIT结果,从而减少了常用代码的开销。(二进制重新优化的替代方法可以提供JIT编译的一些优势,但是传统的二进制分发格式会丢弃大多数源代码信息,从而可能迫使系统尝试从特定实现中识别意图。)
(由于抽象语言偏重于程序员控制,因此它们倾向于使用提前编译。尽管链接时实现选择可以提供更好的程序员控制能力,但可以容忍安装时编译。JIT编译牺牲了重要的控制能力。 )
还有基准测试方法的问题。同样的努力/技能实际上是不可能建立的,但是即使达到了同样的努力/技能,语言目标也会使结果产生偏差。如果需要较少的最大编程时间,则与使用抽象语言的简单惯用语表达相比,使用不太抽象语言的程序甚至可能无法完全编写。如果允许较高的最大编程时间/精力,则较低抽象性的语言将具有优势。呈现最大努力结果的基准自然会偏向于使用较少抽象的语言。
有时可能会以一种不太惯用的方式用一种语言进行编程以获得其他编程范例的优势,但是即使在具有表达能力的情况下,这样做的权衡也可能不利。