proxy.pac 文件性能优化

proxy.pac 文件性能优化

我使用 proxy.pac 文件通过代理重新路由某些网站。

它基本上看起来像这样:

if (shExpMatch(host, "www.youtube.com"))
    { return "PROXY proxy.domain.tld:8080; DIRECT" }
if (shExpMatch(host, "youtube.com"))
    { return "PROXY proxy.domain.tld:8080; DIRECT" }

目前,大约有 125 个网站使用此方法重新路由。但是,我计划在其中添加更多域名,我猜最终会有一个包含 500-1000 个域名的列表。

不要通过代理重新路由所有流量,这一点很重要。

从性能角度来看,保持此文件优化的最佳方法是什么?

谢谢

答案1

与往常一样:哈希或树。

我会使用散列:提取请求的域名的第一个字符(或多个字符)(同时剥离“www.”)来选择相应的模式列表。

答案2

如果您只是检查是否相等,请使用“==”进行比较。shExpMatch 函数允许使用 shell 表达式(* 和 ? 代表 DOS shell 含义),因此必须解析第二个参数。该脚本在浏览器中运行,每次请求运行一次(或更少),因此性能不是问题,但如果您写下您的意思,它会使代码更清晰。

我还会使用变量来保存代理表达式。它可能不会节省运行时存储,因为重复的文字可能会被重复使用,但它会使代码更易于阅读。

答案3

我认为性能取决于使用 .pac 文件的浏览器/程序,但你可以找到一些最佳实践这里其中包括:

  • 文件执行的速度取决于 PAC 文件中参数的构造方式,而不是文件的总长度。PAC 文件按顺序执行命令。因此:
    • 不要使用过多的排除功能,因为这可能会导致速度缓慢。
    • 将很可能被执行的参数或异常放在文件开头。例如,私有 IP 地址查找应该放在开头。
  • 避免使用复杂的正则表达式来缩小 PAC 文件。这会降低其效率。
  • 首先检查简单规则例外。
  • 将高概率的检查放在顶部附近。
  • 尽量减少使用正则表达式。
  • 使用高效的正则表达式,避免捕获不会使用的匹配。
  • 由于返回是立即的,因此避免使用别的如果陣容 註釋 .
  • 单行 if() 语句不需要 begin { 和 end } 括号。
  • 由于潜在的 DNS 性能问题,请仔细考虑 isResolvable()、dnsResolve() 和 isInNet() 的使用(过度使用)。
  • 尝试将类似的异常分组到更大的 if 循环中。例如,不要在一个大的 OR 语句中检查 10 个包含 xyz.google.com 的主机,而是将其转换为一个外部 if 语句,该语句在主机包含 *.google.com 时应用,然后针对这 10 个主机进行测试。
  • 在单独的 if 循环中检查 IP 地址。
  • 每个左花括号必须有一个对应的右花括号,每个左圆括号必须有一个对应的右圆括号。在构建 PAC 文件时,最常见的错误之一是忘记计算左圆括号和右圆括号的数量。
  • 避免使用外部或全局变量和函数。

此外,还有一个http://pacparser.manugarg.com/可用于验证.pac 文件的工具。

相关内容