Разное время работы вектора в Борланд и ВС

Тема в разделе "LANGS.C", создана пользователем systemio, 23 сен 2008.

  1. systemio

    systemio New Member

    Публикаций:
    0
    Регистрация:
    18 мар 2008
    Сообщения:
    98
    вот код:

    //---------------------------------------------------------------------------
    #include <conio.h>
    #include <vector>
    #include <iostream>
    #include "Boost/timer.hpp" // можете заюзать свой таймер
    //---------------------------------------------------------------------------
    struct sS
    {
    std::vector<int*>* v1;
    std::vector<int*>* v2;

    sS(void)
    {
    v1 = new std::vector<int*>();
    v1->reserve(70); // 1
    v2 = new std::vector<int*>();
    v2->reserve(70); // 1
    }

    ~sS(void)
    {
    delete v1; // 2
    delete v2; // 2
    }
    };
    //---------------------------------------------------------------------------
    int main(void)
    {
    std::vector<sS*> v;

    for(int i = 0; i < 20000; ++i)
    v.push_back(new sS());

    boost::timer t;

    for(std::vector<sS*>::iterator i = v.begin(); i != v.end(); ++i)
    delete *i;

    std::cout<<"time = "<<t.elapsed()<<" cek";

    getch();
    return 0;
    }
    //---------------------------------------------------------------------------

    Время работы Borland 6.0 примерно 0-0.016 сек. Зато этот код VC 2003 выполняет !!!АЖ!!! 2 сек.
    Разница в порядках! При этом если закоментировать строки 1 или(и) 2 то ВС выполняет уже лучше, но все-равно на порядок хуже чем борланд. Есть еще одна особенность: если делать reserve(30), reserve(31) для ВС2003, то будет разное время, при чем разница никак не поддается логике.

    Буду ОЧЕНЬ благодарен всем кто откликнется!
     
  2. censored

    censored New Member

    Публикаций:
    0
    Регистрация:
    5 июл 2005
    Сообщения:
    1.615
    Адрес:
    деревня "Анонимные Прокси"
    Debug?
    (/Ox /O2 -- результат 0,016 sec)
     
  3. systemio

    systemio New Member

    Публикаций:
    0
    Регистрация:
    18 мар 2008
    Сообщения:
    98
    АГА дебаг!

    Поставил релиз для ВС - еще медленнее!!! У борланда в релизи тоже самое время!
     
  4. systemio

    systemio New Member

    Публикаций:
    0
    Регистрация:
    18 мар 2008
    Сообщения:
    98
    можно поподробней что это такое, куда вставить?
     
  5. _DEN_

    _DEN_ DEN

    Публикаций:
    0
    Регистрация:
    8 окт 2003
    Сообщения:
    5.383
    Адрес:
    Йобастан
    Молчу, Марьванна, молчу...)))
     
  6. scf

    scf Member

    Публикаций:
    0
    Регистрация:
    12 сен 2005
    Сообщения:
    386
    давай екзешник, собранный в релизе
    может у тебя с системой что?
    Это опции компилятора - подробности в MSDN
    их можно выставить и настройками проекта
    PS: VS2005 - между 16 и 32 мс
     
  7. Ursus

    Ursus Member

    Публикаций:
    0
    Регистрация:
    15 мар 2006
    Сообщения:
    238
    Адрес:
    Russia
    Это наглые попытки systemio опорочить MSVC своим борландом :)
     
  8. systemio

    systemio New Member

    Публикаций:
    0
    Регистрация:
    18 мар 2008
    Сообщения:
    98
    1. Короче я напрямую запустил екзешник от ВС2003 и он показал время 0.032 сек. Вопрос - как сделать чтобы из проекта запускать и наблюдать тоже самое время а не лезть в папку с релиз.

    2. Нашел где можно указывать опции /Ox /O2 - но там можно выбрать только одну из них.

    3. Все равно борланд в 2 раза быстрее - а это существенно!?
     
  9. leo

    leo Active Member

    Публикаций:
    0
    Регистрация:
    4 авг 2004
    Сообщения:
    2.542
    Адрес:
    Russia
    systemio
    GetTickCount и WM_TIMER выдают время с дискретом 0.016 мс (точнее 15.625 мс). Поэтому если ты получаешь цифры 0.016 и 0.032, то реальные задержки при этом могут быть например 0.015 и 0.017 - а это уже не 2 раза и не столь существенно ;)
     
  10. systemio

    systemio New Member

    Публикаций:
    0
    Регистрация:
    18 мар 2008
    Сообщения:
    98
    такой вопрос. сделал

    for(int i = 0; i < 1000000; ++i)
    v.push_back(new sS());

    миллион указателей по 4 байта - т.е. 3,81 мегабайт. Запускаю и таск менеджер показывает всплеск загрузки памяти с 819 Мб до 1,18 Гб потом падает до 826 Мб - почему так?
     
  11. W4FhLF

    W4FhLF New Member

    Публикаций:
    0
    Регистрация:
    3 дек 2006
    Сообщения:
    1.050
    Один объект класса sS не 4 байта точно. Ты что не видишь, что у тебя там два вектора + ты выделяешь 70*2*sizeof(int*) байт в конструкторе?

    + std::vector всегда выделяет больше, чем требуется.
     
  12. W4FhLF

    W4FhLF New Member

    Публикаций:
    0
    Регистрация:
    3 дек 2006
    Сообщения:
    1.050
    а подобный цикл можно было бы заменить одной строкой:

    v.assign(1000000, new Ss());

    или вообще при объявлении память выделить:

    std::vector<sS*> v(1000000, new Ss());
     
  13. systemio

    systemio New Member

    Публикаций:
    0
    Регистрация:
    18 мар 2008
    Сообщения:
    98
    все - понял - затупил!
    Сэнкс
     
  14. systemio

    systemio New Member

    Публикаций:
    0
    Регистрация:
    18 мар 2008
    Сообщения:
    98
    Все-таки остается вопрос: почему я запускаю проект из ВС2003 и жду (несколько секунд) намного дольше чем если бы я запустил экзэшник напрямую (~ 1 секунда), и как это можно исправить? Опять же в борланде проект и экзэшник работают одинаково быстро!
     
  15. leo

    leo Active Member

    Публикаций:
    0
    Регистрация:
    4 авг 2004
    Сообщения:
    2.542
    Адрес:
    Russia
    systemio
    Это м.б. связано с работой кучи. VS юзает виндовый менеджер кучи, который в режиме отладки делает массу дополнительных проверок, в результате чего время на каждый HeapAlloc\HeapFree увеличивается в 2-3 раза. У Бормана же собственный менеджер кучи, который во-первых, работает одинаково как при отладке, так и без, и во-вторых, побыстрее виндового (классический MM раза в 2-3 при условии, что не используется ShareMem и IsMultiThread:=false, а FastMM так и вовсе на порядок быстрее)
    Примерные цифры см. тут
    PS: кстати любителям GlobalAlloc не мешает сравнить цифры Heap.. и Global.. ;)
     
  16. systemio

    systemio New Member

    Публикаций:
    0
    Регистрация:
    18 мар 2008
    Сообщения:
    98
    Лана - ок. Спасибо за ответы!
     
  17. _basmp_

    _basmp_ New Member

    Публикаций:
    0
    Регистрация:
    10 июл 2005
    Сообщения:
    2.939
    leo
    Уже много раз слышал про борландовский кучменеджер. А поподробнее об его устройстве чтонить известно? (никаких борланд продуктов в дм не стоит)
     
  18. spa

    spa Active Member

    Публикаций:
    0
    Регистрация:
    9 мар 2005
    Сообщения:
    2.240
    borlndmm.dll только они падлы не дают его влинковать в пргу, а тоскать с собой както не хочеться... мож кто знает как ег отключить
     
  19. CyberManiac

    CyberManiac New Member

    Публикаций:
    0
    Регистрация:
    2 сен 2003
    Сообщения:
    2.473
    Адрес:
    Russia
    SPA, поставь Билдер 2006 или 2007 - там другой менеджер памяти, а с borlndmm.dll полностью покончено.
     
  20. leo

    leo Active Member

    Публикаций:
    0
    Регистрация:
    4 авг 2004
    Сообщения:
    2.542
    Адрес:
    Russia
    _basmp_
    Описалово классического getmem.inc см. Менеджер памяти Delphi. Сам исходник прилагается к BCB\Delphi версий 6-7 (и ниже)

    С версий 2006 юзается FastMM от Pierre le Riche: краткая справка от автора тут, скачать с исходниками можно тут