Афсона дар бораи он, ки чӣ тавр несткунии каскадӣ дар Realm бар як оғози тӯлонӣ ғолиб омад

Ҳама корбарон дар барномаҳои мобилӣ UI-и зуд ва ҷавобгӯро қабул мекунанд. Агар барои оғози барнома муддати тӯлонӣ лозим бошад, корбар эҳсоси ғамгин ва хашмгин мешавад. Шумо метавонед ба осонӣ таҷрибаи муштариро вайрон кунед ё корбарро ҳатто пеш аз оғози истифодаи барнома комилан аз даст диҳед.

Мо боре фаҳмидем, ки барномаи Dodo Pizza ба ҳисоби миёна 3 сония ва барои баъзе "бахтҳо" 15-20 сония вақт лозим аст.

Дар поёни буриш ҳикоя бо анҷоми хушбахтона мавҷуд аст: дар бораи афзоиши пойгоҳи додаҳои Realm, ихроҷи хотира, чӣ гуна мо объектҳои лонаро ҷамъ кардем ва сипас худро ҷамъ карда, ҳама чизро ислоҳ кардем.

Афсона дар бораи он, ки чӣ тавр несткунии каскадӣ дар Realm бар як оғози тӯлонӣ ғолиб омад

Афсона дар бораи он, ки чӣ тавр несткунии каскадӣ дар Realm бар як оғози тӯлонӣ ғолиб омад
Муаллифи мақола: Максим Качинкин — Таҳиягари Android дар Dodo Pizza.

Се сония аз пахши тасвири барнома то onResume()-и фаъолияти аввал беохир аст. Ва барои баъзе корбарон, вақти оғозёбӣ ба 15-20 сония расид. Чӣ тавр ин ҳатто имконпазир аст?

Хулосаи хеле кӯтоҳ барои онҳое, ки вақти хондан надоранд
Пойгоҳи Realm мо беохир афзоиш ёфт. Баъзе объектҳои лона гузошташуда нест карда нашудаанд, аммо доимо ҷамъ карда мешуданд. Вақти оғози барнома тадриҷан зиёд шуд. Сипас мо онро ислоҳ кардем ва вақти оғозёбӣ ба ҳадаф расид - он камтар аз 1 сония шуд ва дигар зиёд нашуд. Дар мақола таҳлили вазъият ва ду роҳи ҳал - як зуд ва як муқаррарӣ иборат аст.

Ҷустуҷӯ ва таҳлили мушкилот

Имрӯз ҳар як замимаи мобилӣ бояд зуд ба кор дарояд ва ҷавобгӯ бошад. Аммо ин танҳо дар бораи барномаи мобилӣ нест. Таҷрибаи корбар дар робита бо хидмат ва ширкат як чизи мураккаб аст. Масалан, дар ҳолати мо, суръати интиқол яке аз нишондиҳандаҳои асосии хидматрасонии пицца мебошад. Агар интиқол зуд бошад, пицца гарм мешавад ва ба муштарӣ, ки ҳоло хӯрок хӯрдан мехоҳад, муддати тӯлонӣ интизор намешавад. Барои барнома, дар навбати худ, эҷод кардани ҳисси хидматрасонии зуд муҳим аст, зеро агар барои оғоз кардани барнома ҳамагӣ 20 сония вақт лозим бошад, пас шумо бояд чӣ қадар вақт пиццаро ​​интизор шавед?

Дар аввал, худи мо бо он дучор мешудем, ки баъзан барои оғоз кардани барнома якчанд сония тӯл мекашид ва баъд мо шикоятҳои ҳамкасбони дигарро дар бораи он, ки чӣ қадар вақт мегирад, шунидем. Аммо мо натавонистем ин вазъиятро пайваста такрор кунем.

Чанд вақт аст? Бино бар Ҳуҷҷатҳои Google, агар оғози сарди барнома камтар аз 5 сонияро дар бар гирад, пас ин "гӯё муқаррарӣ" ҳисобида мешавад. Барномаи Android Dodo Pizza оғоз шуд (тибқи ченакҳои Firebase _барнома_оғоз) дар оғози сард ба ҳисоби миёна дар 3 сония - "На бузург, на даҳшатнок", чунон ки мегӯянд.

Аммо баъд шикоятҳо пайдо шуданд, ки барои оғоз кардани барнома вақти хеле, хеле ва хеле тӯлонӣ лозим буд! Барои оғоз, мо тасмим гирифтем, ки "хеле, хеле, хеле дароз" чист. Ва мо барои ин пайгирии Firebase-ро истифода кардем Пайгирии оғози барнома.

Афсона дар бораи он, ки чӣ тавр несткунии каскадӣ дар Realm бар як оғози тӯлонӣ ғолиб омад

Ин пайгирии стандартӣ вақтро байни лаҳзаи кушодани корбар ва лаҳзаи иҷро шудани onResume()-и фаъолияти аввал чен мекунад. Дар Firebase Console ин метрика _app_start номида мешавад. Маълум шуд, ки:

  • Вақти оғозёбӣ барои корбарони болотар аз 95 фоиз тақрибан 20 сонияро ташкил медиҳад (баъзеҳо боз ҳам зиёдтар), сарфи назар аз он ки вақти оғози сардии миёна аз 5 сония камтар аст.
  • Вақти оғозёбӣ арзиши доимӣ нест, аммо бо мурури замон афзоиш меёбад. Аммо баъзан қатраҳо вуҷуд доранд. Мо ин намунаро вақте пайдо кардем, ки миқёси таҳлилро то 90 рӯз зиёд кардем.

Афсона дар бораи он, ки чӣ тавр несткунии каскадӣ дар Realm бар як оғози тӯлонӣ ғолиб омад

Ду андеша ба сарам омад:

  1. Чизе мечакад.
  2. Ин "чизе" пас аз озод шудан аз нав барқарор карда мешавад ва сипас дубора ихроҷ мешавад.

«Эҳтимол, чизе бо базаи маълумот бошад», - фикр мекардем ва мо дуруст будем. Аввалан, мо махзани маълумотро ҳамчун кэш истифода мебарем, ҳангоми интиқол мо онро тоза мекунем. Дуюм, базаи маълумот ҳангоми оғози барнома бор карда мешавад. Ҳама чиз ба ҳам мувофиқ аст.

Дар базаи Realm чӣ хато аст

Мо ба санҷидани он, ки мундариҷаи пойгоҳи додаҳо дар тӯли ҳаёти барнома, аз насби аввал ва минбаъд ҳангоми истифодаи фаъол чӣ гуна тағир меёбад. Шумо метавонед мундариҷаи базаи Realm-ро тавассути Стето ё ба таври муфассал ва равшан бо кушодани файл тавассути Realm Studio. Барои дидани мундариҷаи пойгоҳи додаҳо тавассути ADB, файли пойгоҳи додаи Realm-ро нусхабардорӣ кунед:

adb exec-out run-as ${PACKAGE_NAME} cat files/${DB_NAME}

Мундариҷаи базаи маълумотро дар вақтҳои гуногун дида баромадем, мо фаҳмидем, ки шумораи объектҳои як намуди муайян мунтазам меафзояд.

Афсона дар бораи он, ки чӣ тавр несткунии каскадӣ дар Realm бар як оғози тӯлонӣ ғолиб омад
Дар расм порчаи Realm Studio барои ду файл нишон дода шудааст: дар тарафи чап - пойгоҳи барнома чанд вақт пас аз насб, дар тарафи рост - пас аз истифодаи фаъол. Дидан мумкин аст, ки шумораи объектхо ImageEntity и MoneyType хеле афзудааст (дар скриншот шумораи объектхои хар як намуд нишон дода шудааст).

Муносибати байни афзоиши пойгоҳи додаҳо ва вақти оғозёбӣ

Афзоиши беназорати базаи маълумот хеле бад аст. Аммо ин ба вақти оғози барнома чӣ гуна таъсир мерасонад? Инро тавассути ActivityManager чен кардан хеле осон аст. Аз Android 4.4, logcat гузоришро бо сатри намоишшуда ва вақт нишон медиҳад. Ин вақт ба фосилаи аз лаҳзаи оғози барнома то анҷоми намоиши фаъолият баробар аст. Дар ин муддат ҳодисаҳои зерин рух медиҳанд:

  • Равандро оғоз кунед.
  • Оғозсозии объектҳо.
  • Эҷод ва оғози фаъолият.
  • Эҷоди тарҳ.
  • Намоиши барнома.

Ба мо мувофиқ аст. Агар шумо ADB-ро бо парчамҳои -S ва -W иҷро кунед, шумо метавонед бо вақти оғозёбӣ натиҷаи васеъ ба даст оред:

adb shell am start -S -W ru.dodopizza.app/.MainActivity -c android.intent.category.LAUNCHER -a android.intent.action.MAIN

Агар шумо онро аз он ҷо гиред grep -i WaitTime вақт, шумо метавонед ҷамъоварии ин метрикаро автоматӣ кунед ва ба натиҷаҳои визуалӣ назар кунед. Графикаи зер вобастагии вақти оғози барномаро аз шумораи оғози сарди барнома нишон медиҳад.

Афсона дар бораи он, ки чӣ тавр несткунии каскадӣ дар Realm бар як оғози тӯлонӣ ғолиб омад

Дар айни замон, як хусусияти муносибати байни андоза ва афзоиши базаи маълумот мавҷуд буд, ки аз 4 МБ ба 15 МБ расид. Дар маҷмӯъ, маълум мешавад, ки бо мурури замон (бо афзоиши саршавии сармо) ҳам вақти оғози барнома ва ҳам андозаи пойгоҳи додаҳо афзоиш ёфтааст. Мо дар дасти мо гипотеза дорем. Ҳоло танҳо тасдиқи вобастагӣ боқӣ монд. Аз ин рӯ, мо тасмим гирифтем, ки "хуришҳо" -ро бартараф кунем ва бубинем, ки оё ин оғозёбиро суръат мебахшад.

Сабабҳои афзоиши беохири пойгоҳи додаҳо

Пеш аз бартараф кардани "хуришҳо" бояд фаҳманд, ки чаро онҳо дар ҷои аввал пайдо шудаанд. Барои ин, биёед дар хотир дорем, ки Realm чист.

Realm як пойгоҳи додаҳои ғайрирасмӣ мебошад. Он ба шумо имкон медиҳад, ки муносибатҳои байни объектҳоро ба ҳамон тавре тасвир кунед, ки чанд пойгоҳи додаҳои реляционии ORM дар Android тасвир шудааст. Ҳамзамон, Realm объектҳоро мустақиман дар хотира бо камтарин миқдори тағирот ва харитасозӣ нигоҳ медорад. Ин ба шумо имкон медиҳад, ки маълумотро аз диск хеле зуд хонед, ки ин қудрати Realm аст ва чаро онро дӯст медоранд.

(Барои мақсадҳои ин мақола, ин тавсиф барои мо кофӣ хоҳад буд. Шумо метавонед бештар дар бораи Realm дар сард хонед хуччатхо ё дар онхо академия).

Бисёре аз таҳиягарон одат кардаанд, ки бештар бо пойгоҳи додаҳои релятсионӣ кор кунанд (масалан, пойгоҳи додаҳои ORM бо SQL зери сарпӯш). Ва чизҳое ба монанди ҳазфи каскади маълумот аксар вақт ба назар дода мешаванд. Аммо на дар Realm.

Дар омади гап, хусусияти несткунии каскад муддати тӯлонӣ дархост карда шудааст. Ин ревизия и дигар, ки бо он алокаманд аст, фаъолона мухокима карда шуд. Чунин хиссиёте пайдо шуд, ки он ба зудй анчом меёбад. Аммо баъд ҳама чиз ба ҷорӣ намудани пайвандҳои қавӣ ва заиф табдил ёфт, ки ин мушкилотро ба таври худкор ҳал мекунад. Дар ичрои ин вазифа хеле сергайрат ва фаъол буд дархост кашед, ки аз сабаби душворихои дохилй холо таваккуф карда шудааст.

Ихроҷи маълумот бе ҳазфи каскадӣ

Агар шумо ба несткунии каскадии мавҷуда такя накунед, маҳз маълумот чӣ гуна мешавад? Агар шумо объектҳои Realm лона дошта бошед, пас онҳо бояд нест карда шаванд.
Биёед мисоли воқеиро (қариб) дида бароем. Мо объект дорем CartItemEntity:

@RealmClass
class CartItemEntity(
 @PrimaryKey
 override var id: String? = null,
 ...
 var name: String = "",
 var description: String = "",
 var image: ImageEntity? = null,
 var category: String = MENU_CATEGORY_UNKNOWN_ID,
 var customizationEntity: CustomizationEntity? = null,
 var cartComboProducts: RealmList<CartProductEntity> = RealmList(),
 ...
) : RealmObject()

Маҳсулот дар ароба дорои соҳаҳои гуногун, аз ҷумла тасвир ImageEntity, компонентҳои фармоишӣ CustomizationEntity. Инчунин, маҳсулот дар ароба метавонад комби бо маҷмӯи маҳсулоти худ бошад RealmList (CartProductEntity). Ҳама майдонҳои номбаршуда объектҳои Realm мебошанд. Агар мо як объекти навро (copyToRealm() / copyToRealmOrUpdate()) бо ҳамон id гузорем, он гоҳ ин объект пурра аз нав навишта мешавад. Аммо ҳама объектҳои дохилӣ (тасвир, customizationEntity ва cartComboProducts) алоқаро бо волидайн гум мекунанд ва дар пойгоҳи додаҳо боқӣ мемонанд.

Азбаски алоқа бо онҳо гум шудааст, мо дигар онҳоро намехонем ё нест намекунем (агар мо ба таври возеҳ ба онҳо дастрасӣ надорем ё тамоми “ҷадвал”-ро тоза накунем). Мо инро "хуриши хотира" номидем.

Вақте ки мо бо Realm кор мекунем, мо бояд ба таври возеҳ аз тамоми унсурҳо гузарем ва ҳама чизро пеш аз чунин амалиёт тоза кунем. Инро, масалан, ин тавр кардан мумкин аст:

val entity = realm.where(CartItemEntity::class.java).equalTo("id", id).findFirst()
if (first != null) {
 deleteFromRealm(first.image)
 deleteFromRealm(first.customizationEntity)
 for(cartProductEntity in first.cartComboProducts) {
   deleteFromRealm(cartProductEntity)
 }
 first.deleteFromRealm()
}
// и потом уже сохраняем

Агар шумо ин корро кунед, ҳама чиз тавре ки лозим аст, кор хоҳад кард. Дар ин мисол, мо тахмин мезанем, ки дар дохили image, customizationEntity ва cartComboProducts дигар объектҳои лона гузошташудаи Realm вуҷуд надоранд, аз ин рӯ дигар ҳалқаҳо ва несткунии лона вуҷуд надоранд.

Ҳалли "зуд"

Аввалин чизе, ки мо тасмим гирифтем, тоза кардани объектҳои босуръат афзоишёбанда ва санҷидани натиҷаҳо буд, то бубинем, ки оё ин мушкилоти аслии моро ҳал мекунад. Аввалан, ҳалли соддатарин ва интуитивӣ таҳия карда шуд, яъне: ҳар як объект бояд барои хориҷ кардани фарзандонаш масъул бошад. Барои ин, мо интерфейсеро ҷорӣ кардем, ки рӯйхати объектҳои Realm-ро баргардонд:

interface NestedEntityAware {
 fun getNestedEntities(): Collection<RealmObject?>
}

Ва мо онро дар объектҳои Realm худ татбиқ кардем:

@RealmClass
class DataPizzeriaEntity(
 @PrimaryKey
 var id: String? = null,
 var name: String? = null,
 var coordinates: CoordinatesEntity? = null,
 var deliverySchedule: ScheduleEntity? = null,
 var restaurantSchedule: ScheduleEntity? = null,
 ...
) : RealmObject(), NestedEntityAware {

 override fun getNestedEntities(): Collection<RealmObject?> {
   return listOf(
       coordinates,
       deliverySchedule,
       restaurantSchedule
   )
 }
}

В getNestedEntities мо ҳама кӯдаконро ҳамчун рӯйхати ҳамвор бармегардонем. Ва ҳар як объекти кӯдак инчунин метавонад интерфейси NestedEntityAware-ро амалӣ кунад, ки ин нишон медиҳад, ки он дорои объектҳои дохилии Realm барои нест кардан аст, масалан ScheduleEntity:

@RealmClass
class ScheduleEntity(
 var monday: DayOfWeekEntity? = null,
 var tuesday: DayOfWeekEntity? = null,
 var wednesday: DayOfWeekEntity? = null,
 var thursday: DayOfWeekEntity? = null,
 var friday: DayOfWeekEntity? = null,
 var saturday: DayOfWeekEntity? = null,
 var sunday: DayOfWeekEntity? = null
) : RealmObject(), NestedEntityAware {

 override fun getNestedEntities(): Collection<RealmObject?> {
   return listOf(
       monday, tuesday, wednesday, thursday, friday, saturday, sunday
   )
 }
}

Ва амсоли ин, лона кардани ашёро такрор кардан мумкин аст.

Сипас мо усулеро менависем, ки ҳама объектҳои лонаро рекурсивӣ нест мекунад. Усул (ҳамчун васеъ сохта шудааст) deleteAllNestedEntities ҳама объектҳо ва усулҳои сатҳи болоро мегирад deleteNestedRecursively Ҳама объектҳои лонаро бо истифода аз интерфейси NestedEntityAware ба таври рекурсивӣ нест мекунад:

fun <T> Realm.deleteAllNestedEntities(entities: Collection<T>,
 entityClass: Class<out RealmObject>,
 idMapper: (T) -> String,
 idFieldName : String = "id"
 ) {

 val existedObjects = where(entityClass)
     .`in`(idFieldName, entities.map(idMapper).toTypedArray())
     .findAll()

 deleteNestedRecursively(existedObjects)
}

private fun Realm.deleteNestedRecursively(entities: Collection<RealmObject?>) {
 for(entity in entities) {
   entity?.let { realmObject ->
     if (realmObject is NestedEntityAware) {
       deleteNestedRecursively((realmObject as NestedEntityAware).getNestedEntities())
     }
     realmObject.deleteFromRealm()
   }
 }
}

Мо ин корро бо объектҳои босуръат афзоишёбанда анҷом додем ва тафтиш кардем, ки чӣ рӯй дод.

Афсона дар бораи он, ки чӣ тавр несткунии каскадӣ дар Realm бар як оғози тӯлонӣ ғолиб омад

Дар натича он объектхое, ки мо бо ин махлул пушонда будем, аз нашъунамо монданд. Ва нашъунамои умумии база суст шуд, аммо бас нашуд.

Ҳалли "муқаррарӣ"

Гарчанде ки пойгоҳ сусттар ба воя шурӯъ кард, он ҳанӯз ҳам афзоиш ёфт. Ҳамин тавр, мо ба ҷустуҷӯи минбаъда шурӯъ кардем. Лоиҳаи мо аз кэшкунии маълумот дар Realm хеле фаъол истифода мебарад. Аз ин рӯ, навиштани ҳама объектҳои лона гузошташуда барои ҳар як объект меҳнатталаб аст, илова бар ин, хатари хатогиҳо зиёд мешавад, зеро шумо метавонед ҳангоми тағир додани код нишон додани объектҳоро фаромӯш кунед.

Ман мехостам боварӣ ҳосил кунам, ки ман интерфейсҳоро истифода намебарам, аммо ҳама чиз худаш кор мекунад.

Вақте ки мо мехоҳем, ки чизе худ аз худ кор кунад, мо бояд инъикосро истифода барем. Барои ин, мо метавонем аз ҳар як майдони синф гузашта, тафтиш кунем, ки он объекти Realm аст ё рӯйхати объектҳо:

RealmModel::class.java.isAssignableFrom(field.type)

RealmList::class.java.isAssignableFrom(field.type)

Агар майдон RealmModel ё RealmList бошад, объекти ин майдонро ба рӯйхати объектҳои лона илова кунед. Ҳама чиз айнан ҳамон тавре аст, ки мо дар боло гуфта будем, танҳо дар ин ҷо он худ аз худ анҷом дода мешавад. Худи усули несткунии каскад хеле содда аст ва чунин менамояд:

fun <T : Any> Realm.cascadeDelete(entities: Collection<T?>) {
 if(entities.isEmpty()) {
   return
 }

 entities.filterNotNull().let { notNullEntities ->
   notNullEntities
       .filterRealmObject()
       .flatMap { realmObject -> getNestedRealmObjects(realmObject) }
       .also { realmObjects -> cascadeDelete(realmObjects) }

   notNullEntities
       .forEach { entity ->
         if((entity is RealmObject) && entity.isValid) {
           entity.deleteFromRealm()
         }
       }
 }
}

Васеъ filterRealmObject филтр мекунад ва танҳо объектҳои Realm мегузарад. Усул getNestedRealmObjects тавассути инъикос, он ҳама объектҳои Realm лонаро пайдо мекунад ва онҳоро ба рӯйхати хатӣ мегузорад. Он гоҳ мо ҳамон корро ба таври рекурсивӣ мекунем. Ҳангоми нест кардан, шумо бояд объектро барои эътибор тафтиш кунед isValid, зеро мумкин аст, ки объектҳои волидайн метавонанд объектҳои якхела дошта бошанд. Беҳтар аст, ки аз ин канорагирӣ кунед ва ҳангоми сохтани объектҳои нав танҳо тавлиди худкори ID-ро истифода баред.

Афсона дар бораи он, ки чӣ тавр несткунии каскадӣ дар Realm бар як оғози тӯлонӣ ғолиб омад

Татбиқи пурраи усули getNestedRealmObjects

private fun getNestedRealmObjects(realmObject: RealmObject) : List<RealmObject> {
 val nestedObjects = mutableListOf<RealmObject>()
 val fields = realmObject.javaClass.superclass.declaredFields

// Проверяем каждое поле, не является ли оно RealmModel или списком RealmList
 fields.forEach { field ->
   when {
     RealmModel::class.java.isAssignableFrom(field.type) -> {
       try {
         val child = getChildObjectByField(realmObject, field)
         child?.let {
           if (isInstanceOfRealmObject(it)) {
             nestedObjects.add(child as RealmObject)
           }
         }
       } catch (e: Exception) { ... }
     }

     RealmList::class.java.isAssignableFrom(field.type) -> {
       try {
         val childList = getChildObjectByField(realmObject, field)
         childList?.let { list ->
           (list as RealmList<*>).forEach {
             if (isInstanceOfRealmObject(it)) {
               nestedObjects.add(it as RealmObject)
             }
           }
         }
       } catch (e: Exception) { ... }
     }
   }
 }

 return nestedObjects
}

private fun getChildObjectByField(realmObject: RealmObject, field: Field): Any? {
 val methodName = "get${field.name.capitalize()}"
 val method = realmObject.javaClass.getMethod(methodName)
 return method.invoke(realmObject)
}

Дар натиҷа, дар коди муштарии мо мо барои ҳар як амалиёти тағир додани маълумот "нест кардани каскад" -ро истифода мебарем. Масалан, барои амалиёти воридкунӣ чунин менамояд:

override fun <T : Entity> insert(
 entityInformation: EntityInformation,
 entities: Collection<T>): Collection<T> = entities.apply {
 realmInstance.cascadeDelete(getManagedEntities(entityInformation, this))
 realmInstance.copyFromRealm(
     realmInstance
         .copyToRealmOrUpdate(this.map { entity -> entity as RealmModel }
 ))
}

Усули аввал getManagedEntities қабул ҳамаи объектҳои иловашуда, ва он гоҳ усули cascadeDelete Пеш аз навиштани объектҳои нав ҳама объектҳои ҷамъшударо ба таври рекурсивӣ нест мекунад. Мо ин усулро дар тамоми барнома истифода мебарем. Ихроҷи хотира дар Realm комилан нест шудааст. Бо анҷом додани ҳамон андозагирии вобастагии вақти оғозёбӣ аз шумораи оғози хунуки барнома, мо натиҷаро мебинем.

Афсона дар бораи он, ки чӣ тавр несткунии каскадӣ дар Realm бар як оғози тӯлонӣ ғолиб омад

Хати сабз вобастагии вақти оғози барномаро аз шумораи саршавии сард ҳангоми ҳазфи автоматии каскади объектҳои лона гузошташударо нишон медиҳад.

Натиҷаҳо ва хулосаҳо

Пойгоҳи афзояндаи Realm боиси хеле суст оғоз шудани барнома шуд. Мо навсозиро бо "несткунии каскади" -и объектҳои лонаҳои худамон нашр кардем. Ва ҳоло мо назорат ва арзёбӣ мекунем, ки қарори мо ба вақти оғози барнома тавассути метрикаи _app_start чӣ гуна таъсир расонд.

Афсона дар бораи он, ки чӣ тавр несткунии каскадӣ дар Realm бар як оғози тӯлонӣ ғолиб омад

Барои таҳлил, мо як давраи 90 рӯзро мегирем ва мебинем: вақти оғози барнома, ҳам миёнарав ва ҳам он чизе, ки ба 95 фоизи корбарон рост меояд, кам шудан гирифт ва дигар баланд намешавад.

Афсона дар бораи он, ки чӣ тавр несткунии каскадӣ дар Realm бар як оғози тӯлонӣ ғолиб омад

Агар шумо ба диаграммаи ҳафтрӯза нигоҳ кунед, метрикаи _app_start комилан мувофиқ ба назар мерасад ва камтар аз 1 сония аст.

Инчунин бояд илова кард, ки ба таври нобаёнӣ, Firebase огоҳиномаҳо мефиристад, агар арзиши миёнаи _app_start аз 5 сония зиёд бошад. Аммо, чунон ки мебинем, шумо набояд ба ин такя накунед, балки ба таври возеҳ ворид шавед ва онро тафтиш кунед.

Хусусияти махзани Realm дар он аст, ки он як пойгоҳи додаҳои релятсионӣ нест. Сарфи назар аз осонии истифода, шабоҳат ба ҳалли ORM ва пайванди объект, он ҳазфи каскадро надорад.

Агар ин ба назар гирифта нашавад, он гоҳ объектҳои лона гузошташуда ҷамъ мешаванд ва «мерезанд». Пойгоҳи маълумот мунтазам афзоиш хоҳад ёфт, ки ин дар навбати худ ба сустшавӣ ё оғози барнома таъсир мерасонад.

Ман таҷрибаи худро дар бораи чӣ гуна ба зудӣ нест кардани каскади объектҳо дар Realm мубодила кардам, ки ҳанӯз аз қуттӣ берун наомадааст, аммо муддати тӯлонӣ дар бораи он сухан меравад. мегӯянд и мегӯянд. Дар ҳолати мо, ин вақти оғози барномаро хеле тезонд.

Сарфи назар аз баҳс дар бораи пайдоиши наздики ин хусусият, мавҷуд набудани ҳазфи каскадӣ дар Realm аз рӯи тарҳ сурат мегирад. Агар шумо барномаи нав тарҳрезӣ кунед, пас инро ба назар гиред. Ва агар шумо аллакай Realm-ро истифода баред, санҷед, ки оё шумо чунин мушкилот доред.

Манбаъ: will.com

Илова Эзоҳ