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