Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: АСЕ
Форум на CrossPlatform.RU > Библиотеки > Другие библиотеки
Iron Bug
Хочу представить вам библиотеку, с которой я познакомилась на новой работе: ACE.

Я, конечно, сразу решила провести тестирование новой для меня библиотеки и сравнить её с boost.
Я сравнивала эфффективность работы ACE_Cached_Allocator и boost::pool: замеряла время, требуемое на заполнение пула элементами и очистку пула (по одному элементу).
Я написала тест сравнения работы с пулами памяти. И результат меня поразил: ACE не только быстрее буста, но и эффективнее использует память!

Если интересно, вот тест, который я написала (тест под линь, венды у меня сейчас просто нет в наличии, но можно его быстро перекроить под венду, если заменить блок с установкой риалтайм приоритета у потока),
Раскрывающийся текст

#include <iostream>
#include <boost/pool/object_pool.hpp>
#include <boost/chrono.hpp>

#include "ace/Malloc_T.h"
#include "ace/Synch.h"

#include <unistd.h>
#include <sched.h>
#include <cstdio>

using namespace std;
using namespace boost;
using namespace boost::chrono;

class Foo {
    public:
        void* operator new( size_t, void *location )
        {
            return location;
        }
        void operator delete(void*, void* buff) {}
        void operator delete(void*) {}
    Foo(int i) : _i(i) {}
    private:
        int _i;
};

int main(int argc, char * argv[])
{
    int type = 1;
    if(argc>1)
        type = atoi(argv[1]);
    unsigned long test_number = 1000;
    if(argc>2)
    {
        test_number = (unsigned long)atol(argv[2]);
    }
    Foo **foo = new Foo*[test_number];

    pool<> pool(sizeof(Foo));
    ACE_Cached_Allocator< Foo, ACE_Null_Mutex> *pacepool;
    pacepool = new ACE_Cached_Allocator< Foo, ACE_Null_Mutex>(1);


    high_resolution_clock::time_point tp_start, tp_end;

  
    // setting realtime priority to the current process
    int res;
    struct sched_param initial_sp;

    res = sched_getparam(0, &initial_sp);
    if(res !=0)
    {
        cout << "failed to read priority!" << endl;
        return 0;
    }

    int prio = sched_get_priority_max(SCHED_RR);
    struct sched_param shp;
    shp.sched_priority = prio;//-3;
    res = sched_setscheduler(0,SCHED_RR,&shp);
    if(res != 0)
    {
        cout << "failed to set real time priority!" << endl;
        return 0;
    }

    // checking that the priority was set properly
    res = sched_getparam(0, &initial_sp);
    prio = sched_getscheduler(0);
    cout << prio << "\t" << initial_sp.__sched_priority << endl;


    tp_start = high_resolution_clock::now();
    if(type==1)
    {
        for(unsigned long i=0; i<test_number; i++)
        {
            foo[i] = (Foo*)pool.malloc();
        }
    }
    else if(type==2)
    {
        for(unsigned long i=0; i<test_number; i++)
        {
            foo[i] = (Foo*)pacepool->malloc();
        }
    }

    tp_end = high_resolution_clock::now();
    nanoseconds delta1 = duration_cast<nanoseconds>(tp_end-tp_start);
    tp_start = high_resolution_clock::now();
    if(type==1)
    {
        for(unsigned long i=0; i<test_number; i++)
        {
            pool.free(foo[i]);
        }
    }
    else if(type==2)
    {
        for(unsigned long i=0; i<test_number; i++)
        {
            pacepool->free(foo[i]);
        }
    }
  
    tp_end = high_resolution_clock::now();
    nanoseconds delta2 = duration_cast<nanoseconds>(tp_end-tp_start);
    cout << delta1 << "\t" << delta2 << endl;

    delete pacepool;

    return 0;
}



То есть, по памяти boost занял 1928499200 байт, а ACE - всего 854814720 байт.
Я позже приведу данные, их сейчас нет под рукой - забыла на работе, взяла не те данные :)
Но по памяти выигрыш был в 2.25 раза, а по скорости, при профилированной оптимизации, скорость увеличивалась от 0.6 до 0.8.

Я ещё буду тестировать ACE, ибо меня интересует выбор самой оптимальной библиотеки для работы. Но этот результат меня удивил и неожиданно поколебал мою приверженность к boost'у. Поэтому я решила написать об этом здесь. Может, кто-то проверит тест под вендой: было бы интересно узнать результаты. Правда, я не знаю, как под вендой измерять максимум используемой памяти. Но хотя бы скорость можно сравнить.
Iron Bug
Протестировала дома, на линюксе (с работы результаты взяла не те - они исказились valgrind'ом).
Вот результаты после оптимизации с профилями:
Раскрывающийся текст
Цитата
bla-bla-bla$ sudo ./TestPool 1 1000000
2 99
15715733 nanoseconds 3606376 nanoseconds
bla-bla-bla$ sudo ./TestPool 2 1000000
2 99
11209115 nanoseconds 4830111 nanoseconds

Первый запуск - это boost, второй запуск - ACE.
Дома тестировала на ноуте, под Дебианом. ноут слабенький, поэтому пришлось взять небольшое количество элементов. а на более мощном компе на работе с бОльшим количеством разница получалась ещё более существенная, в пользу ACE.

По памяти вышло 41254912 байта для буста и 32952320 - для ACE.
Litkevich Yuriy
Эдик начинал про неё в Wiki писать: http://www.wiki.crossplatform.ru/index.php/ACE
но потом дело заглохло.
Iron Bug
да, я видела в вики информацию. но не предполагала, что это такая хорошая библиотека.
на новой работе её используют. я решила сравнить её с бустом и результаты меня удивили. конечно, разница иногда не так велика, но я заметила, что чем больше процессоров на машине - тем она существеннее. видимо, ACE хорошо оптимизируется под многопоточность.
единственный минус - довольно скудная документация. точнее, почти никакой документации. но кое-что удалось нарыть. вот, сижу, изучаю возможности новой для меня библиотеки.
у разработчиков ACE поставляется сразу несколько библиотек. я пока с ними знакомлюсь в общих чертах.
ViGOur
Угумс, давно доастаточно с ней работал. ACE заточена под работу с многопоточностью и сетью.
У меня есть книги по ACE, в принципе их можно найти в сети, но если нужно пиши, поделюсь:
Douglas C. Schmidt, Stephen D. Huston - C++ Network Programming, Volume 1: Mastering Complexity with ACE and Patterns
Douglas C. Schmidt, Stephen D. Huston - C++ Network Programming, Volume 2: Systematic Reuse with ACE and Frameworks
Iron Bug
да, я кое-что нарыла на торрентах.
она действительно очень хорошо заточена под многопроцессорные системы и распараллеливание. очень эффективно работает на серверах с несколькими процессорами.
я пока использую и ACE, и boost. где-то побеждает одна библиотека, где-то - другая. на каждый случай я пишу мелкие тесты и сравниваю.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Форум IP.Board © 2001-2024 IPS, Inc.