ОК, так что это похоже на классический случай чрезмерной оптимизации.
Создание объекта не так дорого, что вам нужно переписать один и тот же строковый буфер, особенно если это вызывается каждые 300-400 мс.
Я постараюсь рассмотреть все возможные сценарии:
Экспоненциальный рост
Приведенный выше код присваивается новому потоку каждые 300 мс, но список огромен, и для его сериализации требуется более 300 мс. Если это так, то вы в основном душите свои ресурсы, и это только вопрос времени, когда приложение аварийно завершает работу.
Если это так, вы должны видеть, что процессор постоянно растет.
Решение было бы:
- Ограничить количество потоков, которые могут работать одновременно, чтобы не убивать приложение
- Одновременно создайте объект json и объедините результат, поэтому создание одного json занимает менее 300 мс.
ускорения
Итак, список не является клонируемым, что, как я предполагаю, означает, что на самом деле это не список, а какая-то очередь, реализованная в виде интерфейса списка. Итак, оставив синхронизацию, как я сделал бы это:
public static final int JSON_LENGTH = 250; //you probably know this
public static String toJson(final List<QuotesData> quotesData) {
jsonVal = new StringBuilder(JSON_LENGTH * quotesData.size());
jsonVal.append("{");
synchronized (quotesData) {
for (QuotesData quote : quotesData) {
jsonVal.append("\"").append(quote.getSymbol()).append("\":[{")
.append("\"ask\":\"").append(quote.getAsk()).append("\",")
.append("\"bid\":\"").append(quote.getBid()).append("\",")
.append("\"time\":\"").append(quote.getDateTime()).append("\"}],");
}
// much much faster than replace
jsonVal.setCharAt(jsonVal.length()-1, '}');
return jsonVal.toString();
}
}
Большинство изменений косметические, и я уверен, что JIT уже оптимизирует их. Единственное отличие, которое я хотел бы сделать, - это использовать StringBuilder и каждый раз создавать новый и не использовать .replace () .
Но чтобы подчеркнуть мою точку зрения, если вы не подходите под первое описание (экспоненциальный рост), я сомневаюсь, что проблема здесь. Я бы сначала посмотрел на реализацию списка.