crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )

 
Ответить в данную темуНачать новую тему
> АСЕ, Кросслатформенная С++ библиотека
Iron Bug
  опции профиля:
сообщение 19.12.2013, 17:18
Сообщение #1


Профессионал
*****

Группа: Модератор
Сообщений: 1611
Регистрация: 6.2.2009
Из: Yekaterinburg
Пользователь №: 533

Спасибо сказали: 219 раз(а)




Репутация:   12  


Хочу представить вам библиотеку, с которой я познакомилась на новой работе: 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 - 19.12.2013, 19:44
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Iron Bug
  опции профиля:
сообщение 19.12.2013, 19:41
Сообщение #2


Профессионал
*****

Группа: Модератор
Сообщений: 1611
Регистрация: 6.2.2009
Из: Yekaterinburg
Пользователь №: 533

Спасибо сказали: 219 раз(а)




Репутация:   12  


Протестировала дома, на линюксе (с работы результаты взяла не те - они исказились 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
  опции профиля:
сообщение 21.12.2013, 10:22
Сообщение #3


разработчик РЭА
*******

Группа: Сомодератор
Сообщений: 9669
Регистрация: 9.1.2008
Из: Тюмень
Пользователь №: 64

Спасибо сказали: 807 раз(а)




Репутация:   94  


Эдик начинал про неё в Wiki писать: http://www.wiki.crossplatform.ru/index.php/ACE
но потом дело заглохло.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Iron Bug
  опции профиля:
сообщение 21.12.2013, 11:14
Сообщение #4


Профессионал
*****

Группа: Модератор
Сообщений: 1611
Регистрация: 6.2.2009
Из: Yekaterinburg
Пользователь №: 533

Спасибо сказали: 219 раз(а)




Репутация:   12  


да, я видела в вики информацию. но не предполагала, что это такая хорошая библиотека.
на новой работе её используют. я решила сравнить её с бустом и результаты меня удивили. конечно, разница иногда не так велика, но я заметила, что чем больше процессоров на машине - тем она существеннее. видимо, ACE хорошо оптимизируется под многопоточность.
единственный минус - довольно скудная документация. точнее, почти никакой документации. но кое-что удалось нарыть. вот, сижу, изучаю возможности новой для меня библиотеки.
у разработчиков ACE поставляется сразу несколько библиотек. я пока с ними знакомлюсь в общих чертах.

Сообщение отредактировал Iron Bug - 21.12.2013, 11:14
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
ViGOur
  опции профиля:
сообщение 14.1.2014, 13:08
Сообщение #5


Мастер
******

Группа: Модератор
Сообщений: 3296
Регистрация: 9.10.2007
Из: Москва
Пользователь №: 4

Спасибо сказали: 231 раз(а)




Репутация:   40  


Угумс, давно доастаточно с ней работал. 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
  опции профиля:
сообщение 15.1.2014, 0:39
Сообщение #6


Профессионал
*****

Группа: Модератор
Сообщений: 1611
Регистрация: 6.2.2009
Из: Yekaterinburg
Пользователь №: 533

Спасибо сказали: 219 раз(а)




Репутация:   12  


да, я кое-что нарыла на торрентах.
она действительно очень хорошо заточена под многопроцессорные системы и распараллеливание. очень эффективно работает на серверах с несколькими процессорами.
я пока использую и ACE, и boost. где-то побеждает одна библиотека, где-то - другая. на каждый случай я пишу мелкие тесты и сравниваю.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

Быстрый ответОтветить в данную темуНачать новую тему
Теги
Нет тегов для показа


1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0




RSS Текстовая версия Сейчас: 18.4.2024, 9:22