在 TI-BASIC 中优化代码真的会有所作为吗?

Does optimizing code in TI-BASIC actually make a difference?

我知道在 TI-BASIC 中,惯例是过度优化并尽可能多地节省位(我承认这很有趣)。

例如,

DelVar Z
Prompt X
If X=0
Then
    Disp "X is zero"
End                   //28 bytes

将被清理为

DelVar ZPrompt X
If not(X
    "X is zero        //20 bytes

但是以这种方式优化代码真的会有所作为吗?它明显 运行 更快或节省内存吗?

TI-BASIC是一种解释型语言,这通常意味着每一个操作都有巨大的开销。

解释型语言的工作方式是,不是将程序直接编译成 运行 直接在 CPU 上的代码,每个操作都是对解释器的函数调用,它查看什么需要完成,然后调用函数来完成这些子任务。在大多数情况下,开销是速度的一倍或两倍,并且通常也是堆栈内存使用量。但是,非堆栈的内存通常是相同的。

在上面的示例中,您执行的操作数量完全相同,这应该意味着它们 运行 完全一样快。你应该优化的是像 i = i + 1 这样的东西,它是 4 个操作到 i++ 中,它是 2 个操作。 (例如,TI-BASIC 不支持 ++ 运算符)。

这并不意味着所有操作都需要完全相同的时间,在内部,一个操作可能会调用数百个其他函数,或者它可能就像更新单个变量一样简单。解释器的程序员也可能已经实现了各种优化非常具体的语言结构的窥孔优化,例如for(int i = 0; i < count; i++) 都可以作为昂贵的解释器函数的集合来实现,这些函数的行为就好像 i 是通用的,或者它可以被优化为一个编译循环,它只需要更新变量 i并重新评估 count.

现在,并不是所有的解释型语言都注定了这种苍白的存在。比如JavaScript以前是一个,但是现在各大js引擎JIT直接在CPU.

上把代码编译成运行

更新:澄清并非所有操作都是平等的。

是的。优化您的 TI-Basic 代码会有所不同,而且这种差异比您在大多数编程语言中发现的要大得多。

在我看来,对 TI-Basic 程序最重要的优化是 size(使它们尽可能小)。这对我来说很重要,因为我的计算器上有几十个程序,而它只有 24 kB 的用户可访问 RAM。在这种情况下,真的没有必要花很多时间试图保存 space 的几个字节;相反,我只是建议学习最短和最有效的做事方式,这样当你写程序时,它们自然会趋于小。

此外, TI-Basic 程序应针对 速度 进行优化。我想到的例子包括未闭合的 For( 循环的怪癖,计算一次值而不是在循环的每次迭代中计算它(如果可能),并使用快速访问的变量,例如 Ans 和 finance 变量,只要必须多次访问变量(例如 1000+)。

第三种可能的优化是 运行 内存使用。每个循环、函数调用等都有一个开销,必须存储在内存堆栈中,以便在程序执行期间return到原始位置、计算值等。避免内存泄漏很重要(例如使用 Goto 中断循环)。

如何平衡这些优化由您决定。我更喜欢:

  1. 首先,保证我的程序中没有内存泄漏或错误嵌套的循环。
  2. 利用对程序速度影响很小或没有影响的任何大小优化。
  3. 考虑速度优化,并决定增加的速度是否值得增加程序大小。

绝对不同。我为 TI-84+CSE 编写了一个完整的彩色 RPG,让我告诉你,如果不优化我的任何代码,游戏将不会 运行。目前,在 CSE 上,Uvutu 的魔法只能 运行 如果所有其他程序都已存档且所有其他内存都超出 RAM。程序和数据存储 单独 在 RAM 中占用 20k 字节,或者在所有可用用户内存中仅占用 1kb。在使用所有变量的情况下,内存接近危险的低点。在我的开发过程中,由于优化不佳,我什至无法在不收到 "memory all gone" 错误的情况下开始游戏。我曾计划实施各种额外的东西,但由于 space 和速度问题,不可能这样做。这只是对 space.

的考虑

在速度方面,游戏在世界范围内变得很慢,现在仍然如此。与其他游戏相比,在世界各地走来走去慢得令人痛苦,那是因为我必须在该代码中做些什么;我必须检查碰撞,检查用户是否正在移动到新地图,检查他们是否按下了应该非法响应的键,检查战斗是否应该继续,等等。我能够对步行速度进行轻微的优化,但即使那样,我也可以公然告诉我已经做出了改进。它仍然非常慢(至少与我制作的所有其他端口相比),但我让它变得更容易容忍。

总而言之,根据我自己制作大型项目的经验,我可以说在 TI-Basic 中,优化代码确实有所作为。其他答案提到了这一点,但 TI-Basic 是一种解释性语言。这意味着代码不会被编译成更快、更低级别的代码,但是您放入程序中的内容会在程序执行时直接读出,由解释器解释,调用子例程和执行程序所需的其他内容命令,然后 returns 返回阅读下一行。因此,事实上 TI-84+ 系列 CPU,即 Zilog Z80,是在 1976 年设计的,你会得到一个相当慢的解释器,尤其是在这个时代。因此,您 运行 的命令越少,您就越能利用系统的怪异特性,例如 Ans 是最快的变量,也可以保存最多类型的数据(integers/floats、字符串、列表、矩阵等),您将获得更好的性能。

资料来源:我自己的经历,记录在此处:https://codewalr.us/index.php?topic=778.msg27190#msg27190

TI-84+CSE RAM 编号来自这里:https://education.ti.com/en/products/calculators/graphing-calculators/ti-84-plus-c-se?category=specifications

关于 Z80 的信息来自这里:http://segaretro.org/Zilog_Z80

视情况而定,如果它只是一个基本的数学程序,那么就没有。对于大型游戏然后是。 TI-84 只有 3.5MB 的 space 可用空间,并且具有古老的 Z80 处理器和高达 128KB 的 RAM 的组合。 TI-BASIC 也很慢,因为它被解释(查找它以获取更多信息)所以如果你制作 fast-running 游戏那么是的。优化很重要。