Оптимизация производительности файла 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 доменов.

Важно не перенаправлять весь трафик через прокси.

Какой лучший способ сохранить этот файл оптимизированным, с точки зрения производительности?

Спасибо

3 ответа

Решение

Как обычно: хеши или деревья.

Я бы использовал хеширование: извлеките первый (или несколько символов) запрашиваемого доменного имени (также с разделением "www."), Чтобы выбрать соответствующий список шаблонов.

Если вы просто проверяете равенство, используйте '==' для сравнения. Функция shExpMatch позволяет использовать выражения оболочки (* и? В их значениях оболочки DOS), поэтому необходимо проанализировать второй аргумент. Сценарий запускается в браузере один раз (или меньше) для каждого запроса, поэтому производительность не является проблемой, но он делает код более понятным, если вы напишите, что вы имеете в виду.

Я бы также использовал переменную для хранения выражения прокси. Это, вероятно, не сохранит память во время выполнения, поскольку повторяющийся литерал, вероятно, используется повторно, но это облегчит чтение кода.

На http://www.proxypacfiles.com/ есть хорошая информация, включая примеры и извлеченные уроки.

Я думаю, что производительность зависит от того, какой браузер / программа использует файл.pac, но здесь вы можете найти некоторые рекомендации, которые включают:

  • Скорость выполнения файла зависит от способа построения аргументов в файле PAC, а не от общей длины файла. Файлы PAC выполняют команды последовательно. Следовательно:
    • Не используйте чрезмерные функции исключения, так как это может вызвать медлительность.
    • Поместите аргументы или исключения, которые с высокой вероятностью выполняются в начале файла. Например, поиск частного IP-адреса должен быть в начале.
  • Избегайте использования сложных регулярных выражений, чтобы уменьшить размер файла PAC. Это может сделать его менее эффективным.
  • Сначала проверьте простые исключения из правил.
  • Поместите проверки с высокой вероятностью около вершины.
  • Минимизируйте использование регулярных выражений.
  • Используйте эффективные регулярные выражения и избегайте захвата совпадений, которые не будут использоваться.
  • Поскольку возвращение является немедленным, избегайте использования else с операторами if.
  • Однострочные операторы if() не требуют начальных {и конечных} скобок.
  • Тщательно продумайте использование (чрезмерное использование) isResolvable(), dnsResolve() и isInNet() из-за потенциальных проблем с производительностью DNS.
  • Попробуйте сгруппировать похожие исключения в больший цикл if. Например, вместо проверки 10 хостов с xyz.google.com в большом операторе "ИЛИ" преобразуйте его во внешний оператор "if", который применяется в случае, если на хосте есть *.google.com, а затем проверьте на 10 хостах.
  • Проверьте наличие IP-адресов в отдельном цикле if.
  • Каждая открытая фигурная скобка должна иметь соответствующую закрытую фигурную скобку, а каждая открытая скобка должна иметь соответствующую закрывающую скобку. Одна из наиболее распространенных ошибок при создании файлов PAC - потеря количества открывающих и закрывающих скобок и скобок.
  • Избегайте использования внешних или глобальных переменных и функций.

Также есть инструмент http://pacparser.manugarg.com/, который можно использовать для проверки файлов.pac.

Другие вопросы по тегам