我很清楚Stack Overflow问题什么是基元Forth运算符,但这并不能真正解决我的问题。我不是在寻找最小,而是实用基元集。
最近,我遇到了一个问题,需要频繁地对相当大的数组进行排序,性能变得至关重要。天真的qsort以20分为基准。移植一个经过严格(算法)优化的STL版本可以获得基准测试16。Native C++在基准测试3中嘲笑我。哦,好吧。
最后,我实现了EXCH ( a1 a2 -- a1 a2 )
,并将( n1 n2 -- n1 n2 flag )
作为基元进行了无损比较。结果是惊人的——性能提高了三倍。仍然不是C++,但更接近。
为什么标准福斯没有开箱即用?
PS:基准是(执行时间,nsec)/(n log n)
此类更改的效果在很大程度上取决于Forth系统的质量。显然,编译器越糟糕,经过深思熟虑的更改效果就越好。另一方面,剃掉4的1个周期比剃掉40的10个周期更困难。这意味着在某种程度上,高级重写不再有回报(除非你是一名编译器编写者:-)
当然,多线程和特殊CPU指令也有一些技巧可以尝试。
为了了解您所处的位置,如果您能够在真实的系统上提供实际的代码和时间安排,那将非常有帮助。
我怀疑EXCH
不是标准Forth的一部分,因为它足够模糊,如果需要的话,你最好自己写。
我可以想象,非破坏性的比较会被视为违反福斯的一般原则,特别是文字应该消耗他们的论点。如果你想保留这些参数,你必须显式地创建一个副本。
我对实现的了解还不足以说明它对性能的影响,但对于大多数应用程序来说,
: non-destructive-> 2dup > ;
会很有意义,而且效果很好。
我意识到这是一个有点含糊其辞的答案,但我怀疑是这样的,因为从我所读到的内容来看,选择哪些单词应该构成标准Forth并不是为了优化执行速度。