Sobes.tech
Middle

Оё медонӣ, ки чӣ гуна кор мекунад корт-кеш?

sobes.tech AI

Ҷавоб аз AI

Картаи ёддоштӣ (Memory Cache) дар Android — механизмест барои нигоҳ доштани маълумот дар хотираи оперативии дастгоҳ барои дастрасии зуд. Он асос ёфтааст ба принсипҳои кеши асоциативӣ.

Чӣ гуна кор мекунад:

  1. Пурсиши маълумот: Ҳангоми дархост кардани маълумоте, ки метавонад кеш шавад (масалан, тасвир аз шабака ё натиҷаи амалиёти мураккаб), барнома аввал кешро санҷида мебинад.
  2. Ҷустуҷӯ дар кеш: Агар маълумот дар кеш ёфтанӣ бошад (яъне, калиди дархост бо калиди дар кеш мувофиқат мекунад), онҳо фавран баргардонида мешаванд, бо ин роҳ аз амалиётҳои даромад-баромад ё ҳисобкунии сустӣ канорагирӣ мешавад. Инро "cache hit" меноманд.
  3. Хатои кеш (Cache Miss): Агар маълумот дар кеш ёфтанӣ набошад ("cache miss"), барнома онҳоро аз манбаи аслӣ мегирад (шабака, базаи додаҳо ва ғайра).
  4. Насб кардан дар кеш: Пас аз гирифтани маълумот, онҳо ба кеш ҷойгир карда мешаванд барои дархостҳои оянда бо ҳамин калид.
  5. Вуруд (Cache Eviction): Кеш дорои андозаи маҳдуд аст. Вақте ки он пур мешавад, унсурҳои кӯҳна ё камтар истифодашуда хориҷ карда мешаванд, то ҷой барои навҳоро холӣ кунанд. Алгоритмҳои маъмул барои хориҷ кардан LRU (Least Recently Used — камтар истифодашуда) ва LFU (Least Frequently Used — камтар истифодашуда) мебошанд.

Маслиҳат дар Android бо истифода аз LruCache:

// Эҷоди LruCache бо андозаи максималӣ
private LruCache<String, Bitmap> memoryCache;

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    // Дастрас кардани андозаи максималии хотираи дастрас барои барнома (дар KB)
    final int maxMemory = (int) (Runtime.getRuntime().maxMemory() / 1024);

    // Истифодаи 1/8 аз хотираи дастрас барои кеш
    final int cacheSize = maxMemory / 8;

    memoryCache = new LruCache<String, Bitmap>(cacheSize) {
        @Override
        protected int sizeOf(String key, Bitmap bitmap) {
            // Метод барои ҳисоб кардани андозаи ҳар як унсури кеш дар воҳидҳо,
            // мувофиқи андозаи кеш (ин ҷо - KB)
            return bitmap.getByteCount() / 1024;
        }
    };
}

// Илова кардани унсур ба кеш
public void addBitmapToMemoryCache(String key, Bitmap bitmap) {
    if (getBitmapFromMemCache(key) == null) {
        memoryCache.put(key, bitmap);
    }
}

// Гирифтани унсур аз кеш
public Bitmap getBitmapFromMemCache(String key) {
    return memoryCache.get(key);
}