我对apl在做什么方面的效率如此有效,以至于有时被标记为胜过C。APL编译器使语言如此高效?
您不能在性能方面比较两种语言(例如C与APL(,因为性能很大程度上取决于语言和所使用的库的实现。一个平台上的同一C程序可能会很慢(读取:Windows(,在另一个平台上快速。关键是,性能几乎完全是一种给定的语言实现的属性,而不是语言本身的属性。
在APL的情况下,可以将给定操作所需的CPU周期分为两个部分:解释器顶部(构成APL程序的代币的处理(和原语(例如添加,减少等(。在大多数APL口译员中,口译员的开销很小(这意味着对该部分的优化无法获得太多的绩效(又名Amdahls Law(。在早期的APL(例如1970年(中,它是不同的。当前解释者中APL原始人的处理是在C/C 中实施,因此CPU周期的一部分与C的性能相同(再次牢记实施可能会有所作为(。
我已经在APL原始级别(从简单(整数添加(到不太简单(复杂的Arcus cosinus(和外部产品的不同标量函数以及它们的外部产品。一个令人惊讶的结果是,不同的结果是,不同的结果是不同的性能,不同的结果是不同的性能是不同的结果标量函数不是由计算函数的复杂性而主导的,而是由访问/从内存的访问时间(包括缓存(和CPU的分支预测。第二次迭代通常是第一个迭代的两倍,而SUGSESTERITARY在第四次迭代(在i5-4570 cpu上(将稳定。
测量值发生了很多波动,这使老式的性能测量值(例如,解释器X的速度是解释器y的速度是两倍(。
作为经验法则,如果您的APL程序的平均向量大小(即⍴,x(为20或更多,那么您可以完全忽略解释器的开销,而APL程序的性能大致相同程序。
APL比C更快的情况(理论上是不可能的(可以追溯到在C和APL中使用不同算法的情况。一个典型的现实生活示例是在一种情况下与hepsort进行分类,另一种情况是QuickSort。这再次是实现的差异,而不是语言本身的差异。
这是一些如何完成的示例:
-
无stackless traversal:博客
-
包装的布尔值:博客,视频
-
向量指令:视频
-
哈希数组:视频,文档
-
某些短语的特殊代码:视频
-
管道和CRC:视频
相关,这些讨论以上背后的原理:
-
根据运行时看到的数据模式选择算法以及懒惰/thunk apl如何完全跳过一些代码:Video
-
通过阅读整个简单阵列并避免通过无分支代码避免分支预测失败来寻求延迟:视频(APL与这些想法保持一致,并鼓励这些样式,比许多其他语言更容易(