我有一个运行精简版 BASIC(Parallax BASIC Stamp)的嵌入式处理器。在一个循环中,我通过 SPI 总线写入 1024 个值。
在编译语言中,通过展开循环可以获得更快的速度(将更多语句放入循环,降低开销与语句的比率)。但是,我不确定 BASIC,因为它是一种解释性语言,并且每个语句在执行之前都会被解释。
分析很困难,因为我必须找到一个可用的引脚,向它写入一个脉冲,然后用示波器进行测量。
从理论的角度来看,BASIC 中的循环展开是否提供任何速度优势?
我有一个运行精简版 BASIC(Parallax BASIC Stamp)的嵌入式处理器。在一个循环中,我通过 SPI 总线写入 1024 个值。
在编译语言中,通过展开循环可以获得更快的速度(将更多语句放入循环,降低开销与语句的比率)。但是,我不确定 BASIC,因为它是一种解释性语言,并且每个语句在执行之前都会被解释。
分析很困难,因为我必须找到一个可用的引脚,向它写入一个脉冲,然后用示波器进行测量。
从理论的角度来看,BASIC 中的循环展开是否提供任何速度优势?
理论上,循环展开减少了循环内递增和比较所花费的时间。通过减少循环开销时间,可以提高性能。
在解释程序上获得的时间量可能不如编译程序那么重要。解释器获取指令、解释(构建代码)和执行语句代码需要时间开销。为了显着节省循环展开时间,节省的时间必须大于此开销。
与微处理器不同,解释器可能不会针对执行速度进行优化。现代处理器具有高速缓存、分支预测和前瞻技术。有些甚至可以在执行其他指令时将新指令提取到缓存中。循环展开通过减少跳转次数并使执行更可预测来利用这些特性。对于编译语言,这会显着节省(对于大型迭代)。这种性能时间节省可能不适用于大多数口译员,因为他们可能不使用这些功能。
绩效改进的最佳确定是通过测量。在我的情况下,必须有足够的用户投诉来证明执行测量的时间表是合理的。