Частичный ответ, потому что он слишком велик для комментария, а также потому, что у меня нет желания настраивать и запускать новые эксперименты прямо сейчас. (Если кто-то отправляет ответ с обновленными, проверяемыми номерами, он получает мое одобрение.)
Вот примерный набросок того, что происходит, когда у вас есть Tampermonkey, Violentmonkey и т. Д. И установлены пользовательские скрипты:
Каждая страница, которую вы посещаете , проверяется на соответствие директивам @include
, @match
и @exclude
каждого активного пользовательского скрипта . Более умные движки сначала проверят @exclude
и остановятся, если совпадение найдено.
Некоторые движки лучше справляются с этой проверкой, чем другие, и в идеале информация о совпадении сайтов должна храниться в памяти для максимальной скорости.
Каждый <frame>
или iframe на всех посещаемых вами страницах сверяются с директивами @include
, @match
и @exclude
каждого активного пользовательского скрипта, если только этот скрипт не имеет @noframes
установлено.
Если скрипт соответствует странице (или фрейму), то Tampermonkey (и т. Д.) Должен:
(A) Извлечь код скрипта и любые данные - часто с диска (медленно).
(B) Затем создайте некоторый уровень песочницы - в зависимости от движка, браузера и режима @grant
.
(C) Вставьте скрипт в вышеупомянутую песочницу - почти всегда обернутую анонимной функцией - и запустите его.
Затем пользовательский скрипт будет использовать ресурсы в зависимости от своего кода.
В общем:
@match
работает лучше (проверено годами ранее), чем @include
. Если вы собираетесь использовать 1000 строк, используйте @match
вместо include.
Используйте @noframes
, если у вас нет причин не делать этого.
@include
может быть обработана за то же время, что и для введите один пользовательский скрипт. (Кто-нибудь хочет попробовать собрать какие-нибудь числа?) @require
файлы, @resource
файлы, GM_setValue
данные) должны быть извлечены с диска, то это сравнительно огромная задержка во времени. (Но все же это быстрее, чем извлекать информацию из Интернета.) Наконец, время и возможное напряжение из-за необходимости поддерживать большой список сайтов, редактируя файл usercript каждый время должно быть по сравнению с тем, насколько инвазивен ваш сценарий .
Если бы это был я, а скрипт только задерживал страницы менее чем на 300 миллисекунд, я бы просто держал свой нос и использовал:
// @match *://*/*
// @noframes
Однако, если скрипт более инвазивен, он медленнее или более ресурсоемкий, вы можете использовать гибридный подход ...
Сохраните список сайтов, на которых будет полностью работать, в данных GM_setValue
и / или в файле @resource
d.
Таким образом, вы можете редактировать список на лету, используя, например, команды меню; или через редактор данных скрипта Tampermonkey; или даже с помощью кнопок, которые вы создаете для этой цели. Однако все это выходит за рамки этого вопроса.
Я бы порекомендовал вам сделать так, как предлагает предупреждение, и использовать поток, а не байтовый массив. Если ответ, который вы пытаетесь выдвинуть, особенно велик (предположим, это большой файл), вы загрузите все это в память, и это было бы очень плохо.
Вам действительно лучше использовать потоки.
Тем не менее, вы можете взломать его, временно заменив System.err или System.out. Это просто объекты PrintStream
, и они устанавливаются с помощью методов setOut и setErr.
PrintStream oldErr = System.err;
PrintStream newErr = new PrintStream(new ByteArrayOutputStream());
System.setErr(newErr);
// do your work
System.setErr(oldErr);
Редактировать:
Я согласен, что было бы предпочтительнее использовать потоки, но, как сейчас, целевой API, где мне нужно поставить Ответ - байтовый массив. Если необходимо, мы можем сделать рефакторинг к API, который позволит ему принять поток; это было бы лучше. предупреждение определенно есть для причина.
Если вы можете изменить API, сделайте это. Потоковая обработка - лучший способ пойти в этом случае. Если вы не можете из-за внутреннего давления или чего-то еще, идите @John M по маршруту и накачайте BUFFER_WARN_TRIGGER_LIMIT
- но убедитесь, что у вас есть известное contentLength, или даже что Маршрут не удастся.
Выводится ли библиотека через log4j? если это так, сработает редактирование свойств log4j.properties, чтобы установить для выхода этого класса значение «ОШИБКА», например
log4j.logger.org.apache.commons.httpclient.methods.PostMethod=ERROR
Предполагая, что предупреждение записано в stderr, вы всегда можете подавить предупреждение, отправив stderr в / dev / null
или любой другой эквивалент в вашей системе.
Эта проблема уже обсуждалась в ASF JIRA . Есть два способа решить эту проблему:
Если вы хотите аккуратно остановить эту запись в журнале, есть настраиваемый максимум, который выдает предупреждение. Я видел это , глядя на код .
int limit = getParams().getIntParameter(HttpMethodParams.BUFFER_WARN_TRIGGER_LIMIT, 1024*1024);
if ((contentLength == -1) || (contentLength > limit)) {
LOG.warn("Going to buffer response body of large or unknown size. "
+"Using getResponseBodyAsStream instead is recommended.");
}
HttpMethodBase.setParams () выглядит как место для установки HttpMethodParams.BUFFER_WARN_TRIGGER_LIMIT на желаемое значение.