重新审视原始人

时间:2014-04-12 02:10:26

标签: performance primitive forth

我很清楚Stack Overflow问题 What are the primitive Forth operators? ,但它并没有真正解决我的问题。我不是寻找 minimal 而是实际原语集。

最近我遇到了一个问题,需要经常对大型数组进行排序,性能变得至关重要。一个naive qsort基准测试为20.移植一个重度(算法)优化的STL版本获得我的基准16. Native C ++从基准测试3中嘲笑我。好吧。

最后,我点了一颗子弹并实施了EXCH ( a1 a2 -- a1 a2 )和非破坏性比较( n1 n2 -- n1 n2 flag )作为基元。结果令人惊讶 - 性能提升三倍。仍然不是C ++,但更接近。

为什么没有标准Forth将它们开箱即用?

PS:基准(执行时间,nsec)/(n log n)

2 个答案:

答案 0 :(得分:2)

我怀疑EXCH不是标准Forth的一部分,因为它很晦涩,如果你需要的话,你可能最好自己编写。

我认为非破坏性比较会被视为违反Forth的一般原则,特别是单词应该消耗他们的论据。如果你想保留你必须明确创建副本的参数。

我对实现的了解不足以说明它对性能有何影响,但对大多数应用程序而言

: non-destructive-> 2dup > ;

会有意义并且运作良好。

我意识到这是一个有点回避的答案,但我怀疑是这样的,因为根据我所读到的,应该构成标准Forth的背后的选择并不是为了优化执行速度。

答案 1 :(得分:2)

此类变化的影响在很大程度上取决于您的Forth系统的质量。显然编译器越糟糕,经过深思熟虑的改变就越有效。另一方面,更难以削减4个循环,而不是10个循环的40个。这意味着在某些时候高级重写不再付出代价(除非你是编译器编写者:-)

当然可以尝试使用多线程和特殊CPU指令的技巧。

要了解您的位置,如果您能在真实系统上提供实际代码和时间,将会很有帮助。