【问题标题】:does a replace function internally run an instr替换函数是否在内部运行一个 instr
【发布时间】:2014-07-11 03:39:04
【问题描述】:

如果我在经典 ASP 页面上执行诸如此类的操作:

if instr(tmp, "®") then tmp = replace(tmp, "®", "®")
if instr(tmp, "™") then tmp = replace(tmp, "™", "™")
if instr(tmp, "©") then tmp = replace(tmp, "©", "©")

replace 函数实际上已经在执行内部指令了吗?如果是这样,上面的代码是否应该简单地更改为:

tmp = replace(tmp, "®", "®")
tmp = replace(tmp, "™", "™")
tmp = replace(tmp, "©", "©")

什么是资源效率更高的?它们被用于各种场景,例如在 SQL 语句中包裹用户内容等......

【问题讨论】:

  • @lankymart 感谢您的时间和建议。有时候,生活并不是那么简单。对于一个非常大的全球组织,我的情况很复杂。数据库非常庞大,与之互操作的系统和进程的数量很高,而且大部分没有记录。我们正在寻找插入数据的系统阵列中的所有途径,并将解决这些潜在问题。与此同时,我们必须处理我们面前的东西和我们所看到的东西。 IMO 我的问题不仅有效而且对其他人有用。感谢您和其他好人的建议。
  • 那么您有一个大型数据库,多年来一直在输入损坏的数据?
  • 是的,没错。我是这个行业的新手,这些问题早在我之前就已经存在了。有 asp 页面、vbs 作业、批处理作业、来自其他系统(如 SAP)的数据等等。更不用说它的多语言了。 IMO您建议“删除此代码”是非常消极的(在这种情况下更不用说错误了)。如果我坐下来讨论这个问题,什么都做不了。必须替换数据。
  • 你错过了你刚才提到的点,它是多语言的,但它存储了不适合国际化的损坏数据,如果它不能处理像© 这样的简单内容,你希望如何处理更具挑战性的字符集?我已经使用多语言经典 asp 应用程序多年了,我的建议是在继续之前解决编码问题,否则你会让自己陷入痛苦的世界。你可能认为我是消极的,但老实说,你做的弊大于利。 Replace() 修复错误编码的多字节字符不是答案。
  • 对于任何关注这个的人来说,这都与 OPs 原始问题有关,这是它的一部分 - stackoverflow.com/q/24666723/692942

标签: vbscript asp-classic


【解决方案1】:

对于性能问题,最佳答案通常是基准测试。幸运的是,这种情况比较容易测试:

Option Explicit

Const testString = "Some moderately long text string. Since I don't know long the actual input is, I'm just going to write some stuff. Oh, look, it's a special character! -> ®"

' Might want to start off with a lower number like 1000 and go up from there
Const numberOfIterations = 1000000

Dim replaceTime, inStrReplaceTime
Dim notReplaceTime, notInStrReplaceTime

' When search string is found in the target string
replaceTime = TestReplace("®")
inStrReplaceTime = TestInStrReplace("®")

' When search string is NOT found in the target string
notReplaceTime = TestReplace("©")
notInStrReplaceTime = TestInStrReplace("©")

WScript.Echo "Results (seconds, lower is better):" & vbNewline & _
    "  Replace: " & replaceTime & vbNewline & _
    "  InStr + Replace: " & inStrReplaceTime & vbNewline & _
    "  Replace (not in string): " & notReplaceTime & vbNewline & _
    "  InStr + Replace (not in string): " & notInStrReplaceTime & vbNewline

Function TestReplace(str)
    Dim startTime, i, outString

    startTime = Timer

    For i = 1 To numberOfIterations
        outString = Replace(testString, str, "something")
    Next

    TestReplace = Timer - startTime
End Function

Function TestInStrReplace(str)
    Dim startTime, i, outString

    startTime = Timer

    For i = 1 To numberOfIterations
        If InStr(testString, str) <> 0 Then outString = Replace(testString, str, "something")
    Next

    TestInStrReplace = Timer - startTime
End Function

在我的机器上,这个脚本给出了输出:

Results (seconds, lower is better):
  Replace: 0.8515625
  InStr + Replace: 1.234375
  Replace (not in string): 0.6796875
  InStr + Replace (not in string): 0.3046875

这可能不是最全面的测试,但似乎哪种方法更快的答案取决于您是否希望在要替换的字符串中看到您的搜索字符串。

【讨论】:

  • 对我来说似乎是一个很好的测试。非常感谢您给我您的时间和建议,谢谢。对我来说,删除 instr 会更快,这似乎是合乎逻辑的。祝你有美好的一天
  • 这不是很明显吗? Replace() 只有在找到匹配项时才会替换,因此添加额外的 InStr() 检查总是会变慢,因为这是一个额外的调用。
  • 说实话,这并不明显。我可以做出某种假设,但是你怎么知道替换函数不会在内部执行某种 instr 过程?也许您知道一种从字面上查看 VBScript 世界中函数的底层以识别诸如此类的事物的方法。如果有,请分享?
  • @Mat41 有什么关系?,您对此很感兴趣,但这没有什么区别。我不知道Replace() 是否在内部使用InStr(),但我知道每个功能的工作是什么。这就是它显而易见的原因。
猜你喜欢
  • 1970-01-01
  • 2020-03-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-10-07
  • 1970-01-01
  • 2010-10-13
  • 1970-01-01
相关资源
最近更新 更多