1. Си / Говнокод #4866

    +140

    1. 01
    2. 02
    3. 03
    4. 04
    5. 05
    6. 06
    7. 07
    8. 08
    9. 09
    10. 10
    11. 11
    12. 12
    13. 13
    14. 14
    15. 15
    16. 16
    17. 17
    18. 18
    19. 19
    20. 20
    21. 21
    22. 22
    23. 23
    24. 24
    25. 25
    26. 26
    27. 27
    28. 28
    29. 29
    30. 30
    31. 31
    32. 32
    33. 33
    34. 34
    35. 35
    36. 36
    37. 37
    38. 38
    39. 39
    40. 40
    41. 41
    42. 42
    43. 43
    44. 44
    45. 45
    46. 46
    47. 47
    48. 48
    49. 49
    50. 50
    ZEB_CALLBACK ZEB_CACHE_GetPage(ZEB_PagesCache *pPagesCache, ZEB_PAGEIDX fpPageIndex, void **ppCachedPageAdress)
    {  
      ZEB_WORD i; 
      for(i = 0; i < pPagesCache->loadedCount; i++)
      {
        if(pPagesCache->pDescriptors[i].fpPosition == fpPageIndex)
        {
          pPagesCache->pDescriptors[i].hitPoints++;
          (*ppCachedPageAdress)=(pPagesCache->pCache)+(i<<(pPagesCache->pageRatio)); //выдаю адрес подгруженной страницы в кэше
          return ZEBCB_GOOD;
        }
      }
      // запрошенная страница все еще не найдена} 
      //если страницы нету - то проверяем - есть ли свободный слот, а если нет слotа, то проводим операцию по выпиливанию страницы с наименьшим ХП 
      if( pPagesCache->loadedCount < pPagesCache->capacity )
      {//если слот еще есть то загружаем в позицию края - это loadedCount и увеличиваем его на 1
        pPagesCache->pDescriptors[pPagesCache->loadedCount].fpPosition = fpPageIndex; //указываем реальный адрес в соусе
        pPagesCache->pDescriptors[pPagesCache->loadedCount].hitPoints = 1;  //ХП ставим в 1
        ZEB_CACHE_MechMountPage(pPagesCache,pPagesCache->loadedCount,fpPageIndex);//загружаем эту страницу в кэш (позиция соответствует индексу дескриптора) 
        (*ppCachedPageAdress)=(pPagesCache->pCache) + ((pPagesCache->loadedCount) << (pPagesCache->pageRatio)); //получаем адрес страницы  
        pPagesCache->loadedCount++; //увеличиваем количество загруженных страниц  
        return ZEBCB_GOOD;
      }else //TODO: елсе не нужен     // Почему не нужен? (2010 07 12)    //Не знаю (2010 07 28)
      {//если свободных слотов нет - то проводим поиск наименьшего хп и выпиливаем его, загружая на его место новый дескриптор и страницу
        //поиск наименбшего хп
        ZEB_WORD 
         register minHP,
         register minDIDX  //Descriptor InDeX
         ;    
        minHP = pPagesCache->pDescriptors[0].hitPoints;
        minDIDX = 0;
        for(i = 1; i < pPagesCache->capacity; i++)
        {
          if(pPagesCache->pDescriptors[i].hitPoints < minHP)
          {
            minHP = pPagesCache->pDescriptors[i].hitPoints;
            minDIDX = i;
          }
        }
        //страница в любос случае найдена - выпиливаем ее - сохраняя ее в сурс обратно
        ZEB_CACHE_MechUnmountPage(pPagesCache,minDIDX,pPagesCache->pDescriptors[minDIDX].fpPosition); 
        //и на ее место грузим новый дескриптор и саму страницу
        pPagesCache->pDescriptors[minDIDX].fpPosition = fpPageIndex; //указываем реальный адрес в соусе   //TODO: Нужно запихивать дескрипторы в отдельный массив и обращаться по указателю, потом это дело можно сортировать для ускорения поиска страниц. Режимы сортировок - максимум и минимум: 1 - для быстрого обращения к наиболее часто используемым страницам, 2 - для быстрого выпиливания менее используемых страниц. (2010 07 28)
        pPagesCache->pDescriptors[minDIDX].hitPoints = 1;  //ХП ставим в 1 
        //кэшируем требуемую страницу
        ZEB_CACHE_MechMountPage(pPagesCache,minDIDX,fpPageIndex);    
        (*ppCachedPageAdress)=(pPagesCache->pCache) + ((pPagesCache->loadedCount) << (pPagesCache->pageRatio)); //получаем адрес страницы  
        return ZEBCB_GOOD;
      }
    }

    Господа - я не уверен говнокод ли это, но вы как бесспорные эксперты в области обнаружения ГК дайте свое заключение. Метод получает страницу из кэша. Страницы фиксированного размера и кэшируются из файла. Буфер под кэш - определяется один раз при создании как единый динамически полученный массив. Код кодил ОП.

    Запостил: CreatorOfBullshit, 08 Декабря 2010

    Комментарии (5) RSS

    • Вот это понравилось:
      //TODO: елсе не нужен // Почему не нужен? (2010 07 12) //Не знаю (2010 07 28)
      Ответить
    • говно. в кэше переиспользуется слот с самой мало используемой страницей. это даже не традиционный LRU. например только что положеная в кэш страница может быть выкинута уже следующим же вызовом - в то время как страница показаная пару раз день назад будет сидеть.

      http://en.wikipedia.org/wiki/Cache_algorithms#Random_Replacement - даже это будет иметь более высокую производительность в большинстве сценарием. по крайней мере отсутсвуют явные кривости, которые может демонстрировать в реальной жизне вышеприведенный алгоритм.
      Ответить
    • >Код кодил ОП.
      Код постил кеп.
      if( <...>)
        {
      <blah-blah-blah   >
      return <some_shit>;
        }else 
      
      //TODO: елсе не нужен     // Почему не нужен? (2010 07 12)    //Не знаю (2010 07 28)

      Но замечу, нынче на гк такой смешной говнотреш редко попадается.
      Ответить

    Добавить комментарий