HeapFree очень медленный.

Тема в разделе "WASM.WIN32", создана пользователем slesh, 29 янв 2012.

  1. slesh

    slesh New Member

    Публикаций:
    0
    Регистрация:
    6 фев 2009
    Сообщения:
    214
    Странно, почему так происходит? HeapFree работает в 46 раз медленнее чем HeapAlloc. Что очень огорчает. Нельзя ли как-то ускорить его работу? Необходимо выделять быстро много маленьких блоков (20/32 байта)

    А то больше времени тратится на освобождение памяти, чем на всю работу
     
  2. Pavia

    Pavia Well-Known Member

    Публикаций:
    0
    Регистрация:
    17 июн 2003
    Сообщения:
    2.409
    Адрес:
    Fryazino
    Освобождение требует объединение блоков что занимает время. Ну не в 46 раз, раз в 10 точно.

    Написать свой менеджер.
    Зависит от задачи, можно динамическим массивом обойтись.

    Можешь ещё эту тему почитать может что интересного найдёшь, а может и нет.
    http://www.delphimaster.ru/cgi-bin/forum.pl?id=1323678289&n=3
     
  3. reverser

    reverser New Member

    Публикаций:
    0
    Регистрация:
    27 янв 2004
    Сообщения:
    615
    Сделай простенький пул-аллокатор, облегчишь жизнь и себе и системе.
     
  4. AsmGuru62

    AsmGuru62 Member

    Публикаций:
    0
    Регистрация:
    12 сен 2002
    Сообщения:
    689
    Адрес:
    Toronto
    slesh
    Как измерялось это замедление?
    Мерили на отладочной версии или нет?

    Для аллокаторов малых длин лучше подходит отдельный heap.
    Тогда не надо HeapFree - просто при удалении всего объекта, где
    выделено много малых блоков - вызываем HeapDestroy.
     
  5. zxcv

    zxcv New Member

    Публикаций:
    0
    Регистрация:
    30 дек 2011
    Сообщения:
    257
    void* my_heap[32];

    void my_init(){
    int i;
    for(i = 0; i < 32; my_heap[i++] = (void*)0);
    }

    void* my_alloc(unsigned size){
    unsigned i;
    unsigned* p;
    for(i = 5; 1 << i > size + sizeof(MAGIC) + sizeof(void*) + sizeof(unsigned); i++);
    if(my_heap){
    p = my_heap;
    my_heap = p[1];
    }else{
    p = (unsigned*)malloc(1 << i);
    }
    *p++ = MAGIC;
    p++;
    *p++ = i;
    return (void*)p;
    }

    int my_free(void* mem){
    unsigned i;
    unsigned* p = (unsigned*)mem;
    int rez = -1;
    p -= 3;
    __try{
    if(*p == MAGIC){
    i = p[2];
    if(i < 32){
    p[1] = my_heap;
    my_heap = p;
    rez = 0;
    }
    }
    }
    __except(){
    //.... Err not my_mem ptr
    }
    return rez;
    }

    должно пойти довольно быстро если не совать в му_фри левую память (проверьте только)