Модераторы: Daevaorn

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> array, vector или new...[], что лучше??? 
:(
    Опции темы
boriska
Дата 21.4.2007, 19:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 36
Регистрация: 7.12.2006
Где: kharkov

Репутация: нет
Всего: нет



разница получается из-за того что при
Цитата

std::vector <int> aArray(50000000);

время тратиться на создание временного объекта, инициализацию этим объектом, а потом удаление его.

Даже при
 
Код

aArray.reserve(50000000);
for(int i = 0; i < 50000000; ++i)
        aArray[i] = 5;

у меня натикало 11968, а вариант с динамическим выделением - всего 890  smile 
PM MAIL ICQ   Вверх
archimed7592
Дата 21.4.2007, 19:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Архимед
****


Профиль
Группа: Завсегдатай
Сообщений: 2531
Регистрация: 12.6.2004
Где: Moscow

Репутация: 58
Всего: 93



Код
#include <iostream>
#include <cstdlib>
#include <ctime>
#include <vector>

using std::cout;
using std::cin;
using std::endl;
using std::string;

int main()
{
    const std::size_t count = 100000000;
    {
#if defined (TEST_VECTOR)
        std::vector <int> Array(count);//26432
#elif defined (TEST_NEW)
        int *Array = new int[count];//1572
#else
#error please define TEST_VECTOR or TEST_NEW
#endif
    clock_t start = clock();
        for(std::size_t i = 0; i < count; ++i)
            Array[i] = 5;
    cout << (clock() - start) << endl;
#if defined (TEST_NEW)
        delete [] Array;
#endif
    }

    return EXIT_SUCCESS;
}

g++-3.4.2+stlport-5.1.3 в релизе(про дебаг отдельно) даёт 234 против 343 (vector и new соответственно)... smile 
насчёт дебага: прелесть контейнеров в том, что, в дебаг-режиме они проверяют всё на логические ошибки... к примеру, если после изменения контейнера использовать итератор, полученный до этого изменения, то он(итератор) кинет исключение(smart-iterator), в релизе же даже не пикнет(fast-iterator)...

насчёт менеджера памяти: изначальный вариант я не поленился запустить 25 раз (только new, vector даже пробовать не стал)... каждый раз результат был всё меньше и меньше, причём, разрыв между первым запуском и последним был чуть ли не в 10 раз... короче говоря результат сильно зависит и от менеджера памяти и от операционной системы и от объёма оперативной памяти...


--------------------
If you have an apple and I have an apple and we exchange apples then you and I will still each have one apple. But if you have an idea and I have an idea and we exchange these ideas, then each of us will have two ideas.
© George Bernard Shaw
PM Jabber   Вверх
nickless
Дата 21.4.2007, 19:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Гентозавр
****


Профиль
Группа: Участник Клуба
Сообщений: 2976
Регистрация: 29.8.2005
Где: Germany

Репутация: 19
Всего: 181



Цитата(boriska @  21.4.2007,  18:09 Найти цитируемый пост)
тратиться на создание временного объекта, инициализацию этим объектом, а потом удаление его

Ничего там не тратится, это же не конструктор копирования.
Цитата(boriska @  21.4.2007,  18:09 Найти цитируемый пост)
у меня натикало 11968, а вариант с динамическим выделением - всего 890

Оптимизацию включи smile 
Скорость нужно проверять на релизной сборке, потому что именно она будет потом использоваться.


--------------------
user posted image

Real men don't use backups, they post their stuff on a public ftp server and let the rest of the world make copies
- Linus Torvalds
PM MAIL   Вверх
Mayk
Дата 21.4.2007, 19:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


^аВаТаР^ сообщение>>
****


Профиль
Группа: Участник
Сообщений: 2616
Регистрация: 22.5.2005
Где: за границей разум а

Репутация: 45
Всего: 134



Цитата(nickless @  21.4.2007,  23:26 Найти цитируемый пост)

Ничего там не тратится, это же не конструктор копирования.

НЕ ВЕРНО. 
Запись vector<int> (50000) создает вектор из 50000 ПРОИНИЦИАЛИЗИРОВАННЫХ элементов.

Цитата(stl_vector.h)

      /**
       *  @brief  Create a %vector with default elements.
       *  @param  n  The number of elements to initially create.
       *
       *  This constructor fills the %vector with @a n copies of a
       *  default-constructed element.
       */
      explicit
      vector(size_type __n)


Это сообщение отредактировал(а) Mayk - 21.4.2007, 19:31


--------------------
 Здесь был кролик. Но его убили.
Человеки < кроликов, йа считаю.
PM MAIL WWW ICQ   Вверх
archimed7592
Дата 21.4.2007, 19:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Архимед
****


Профиль
Группа: Завсегдатай
Сообщений: 2531
Регистрация: 12.6.2004
Где: Moscow

Репутация: 58
Всего: 93



кстати, ещё одна "мелочь": вектор имеет инициализированные значения (0)... отсюда и разница такая... а вот как объяснить, что в цикле записи вектор работает быстрее чем дин-массив я затрудняюсь... но говорит это только в его пользу smile

Добавлено через 40 секунд
Mayk, опередил smile


--------------------
If you have an apple and I have an apple and we exchange apples then you and I will still each have one apple. But if you have an idea and I have an idea and we exchange these ideas, then each of us will have two ideas.
© George Bernard Shaw
PM Jabber   Вверх
boriska
Дата 21.4.2007, 19:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 36
Регистрация: 7.12.2006
Где: kharkov

Репутация: нет
Всего: нет



nickless - за второе замечание спасибо
а по поводу 
Цитата

Ничего там не тратится, это же не конструктор копирования.

готов спорить....
to Mayk -  smile 



Это сообщение отредактировал(а) boriska - 21.4.2007, 19:38
PM MAIL ICQ   Вверх
nickless
Дата 21.4.2007, 19:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Гентозавр
****


Профиль
Группа: Участник Клуба
Сообщений: 2976
Регистрация: 29.8.2005
Где: Germany

Репутация: 19
Всего: 181



Цитата(Mayk @  21.4.2007,  18:30 Найти цитируемый пост)
НЕ ВЕРНО

Я вообще имел ввиду 
Цитата(boriska @  21.4.2007,  18:09 Найти цитируемый пост)
создание временного объекта
и
Цитата(boriska @  21.4.2007,  18:09 Найти цитируемый пост)
а потом удаление его

Какой именно временный объект там создаётся? int?

То что вектор инициализирует память, с этим я не спорю.


--------------------
user posted image

Real men don't use backups, they post their stuff on a public ftp server and let the rest of the world make copies
- Linus Torvalds
PM MAIL   Вверх
vinter
Дата 21.4.2007, 22:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Explorer
****


Профиль
Группа: Завсегдатай
Сообщений: 2735
Регистрация: 1.4.2006
Где: Н.Новгород

Репутация: 13
Всего: 56



Цитата(archimed7592 @  21.4.2007,  19:33 Найти цитируемый пост)
кстати, ещё одна "мелочь": вектор имеет инициализированные значения (0)... отсюда и разница такая... а вот как объяснить, что в цикле записи вектор работает быстрее чем дин-массив я затрудняюсь... но говорит это только в его пользу 

то что он инициализируется "это его проблемы", тесты закончились у всех поразному, у меня new дало двойной прирост памяти.
так что я остаюсь при своем мнениии.


--------------------
Мой блог
PM MAIL WWW   Вверх
JackYF
Дата 21.4.2007, 23:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


полуавантюрист
****


Профиль
Группа: Участник
Сообщений: 5814
Регистрация: 28.8.2004
Где: страна тысячи озё р

Репутация: 18
Всего: 162



Цитата(apook @  21.4.2007,  17:38 Найти цитируемый пост)
vector классный массив он лучше чем array

Vector нужен, когда количество элементов заранее не известно. Точка.

Цитата(apook @  21.4.2007,  17:38 Найти цитируемый пост)
этот параноидальный скоростной погоня за скорост

Увеличение скорости даже на 10% иногда очень важно. А уж в данному случае, когда прирост 50-100%...

Цитата(archimed7592 @  21.4.2007,  17:54 Найти цитируемый пост)
это просто удобная обёртка...

В обертках, кроме того, могут использоваться дополнительные переменные для удобства реализации остальных функций.

Цитата(archimed7592 @  21.4.2007,  19:33 Найти цитируемый пост)
вектор имеет инициализированные значения (0)... отсюда и разница такая..

вот... иногда инициализация такая не нужна.

Цитата(vinter @  21.4.2007,  18:37 Найти цитируемый пост)
компилилось в VS2003, дебаг  

Ну а тут и ты не прав... Кто же в дебаге скорость проверяет? Инлайнинг функций-то в дебаге не производится... как минимум. А, уже сказали до меня по этому поводу...
А вообще по ходу поддерживаю. Если размер заранее известен, то даже 50% прирост скорости весьма существенен. Векторное - векторному.
В данном случае использовать вектор ради всего лишь автоматического удаления... имхо, не то.




--------------------
Пожаловаться на меня как модератора можно здесь.
PM MAIL Jabber   Вверх
Lomir
Дата 21.4.2007, 23:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 58
Регистрация: 30.1.2007
Где: Lithuania::Kaunas

Репутация: 1
Всего: 1



50000000 Это слишком большое число для масивов, т.к. время работы зависит от свободной памяти, распределение страниц, виртуальной памяти и т.д.
У меня на VS 2005 1 раз вектор работал 2сек, 2 раз около 1,5 все последущие 0,7 сек.
Масив 0,5 сек.
Привиду свой тест:
Код

int main()
{
    const int size = 1000000;            
    {
        clock_t start = clock();
        for (int j = 0; j < 100; ++j)
        {
            std::vector<int> v;
            v.reserve(size);
            int i = 0;
            for (int i = 0; i < size; ++i)
                v.push_back(i);
        }
        cout << "Vector Time: " << (clock() - start) << "\n";
    }
    {
        clock_t start = clock();
        for (int j = 0; j < 100; ++j)
        {
            int* arr = new int[size];
            for (int i = 0; i < size; ++i)
                arr[i] = i;
            delete[] arr;
        }
        cout << "Array Time: " << (clock() - start) << endl;    
    }
    return 0;
}

Вектор: 1,7сек
Масив: 1,5сек

Вектор немного отстает, но если им правильно пользоваться то отставание не большое - максимум процентов 20-35.
ИМХО во всех программах особо не чуствительных к скорости лучши пользоваться вектором. Кроме того вектор непожирает лишнюю память, и не инициализирует обьекты пока они не нужны.
Например зачем нам иметь масив из 100000 обьектов (причем все будут инициализированы), если мы пользуем в 80% тока 100.

Это сообщение отредактировал(а) Lomir - 21.4.2007, 23:46
PM MAIL ICQ Skype   Вверх
JackYF
Дата 21.4.2007, 23:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


полуавантюрист
****


Профиль
Группа: Участник
Сообщений: 5814
Регистрация: 28.8.2004
Где: страна тысячи озё р

Репутация: 18
Всего: 162



Цитата(Lomir @  21.4.2007,  23:35 Найти цитируемый пост)
Кроме того вертор непожирает лишнюю память, и не инициализирует обьекты пока они не нужны.


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

Намного быстрее объявить 1000000 элементов сразу без инициализация, чем потом 20 раз перераспределять и/или выделять поблоково эти данные.

Массив динамический вообще не инициализирует память...

Цитата(Lomir @  21.4.2007,  23:35 Найти цитируемый пост)
но если им правильно пользоваться то отставание не большое - максимум процентов 25-35.

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



--------------------
Пожаловаться на меня как модератора можно здесь.
PM MAIL Jabber   Вверх
archimed7592
Дата 21.4.2007, 23:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Архимед
****


Профиль
Группа: Завсегдатай
Сообщений: 2531
Регистрация: 12.6.2004
Где: Moscow

Репутация: 58
Всего: 93



Lomir, ты не понял... push_back мы не используем... мы ставим и вектор и new в равные условия - заранее сообщаем длину массива и используем оператор [] для доступа к эдементам...

Цитата(vinter @  21.4.2007,  22:36 Найти цитируемый пост)
у меня new дало двойной прирост памяти.
ммм... про прирост памяти ты умолчал...

насчёт "его проблемы" - если я не ошибаюсь, то эта "проблема" решается путём смены аллокатора (второй шаблонный параметр вектора...)

Цитата(vinter @  21.4.2007,  22:36 Найти цитируемый пост)
так что я остаюсь при своем мнениии. 
угу, а то, что при доступе к объектам скорость +30% (хотя, я это объяснить не могу) тебя не смущает...


Цитата(JackYF @  21.4.2007,  23:35 Найти цитируемый пост)
Vector нужен, когда количество элементов заранее не известно. Точка.
кому точка... кому нет... лично я везде, где это возможно юзаю стандартные контейнеры и ничуточку не сожалею...


Цитата(JackYF @  21.4.2007,  23:35 Найти цитируемый пост)
В обертках, кроме того, могут использоваться дополнительные переменные для удобства реализации остальных функций.

из-за 4-40 байт ты готов пожертвовать всеми этими прелестями?

Цитата(JackYF @  21.4.2007,  23:35 Найти цитируемый пост)
вот... иногда инициализация такая не нужна.
а, что, если от неё можно избавится? ;)


ну и в заключении: кто-нибудь может объяснить то, что доступ к элементам для вектора быстрее, чем для массива созданного с помощью new?


--------------------
If you have an apple and I have an apple and we exchange apples then you and I will still each have one apple. But if you have an idea and I have an idea and we exchange these ideas, then each of us will have two ideas.
© George Bernard Shaw
PM Jabber   Вверх
Anikmar
Дата 22.4.2007, 00:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2513
Регистрация: 26.11.2006
Где: Санкт-Петербург

Репутация: 9
Всего: 59



Достаточно прикольный спор получился.
Мне кажется что-то не так - ведь вектор изнутри организован стандартными функциями.

Я уже в свое время проводил тест: какой доступ быстрее через указатель или через скобки.
Скобки оказались ощутимо быстрее. Но этот результат получился только при приближении задачи к реальной - вставке дополнительных команд в цикл. Ведь в реальности нет задач просто прогнать цикл по массиву без каких-либо действий.

Мне кажется, что в векторе очень хорошо используются регистровые переменные для настройки оптимизатора. Так как тест проводился в голом виде - просто индексация, то вектор и показал с оптимизатором себя быстрее. На самом деле время доступа у массива и вектора не должно отличаться - так как они используют одинаковые механизмы. В живой задаче, где между изменениями индекса будут находиться другие команды, которые не позволят оптимизатору сохранить регистры вектор должен быть медленнее априоре - так как у него обязательно будут дополнительные механизмы обслуживания сервиса.

ИМХО:
Для большинства задач вектор подходит идеально, но как любая универсальная штуковина она просто ОБЯЗАНА съедать больше ресурсов - за удобство надо платить. 
В задачах, где рессурсы критичны, собственное хранилище данных несомненно будет более экономичное. Любой мастер своего дела (в любой специальности) имеет как наборы стандартных инструментов, так и собственные приспособления, с помощью которых он достигает лучшего результата. Так и в программировании. Так что правы все стороны.  smile 
PM MAIL ICQ   Вверх
JackYF
Дата 22.4.2007, 01:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


полуавантюрист
****


Профиль
Группа: Участник
Сообщений: 5814
Регистрация: 28.8.2004
Где: страна тысячи озё р

Репутация: 18
Всего: 162



Цитата(archimed7592 @  21.4.2007,  23:53 Найти цитируемый пост)
угу, а то, что при доступе к объектам скорость +30%

да как в принципе такое может быть? что может быть быстрее доступа (прямого) по памяти? (на user-уровне).
Не верю. Разве что кэширование какое-нибудь, блин... причем хитро, очень хитро работающее...


Цитата(archimed7592 @  21.4.2007,  23:53 Найти цитируемый пост)
Цитата(JackYF @  21.4.2007,  23:35 Найти цитируемый пост)
вот... иногда инициализация такая не нужна.
а, что, если от неё можно избавится? ;)


Геморрой, имхо. В массиве ничего дополнительно делать не надо.


Цитата(archimed7592 @  21.4.2007,  23:53 Найти цитируемый пост)
из-за 4-40 байт ты готов пожертвовать всеми этими прелестями?

Какими? Автоматическое удаление? В данном случае - выделки не стоит.

Цитата(archimed7592 @  21.4.2007,  23:53 Найти цитируемый пост)
угу, а то, что при доступе к объектам скорость +30% (хотя, я это объяснить не могу) т

выложи полный код еще раз (если он изменился), на котором ты получил +30%. А я у себя проверю... что получится.



--------------------
Пожаловаться на меня как модератора можно здесь.
PM MAIL Jabber   Вверх
vinter
Дата 22.4.2007, 08:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Explorer
****


Профиль
Группа: Завсегдатай
Сообщений: 2735
Регистрация: 1.4.2006
Где: Н.Новгород

Репутация: 13
Всего: 56



Цитата(archimed7592 @  21.4.2007,  23:53 Найти цитируемый пост)
ммм... про прирост памяти ты умолчал...

тьфу..описался яsmile не памяти ,а скорости


--------------------
Мой блог
PM MAIL WWW   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0656 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.