性能缓慢的自定义脚本 GAS
Slow Performance Custom Script GAS
因此,我编写了一个搜索脚本(由于缺少答案 + 提高我的技能),基本上可以完成 .indexOf 的功能。
function search(ref, data) {
var x
var y
var result = []
if (data == '' || data == null) {
} else {
for (x = 0; x < data.length; x++) {
if (data[x] == ref[0]) { //achando match inicial
var proto = [];
for (y = 0; y < ref.length; y++) {
if (data[x+y] == ref[y]) { //gravando tentativas de match completo
proto.push(data[x+y])
}
}
var proto2 = proto.join('')
if (proto2 == ref) { //testando match completo
result.push(x)
}
}
}
}
if (result == '' || result == null) {
} else {
return result[0]
}
}
它在不需要太多循环的其他小代码和自定义函数中运行良好,但是当我编写更强大的脚本时,我发现我的代码比原生 .indeOf 慢大约 3000 倍。
为什么我会产生这样的差异?
问题:
您的函数正在将 ref
中的每个字符分别与 data
字符进行比较,在一个内部循环中,将每个字符匹配推入数组 (proto
) 并使用 join
将数组转换回字符串 (proto2
),然后再与原始 ref
进行比较。
这是非常低效的,可以大大简化,所以毫无疑问这个函数比 String.prototype.indexOf().
慢得多
解决方案:
您可以改为使用单个循环,遍历 data
,并且对于每次迭代,检索长度与 ref
相同的 data
的 slice,在将此切片与 ref
进行比较之前。如果两个值都匹配,则在data
中找到了字符串ref
,并返回对应的索引:
function searchString(ref, data) {
for (let i = 0; i <= data.length - ref.length; i++) {
if (ref === data.slice(i, i + ref.length)) return i;
}
return -1;
}
使用此函数时,我得到的执行时间与 indexOf
相似。
参考:
因此,我编写了一个搜索脚本(由于缺少答案 + 提高我的技能),基本上可以完成 .indexOf 的功能。
function search(ref, data) {
var x
var y
var result = []
if (data == '' || data == null) {
} else {
for (x = 0; x < data.length; x++) {
if (data[x] == ref[0]) { //achando match inicial
var proto = [];
for (y = 0; y < ref.length; y++) {
if (data[x+y] == ref[y]) { //gravando tentativas de match completo
proto.push(data[x+y])
}
}
var proto2 = proto.join('')
if (proto2 == ref) { //testando match completo
result.push(x)
}
}
}
}
if (result == '' || result == null) {
} else {
return result[0]
}
}
它在不需要太多循环的其他小代码和自定义函数中运行良好,但是当我编写更强大的脚本时,我发现我的代码比原生 .indeOf 慢大约 3000 倍。
为什么我会产生这样的差异?
问题:
您的函数正在将 ref
中的每个字符分别与 data
字符进行比较,在一个内部循环中,将每个字符匹配推入数组 (proto
) 并使用 join
将数组转换回字符串 (proto2
),然后再与原始 ref
进行比较。
这是非常低效的,可以大大简化,所以毫无疑问这个函数比 String.prototype.indexOf().
慢得多解决方案:
您可以改为使用单个循环,遍历 data
,并且对于每次迭代,检索长度与 ref
相同的 data
的 slice,在将此切片与 ref
进行比较之前。如果两个值都匹配,则在data
中找到了字符串ref
,并返回对应的索引:
function searchString(ref, data) {
for (let i = 0; i <= data.length - ref.length; i++) {
if (ref === data.slice(i, i + ref.length)) return i;
}
return -1;
}
使用此函数时,我得到的执行时间与 indexOf
相似。