Java снижает загрузку процессора - PullRequest
6 голосов
/ 28 марта 2010

Привет-

У нас в работе есть несколько психов, которым нравится использовать

while(true) { //Code } 

в их коде. Как вы можете себе представить, это максимально загружает процессор. Кто-нибудь знает способы уменьшить загрузку ЦП, чтобы другие люди могли также использовать сервер.

Сам код просто постоянно опрашивает интернет на предмет обновлений на сайтах. Поэтому я полагаю, что небольшой метод сна значительно уменьшит загрузку процессора.

Кроме того, все манипуляции выполняются в объектах String (Java). Кто-нибудь знает, насколько StringBuilders уменьшит накладные расходы на?

Спасибо за любые указатели

Ответы [ 9 ]

7 голосов
/ 28 марта 2010

Многое из "народной мудрости" о StringBuilder неверно.Например, изменив это:

String s = s1 + ":" + s2 + ":" + s3;

на следующее:

StringBuilder sb = new StringBuilder(s1);
sb.append(":");
sb.append(s2);
sb.append(":");
sb.append(s3);
String s = sb.toString();

, вероятно, не заставит его работать быстрее .Это связано с тем, что компилятор Java фактически транслирует последовательность конкатенации в эквивалентную последовательность добавления к временному StringBuilder.Если вы не объединяете строки в цикле, вам лучше всего использовать оператор +.Ваш код будет легче читать.

Еще один момент, который следует сделать, это то, что вы должны использовать профилировщик для определения мест в вашем коде, которые выиграют от работы для повышения производительности.Интуиция большинства разработчиков о том, что стоит оптимизировать, не столь надежна.

6 голосов
/ 28 марта 2010

Я начну со вашего второго вопроса, я хотел бы согласиться с остальным, что StringBuilder vs String очень сильно зависит от конкретных манипуляций со строками. Я «тестировал» это один раз и, вообще говоря, по мере увеличения количества выделенных строк (обычно в форме конкатенаций) общее время выполнения увеличивалось. Я не буду вдаваться в подробности и просто скажу, что StringBuilder оказался наиболее эффективным сверхурочным временем по сравнению с String, StringBuffer, String.format (), MessageFormat ...

Мое эмпирическое правило таково, что всякий раз, когда я хочу объединить более 3 строк, я всегда использую StringBuilder.

Что касается вашего первого вопроса. У нас было требование довести загрузку процессора до 5%. Задача не из легких. Мы использовали механизм Spring AOP для добавления Thread.sleep () перед выполнением любого метода с интенсивным использованием процессора. Thread.sleep () будет вызываться, только если будет превышено некоторое ограничение. Мне жаль говорить, что вычисление этого предела не так просто. И даже с сожалением могу сказать, что я до сих пор не получил разрешение размещать его в сети. Так что это просто для того, чтобы поставить вас на интересную, но сложную трассу, которая доказала свою эффективность с течением времени.

4 голосов
/ 28 марта 2010

Как часто эти сайты обновляются? Вы, наверное, действительно раздражаете хозяев. Просто вставьте Thread.sleep(60 * 1000); в конце цикла, и вы можете избежать этого. Это будет опрашивать их раз в минуту - конечно, этого достаточно?

2 голосов
/ 28 марта 2010

Сон уменьшит использование процессора. Что касается StringBuilders, они могут снизить использование памяти и улучшить производительность.

2 голосов
/ 28 марта 2010

Заставьте его подождать некоторое время, прежде чем снова выстрелить, как это:

while(true) { 
  //Code 
  Thread.sleep (1000); //Wait 1 second
} 

Что касается второго вопроса, это уменьшит использование памяти и, возможно, использование ЦП, но выигрыш действительно зависит от того, что происходит с этими строками.

0 голосов
/ 28 марта 2010
  1. На каких сайтах проводится опрос кода? Делать они поддерживают толчок RSS?
  2. Если они это сделают, тогда нет необходимости опросить сайты и вместо этого подключить Модуль для ожидания обновлений. Затем текущий метод ожидает, используя wait();
  3. Затем новый модуль уведомляет объект этим методом, используя notifyAll().
  4. По общему признанию, это некоторая дополнительная работа, но она экономит большую часть полосы пропускания и вычислений.
0 голосов
/ 28 марта 2010

Никогда не думайте, что то, что вы видите в коде, плохо (или хорошо) для производительности. Проблемы с производительностью общеизвестно обманчивы.

Вот простой способ убедиться, что отнимает время.

0 голосов
/ 28 марта 2010

Если их код находится в отдельной JVM и работает в Linux или каком-либо другом Unix, потребуйте, чтобы они запустили свою программу в хорошем 20.

Или вы можете запустить их на виртуальной машине, такой как VirtualBox, и использовать ее для ограничения использования процессора.

Или вы можете запустить их, если они продолжат подобные циклы записи вместо использования модели, управляемой событиями, или Thread.sleep.

0 голосов
/ 28 марта 2010

Вы также можете попробовать

Thread.yield()
...