在实现大多数算法(排序、搜索、图遍历等)时,通常可以在减少内存访问方面做出权衡,但代价是额外的普通操作。
Knuth 有一个有用的方法来比较各种算法实现的复杂性,方法是将其从特定处理器中抽象出来,并且只区分普通操作 (oops) 和内存操作 (mems)。
在已编译的程序中,通常让编译器组织低级操作,并希望操作系统能够处理数据是保存在高速缓存中(更快)还是虚拟内存中(更慢)的问题。此外,编译器封装了指令的确切数量/成本。
使用 Forth,不再有这样的封装,而且更接近机器,尽管可能更接近在寄存器处理器之上运行的堆栈机器。
忽略操作系统的影响(因此没有内存停顿等),并假设目前是一个简单的处理器,
(1) 谁能建议 Forth 中的普通堆栈操作(例如 dup、rot、over、swap 等)与 Forth 的内存访问 fetch (@) 或 store (!) 的成本相比如何?
(2) 是否有一个经验法则可以用来决定有多少普通操作来权衡保存内存访问?
我正在寻找的是“内存访问成本高达 50 个普通操作,或 500 个普通操作,或 5 个普通操作”之类的东西,Ballpark 绝对没问题。
我试图了解 fetch 和 store 与 rot、swap、dup、drop、over、正确到一个数量级的相对成本。