我使用 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 文件的工具。