MongoDB
- 5 ответов
- 0 вопросов
5
Вклад в тег
suspendCoroutine { continuation ->
//
}
Runnable
, который и будет выполнять ваш блокирующий код. После выполнения блокирующего кода вызываете либо continuation.resume(result)
, либо continuation.resumeWithException(e)
Runnable
тредпулу.Dispatcher.Default
, количество потоков в котором равно количеству ядер CPU (но не меньше двух), поэтому добавление отдельного тредпула под блокирующие задачи приведёт к увеличению количества тредов, что в экстремальных случаях может привести к общей деградации производительности. Но в если у вас не высоконагруженное приложение, то этим можно пренебречь. Правда не уверен как с этим обстоят дела на мобильных платформах, возможно там количество тредов более критично.condition
бОльшую часть времени имеет малый набор возможных значений, то кешированием в данном случае будет создание хешмапы, где ключ - condition
, значение - condition + ","
. Можете даже использовать какой-нибудь LRU-кеш, что бы редко используемые ключи постепенно удалялись из кеша и не занимали память.condition + ","
настолько незначительна по вычислительной сложности, что хоть какое-то изменение вы заметите только если у вас этот участок кода вызывается в горячем цикле и генерирует столько мусора, что паузы GC перевешивают дополнительные вычисления хеша, ветвления и добавление новых данных в кеш. Но даже в этом случае нужно профилировать, например с помощью JMH и VisualVM.condition + ","
будет преобразован компилятором в new StringBuilder().append(condition).append(",").toString()
Это сразу +2 созданных объекта: StringBuilder
и новый String
, который будет создан в результате вызова метода StringBuilder.toString()
a = a.replace("^Var1:", newString);
внутри себя тоже создаёт StringBuilder
, у которого потом вызывается метод toString()
- еще +2 объектаa = a + System.lineSeparator();
опять же будет преобразован в StringBuilder
+ toString()
condition
может иметь произвольное значение (т.е. операции с ней нет смысла кешировать, так как всё-равно придётся каждый раз вычислять новое значение), то можете попробовать воспользоваться методом condition.concat(String str)
- будете создавать только 1 объект вместо 2. Будет ли это быстрее? Не знаю, надо профилировать.if
создаём новый StringBuilder вместимостью a.length() + condition.length() + 2
. Если не указать длину строки, то вместимость у StringBuilder
будет либо 16 символов, либо равной длине значения в переменной a
(в зависимости от того, какой конструктор будет использован). И при конкатенации с новыми строками скорее всего возникнет необходимость увеличивать размер буфера, что приведёт к дополнительному копированию массивов (создать буфер с новым размером, скопировать содержимое старого буфера в новый). Поэтому желательно сразу рассчитать правильную длину результирующей строки. В любом случае, это тоже +1 объект.a.replace(CharSequence target, CharSequence replacement)
можно заменить методом StringBuilder.replace(int start, int end, String str)
(придётся вручную вычислить начало и конец подстроки, которую вы хотите заменить).a = a + System.lineSeparator();
используйте a.append(System.lineSeparator())
.out.append(a);
приведёт к созданию еще 1 объекта - либо вы вручную вызовете a.toString()
, либо этот метод будет вызван за вас в методе out.append(CharSequence seq)
. И скорее всего приведёт еще и к копированию массива символов внутри переменной out
, если вы заранее не указали вместимость с запасом.StringBuilder
может быть разной, в зависимости от того, как вы его используете.db.subjects.find(
{"ФизМат.Педагогические науки.B009": {$exists: true}}, // Из всех документов (если у вас их несколько, а не один огромный документ), выбрать те, у которых существует поле "ФизМат.Педагогические науки.B009"
{
_id: 1, // У найденного документа вернуть только поле _id
"ФизМат.Педагогические науки.B009": 1 // и поле "ФизМат.Педагогические науки.B009"
}
)
{
"_id": ObjectId("600fa6f3101fa920a8575e6f"),
"ФизМат": {
"Педагогические науки": {
"B009": {
"code": "B009",
"name": "Подготовка учителей математики",
"max": "140",
"min": " 107",
"minWithQuota": " 95"
}
}
}
}
_id
и ФизМат.Педагогические науки.B009
, никаких дополнительных преобразований над документом проводиться не будет.db.subjects.aggregate(
[
{
$match: { // Эта стадия ищет документы, подходящие под условие
"ФизМат.Педагогические науки.B009": {$exists: true} // В документе есть поле "ФизМат.Педагогические науки.B009"
}
},
{
$project: { // Стадия проекции
_id: 1, // Вернуть id документа
value: "$ФизМат.Педагогические науки.B009" // Вернуть embedded документ в поле value
}
},
])
{
"_id": ObjectId("600fa6f3101fa920a8575e6f"),
"value": {
"code": "B009",
"name": "Подготовка учителей математики",
"max": "140",
"min": " 107",
"minWithQuota": " 95"
}
}
db.test.insertMany([
{
"field1": "abc",
"field2": [
{"embeddedField": "a"},
{"embeddedField": "b"},
{"embeddedField": "c"}
]
},
{
"field1": "xyz",
"field2": {
"embeddedField1": "x",
"embeddedField2": "y",
"embeddedField3": "z"
}
}
])
db.test.find({"field2": {$not: {$type: "array"}}})
{
"_id": ObjectId("..."),
"field1": "xyz",
"field2": {
"embeddedField1": "a",
"embeddedField2": "b",
"embeddedField3": "c"
}
}