1

我很清楚 Stack Overflow 问题什么是原始 Forth 运算符?,但它并没有真正解决我的问题。我不是在寻找最小的而是实用的原语集。

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

最后,我咬紧牙关,EXCH ( a1 a2 -- a1 a2 )将非破坏性比较( n1 n2 -- n1 n2 flag )作为基元实现。结果是惊人的——性能提升了三倍。仍然不是 C++,但更接近。

为什么标准的 Forth 没有开箱即用?

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

4

2 回答 2

2

我怀疑这EXCH不是标准 Forth 的一部分,仅仅是因为它太晦涩难懂,如果需要,最好自己编写。

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

我对实现知之甚少,无法说出它对性能的影响,但对于大多数应用程序

: non-destructive-> 2dup > ;

会很有意义并且工作得很好。

我意识到这是一个略微回避的答案,但我怀疑是这样的,因为从我所阅读的内容来看,哪些词应该构成标准 Forth 的选择并不是为了优化执行速度。

于 2014-04-14T16:09:35.453 回答
2

此类更改的效果在很大程度上取决于您的 Forth 系统的质量。显然,编译器越差,经过深思熟虑的更改就会产生越多的效果。另一方面,减少 4 个周期的 1 个周期比 40 个周期的 10 个周期更难。这意味着在某些时候高级重写不再有回报(除非您是编译器编写者 :-)

当然,人们可能会尝试使用多线程和特殊 CPU 指令的技巧。

要查看您所在的位置,如果您可以在真实系统上提供实际代码和时序,将会很有帮助。

于 2014-06-22T22:02:17.813 回答