Я перенаправляю определенные веб-сайты через прокси с файлом 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 доменов.
Важно не перенаправлять весь трафик через прокси.
Как лучше всего оптимизировать этот файл с точки зрения производительности?
Спасибо
Если вы просто проверяете равенство, используйте '==' для сравнения. Функция shExpMatch позволяет использовать выражения оболочки (* и? В их значениях оболочки DOS), поэтому второй аргумент должен быть проанализирован. Сценарий запускается в браузере один раз (или реже) за запрос, поэтому производительность не является проблемой, но он делает код более понятным, если вы напишете, что значит yuo.
Я бы также использовал переменную для хранения прокси-выражения. Вероятно, это не сэкономит память во время выполнения, поскольку повторяющийся литерал, вероятно, будет использоваться повторно, но это упростит чтение кода.
Есть хорошая информация о http://www.proxypacfiles.com/ включая примеры и извлеченные уроки.
Я думаю, что производительность зависит от того, какой браузер / программа использует файл .pac, но вы можете найти некоторые рекомендации Вот которые включают:
- Скорость выполнения файла зависит от способа построения аргументов в файле PAC, а не от общей длины файла. Файлы PAC последовательно выполняют команды. Следовательно:
- Не используйте чрезмерные функции исключения, так как это может замедлить работу.
- Поместите аргументы или исключения, которые имеют высокую вероятность выполнения, в начале файла. Например, поиск частных IP-адресов должен быть в начале.
- Избегайте использования сложных регулярных выражений для уменьшения размера файла PAC. Это может сделать его менее эффективным.
- Сначала проверьте исключения из простых правил.
- Поместите проверки с высокой вероятностью вверху.
- Сведите к минимуму использование регулярных выражений.
- Используйте эффективные регулярные выражения и избегайте захвата совпадений, которые не будут использоваться.
- Поскольку возврат происходит немедленно, избегайте использования еще с участием если заявления.
- Для однострочных операторов if () не требуются скобки начала {и конца}.
- Тщательно рассмотрите использование (чрезмерное использование) isResolvable (), dnsResolve () и isInNet () из-за потенциальных проблем с производительностью DNS.
- Попробуйте сгруппировать похожие исключения в более крупный цикл if. Например, вместо проверки 10 хостов с помощью xyz.google.com в большом операторе OR, преобразуйте его во внешний оператор if, который применяется, если хост имеет * .google.com, а затем проверьте 10 хостов.
- Проверяйте IP-адреса в отдельном цикле if.
- Каждая открытая фигурная скобка должна иметь соответствующую закрывающую фигурную скобку, а каждая открытая скобка должна иметь соответствующую закрывающую скобку. Одна из наиболее распространенных ошибок при создании файлов PAC - это потеря счетчика открывающих и закрывающих круглых и квадратных скобок.
- Избегайте использования внешних или глобальных переменных и функций.
Кроме того, есть http://pacparser.manugarg.com/ инструмент, который можно использовать для проверки файлов .pac.
Как обычно: хеши или деревья.
Я бы использовал хеширование: извлеките первый (или несколько символов) запрошенного доменного имени (также исключив «www.»), Чтобы выбрать соответствующий список шаблонов.