如何在Pinescript中将分辨率转换函数改为数组实现?是否能提升速度?
Pine Script:用数组实现分辨率字符串转换及性能分析
一、数组实现的写法
你之前用array.from()没成功,大概率是没结合数组查找逻辑和var关键字(避免每次调用函数都重建数组)。下面是完整的数组实现版本:
// 全局初始化键值对数组,用var确保只创建一次 var string[] resKeys = array.from('', '1', '3', '5', '15', '30', '45', '60', '120', '180', '240', '1D', '1W', '1M', '3M', '6M', '12M') var string[] resValues = array.from('', '1m', '3m', '5m', '15m', '30m', '45m', '1h', '2h', '3h', '4h', 'D', 'W', 'M', '3M', '6M', '12M') res_to_str(_res) => // 查找输入分辨率在键数组中的索引 idx = array.indexof(resKeys, _res) // 找到匹配项就返回对应值,否则返回原输入 idx != -1 ? array.get(resValues, idx) : _res
注意点:
- 用
var定义数组:Pine Script中如果不用var,每次函数调用都会重新创建数组,既浪费资源又可能出错。 - 键值数组的顺序必须严格对应:
resKeys的第N项必须和resValues的第N项一一匹配,否则转换会出错。 - 空字符串的处理已经包含在数组的第一个元素里,无需额外判断。
二、关于速度提升的问题
结论是:几乎不会有速度提升,甚至在某些场景下略慢。
原因如下:
- 你的原函数分支数量很少(17个判断),CPU逐个判断的时间可以忽略不计。
- 数组实现用的是
array.indexof(),本质是线性遍历整个数组查找匹配项,和原函数的顺序if-else判断逻辑几乎一致。如果你的常用分辨率(比如1m、1h、D)在原函数的前几个分支,原函数的判断速度反而会比数组遍历更快。 - 数组实现的优势不在于性能,而在于代码可维护性:后续要新增分辨率映射时,只需要在两个数组末尾加元素,不用写一堆else if分支。
内容的提问来源于stack exchange,提问作者Arun_K_Bhaskar
相关产品推荐
相关产品推荐

