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.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"
}
}
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"
}
}
поле1 > значение1 && поле1 < значение2
, то индекс использоваться не будет (потому что в таком случае монге надо будет сгенерировать все возможные промежуточные значения и посчитать для них хеши, что невозможно).username
и вы выполняете свой запрос вида$or: [
["username" : "user1", tags: "tag4"],
["username" : "user2", tags: "tag1"],
["username" : "user2", tags: "tag3"],
]
username
равен либо user1
, либо user2
, а затем уже начнёт перебирать найденные документы и проверять их на совпадение остальным параметрам запроса.username + tags
?Array
, на каждый элемент массива будет создана отдельная запись в индексе.username
имеет одинаковое значение, но при этом в массиве tags
может быть много значений, и значения внутри одного массива могут повторяться, то использование составного индекса приведёт к большему количеству одинаковых записей в индексе, чем если бы вы использовали индексацию только по полю username
.N ・ M
записей, где N и M - размеры массивов, которые участвуют в построении индекса.Close
у StreamWriter
самостоятельно закрывает нижележащий поток (в вашем случае это FileStream
). И при закрытии нижележащего потока StreamWriter
пытается записать в него всё, что, возможно, успело накопиться в буфере,но еще не было записано (строка System.IO.StreamWriter.Flush(Boolean flushStream, Boolean flushEncoder)
в вашем стектрейсе). Flush
приводит к ошибке.A -> B(A) -> C(B)
, то закрывать их надо в порядке C, B, A
.return
из метода Close
). И подозреваю, что в C# сделано так же. А значит и ошибок таких не будет. suspendCoroutine { continuation ->
//
}
Runnable
, который и будет выполнять ваш блокирующий код. После выполнения блокирующего кода вызываете либо continuation.resume(result)
, либо continuation.resumeWithException(e)
Runnable
тредпулу.Dispatcher.Default
, количество потоков в котором равно количеству ядер CPU (но не меньше двух), поэтому добавление отдельного тредпула под блокирующие задачи приведёт к увеличению количества тредов, что в экстремальных случаях может привести к общей деградации производительности. Но в если у вас не высоконагруженное приложение, то этим можно пренебречь. Правда не уверен как с этим обстоят дела на мобильных платформах, возможно там количество тредов более критично.countByActiveStatesIn(Set states);
.db.collectionName.count({ activeStates: { $in: ["logicConnectionLost"] }})
activeStates
которых содержит хотя бы один элемент из переданного списка.DEBUG
:logging.level.org.springframework.data.mongodb.core.MongoTemplate=DEBUG
#Если используете реактивный MongoTemplate:
logging.level.org.springframework.data.mongodb.core.ReactiveMongoTemplate=DEBUG
printf
пишет в стандартный stdout, который в браузере не доступен. fn get_file(&self)
возвращает Box
Box
нет явного ограничения лайфтайма, то согласно RFC 599, ему присваивается лайфтайм 'static
File
для структуры F
ограничена лайфтаймом 'a
, отсюда и конфликт.WrappedKey
) заворачиваем сначала в Box
, что бы переместить его из стека в кучу, а затем в Rc
, что бы объект не умирал пока на него есть хоть одна ссылка.clone()
у Rc
.Rc
используйте Arc
(Atomic RC).