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

Поиск:

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


666
**


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

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



Согласен с Lomir'ом на счет размера массива: он должен быть не слишком большим, чтобы не сказывалось обращение к свопу. Только в его варианте нужно вместо push_back обращаться к элементам по индексам. Тогда скорость работы вектора и массива будут совершенно одинаковыми (с учетом статистических погрешностей) - проверено на VS 2003.
PM MAIL   Вверх
Vyacheslav
Дата 22.4.2007, 17:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 2124
Регистрация: 25.3.2002
Где: Москва

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



И в конце концов, если мы гонимся за эффективностью и не хотим отказываться от удобств, предоставляемых вектором, кто мешает обращаться с ним, как с массивом? smile
Код

 #if defined (TEST_VECTOR)
        std::vector <int> Array(count);
        int *pArray = &Array[0]; 
#elif defined (TEST_NEW)
        int *pArray = new int[count];
#else
#error please define TEST_VECTOR or TEST_NEW
#endif
    clock_t start = clock();
        for(std::size_t i = 0; i < count; ++i)
            *(pArray + i) = 5;



--------------------
С уважением, Вячеслав Ермолаев
PM MAIL WWW ICQ   Вверх
archimed7592
Дата 22.4.2007, 17:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Архимед
****


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

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



Цитата(Anikmar @  22.4.2007,  00:49 Найти цитируемый пост)
так как у него обязательно будут дополнительные механизмы обслуживания сервиса.
господа, ткните пальцем, где дополнительные механизмы!
точнее они есть, но если их не использовать (работать так же как и с массивом)

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

Цитата(JackYF @  22.4.2007,  01:10 Найти цитируемый пост)
Геморрой, имхо. В массиве ничего дополнительно делать не надо
вектор - тоже геморрой... но он уже готовый... точно также как и готовые в boost пулы... также, как и этот аллокатор, который можно сделать один раз и не парится

Цитата(JackYF @  22.4.2007,  01:10 Найти цитируемый пост)
Какими? Автоматическое удаление?
универсальность хотя бы... ну это каждому по вкусу...

Цитата(JackYF @  22.4.2007,  01:10 Найти цитируемый пост)
выложи полный код еще раз (если он изменился), на котором ты получил +30%. А я у себя проверю... что получится.

щёлк


--------------------
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, 17:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата(archimed7592 @  22.4.2007,  17:36 Найти цитируемый пост)
господа, ткните пальцем, где дополнительные механизмы!
точнее они есть, но если их не использовать (работать так же как и с массивом)


А что, в векторе нет контроля выхода за пределы индекса?
PM MAIL ICQ   Вверх
Daevaorn
Дата 22.4.2007, 17:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2155
Регистрация: 29.11.2004
Где: Москва

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



Цитата(Anikmar @  22.4.2007,  18:51 Найти цитируемый пост)
А что, в векторе нет контроля выхода за пределы индекса?

только в методе at(size_t)
PM MAIL WWW   Вверх
nickless
Дата 22.4.2007, 17:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



Цитата(Anikmar @  22.4.2007,  16:51 Найти цитируемый пост)
А что, в векторе нет контроля выхода за пределы индекса?

есть, но не во всех методах, например в operator[] нет, а в at() есть.



--------------------
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
Дата 22.4.2007, 18:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



Цитата(nickless @  22.4.2007,  21:56 Найти цитируемый пост)

есть, но не во всех методах, например в operator[] нет, а в at() есть.

Она не обязана  быть в []. Но МОЖЕТ присутствовать в отладочных версиях.

Код

// stlport/stl/debug/_vector.h
  reference operator[](size_type __n) {
    _STLP_VERBOSE_ASSERT(__n < _Base::size(), _StlMsg_OUT_OF_BOUNDS)
    return _Base::operator[](__n);
  }



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


Эксперт
****


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

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



Вектор является ведь шаблонным классом.
И когда идет вызов переменной типа Vector - то передается как минимум 2 адреса: самого объекта и функции, которую необходимо вызвать. Соответственно - вот дополнительный сервис.

И вообще спор этот с моей точки зрения абсолютно бессмысленен.
Вектор ОБЯЗАН быть медленнее - только потому, что это высокоуровневый объект (класс). Со всеми вытекающими отсюда  накладными расходами - код дополнительных методов и т.п. 
Отсюда же следует, что вектор ОБЯЗАН быть удобнее - на то это и есть высокоуровневый объект.

Мне стало интересно - я слегка модернизировал приведенный тест - так, чтобы он всетак ближе был к реальности.
Я избрал такой вариант:
Код

#include <iostream.h>
#include <cstdlib.h>
#include <ctime>
#include <vector>
#include <conio.h>
using std::cout;
using std::cin;
using std::endl;
using std::string;


int main()
{
    std::vector <int> aArray(10000);//26432
    int *pArray = new int[10000];
    int i,j,k,l;
    clock_t start;

    for(l=0;l<5;l++)
    {
        cout << "Pass " << l <<endl;
        cout << "Vector\n";
        start = clock();
        for(int i = 0; i < 200; i++)
            for (j=0;j<300;j++)
                for(k=0;k<10000;k++) aArray[k] = rand();
        cout << (clock() - start) << endl;

        cout<"Massiv\n";
        start = clock();
        for(int i = 0; i < 200; i++)
            for (j=0;j<300;j++)
                for(k=0;k<10000;k++) pArray[k] = rand();
        cout << (clock() - start) << endl;
    }

    getch();
    delete []pArray;

    return EXIT_SUCCESS;
}


Специально сделал массив небольшим, помешал оптимизатору вовсю использовать регистровые переменные, режим включил релизный.
Если отбросить отклонения из-за сторонних процессов (специально сделал несколько проходов), то вектор однозначно отстает от массива.

Я и так был в этом уверен на 99% (чудес на свете не бывает), но тут в обсуждении все по-разному говорили, вот я и решил сам посмотреть.
В среднем массив быстрее вектора примерно на 20% и это абсолютно нормально.


Это сообщение отредактировал(а) Anikmar - 22.4.2007, 18:24
PM MAIL ICQ   Вверх
Mayk
Дата 22.4.2007, 18:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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




Цитата(Anikmar @  22.4.2007,  22:24 Найти цитируемый пост)

В среднем массив быстрее вектора примерно на 20% и это абсолютно нормально.


Не стоит обобщать свой опыт на все компиляторы и все оптимизаторы.

Цитата

22:27:dvl:~$ g++ -O6 -DNDEBUG a.cpp
22:27:dvl:~$ ./a.out 
Pass 0
Vector
30660000
Massiv
31470000
Pass 1
Vector
32160000
Massiv
32460000
Pass 2
Vector
32120000
Massiv
32380000
Pass 3
Vector
32110000
Massiv
32530000
Pass 4
Vector
32220000
Massiv
32180000

Как мы видим, всё совсем не так однозначно.



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


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2155
Регистрация: 29.11.2004
Где: Москва

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



Цитата(Anikmar @  22.4.2007,  19:24 Найти цитируемый пост)
Вектор ОБЯЗАН быть медленнее - только потому, что это высокоуровневый объект (класс)

Абсолютная неправда.

Добавлено через 1 минуту и 1 секунду
Цитата(Anikmar @  22.4.2007,  19:24 Найти цитируемый пост)
И когда идет вызов переменной типа Vector - то передается как минимум 2 адреса: самого объекта и функции, которую необходимо вызвать. Соответственно - вот дополнительный сервис.

а inline?
PM MAIL WWW   Вверх
archimed7592
Дата 22.4.2007, 18:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Архимед
****


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

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



Цитата(Anikmar @  22.4.2007,  18:24 Найти цитируемый пост)
ектор является ведь шаблонным классом.
И когда идет вызов переменной типа Vector - то передается как минимум 2 адреса: самого объекта и функции, которую необходимо вызвать. Соответственно - вот дополнительный сервис.
я уже говорил выше, что IS принуждает компилятор ф-ции, определённые внутри класса далеть inline... соответственно ничего никуда не передаётся и нету нигде накладных расходов...


--------------------
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, 18:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



А что такие цифры огромные?

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

  const_reference operator[](size_type __n) const { return *(begin() + __n); }

Только чтобы получить значение по этому адресу - как минимум происходит вызов функции ( вонкретном случае оператора [])
И нельзя заставить вектор быть быстрее голого массива - он ведь призван сделать массив удобнее - так как является надстройкой над стандартным массивом.

Конкретные тесты на скорость на самом деле достаточно условны: разница между командами - несколько десятков тактов процессора, и на таких небольших величинах заемтна особо не будет.

Как у меня:
В режиме отладки вектор медленее массива в 2 раза
В режиме без оптимизации - медленнее примерно на 2%
В режиме с оптимизацией - примерно 20%
Можно для интереса запустить на всю ночь, но совершенно нет никакого интереса этим заниматься.

Просто бессмысленный спор - вот и все. Я на форуме обратил внимание, что многие очень болезнено реагируют на любые попытки критики STL (на себе в свое время изучил)
Я не критикую  STL - а просто объяаляю факт: вектор слегка медленнее, но удобнее. И спорить с этим просто бессмысленно - так как даже в некоторых описаниях STL это прямо говориться.

PM MAIL ICQ   Вверх
Daevaorn
Дата 22.4.2007, 18:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2155
Регистрация: 29.11.2004
Где: Москва

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



Цитата(archimed7592 @  22.4.2007,  19:41 Найти цитируемый пост)
 что IS принуждает компилятор ф-ции, определённые внутри класса далеть inline.

что такое "IS"? И как оно "принуждает"?smile
PM MAIL WWW   Вверх
Anikmar
Дата 22.4.2007, 18:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата(archimed7592 @  22.4.2007,  18:41 Найти цитируемый пост)
я уже говорил выше, что IS принуждает компилятор ф-ции, определённые внутри класса далеть inline... соответственно ничего никуда не передаётся и нету нигде накладных расходов...


В любом учебнике по Си сказано, что inline функция увеличивает скорость, но в качестве накладных расходов - использует  дополнительную память. Поверьте, даром ничего не бывает - если где-то прибавилось (в данном случае удобства) - значит где-то убавится (в данном случае скорости и памяти). Не понимаю, зачем так болезненно это воспринимать?  smile 

На этом, я пожалуй раскланяюсь - спор ни о чем. Пустое.
PM MAIL ICQ   Вверх
Daevaorn
Дата 22.4.2007, 18:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2155
Регистрация: 29.11.2004
Где: Москва

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



Цитата(Anikmar @  22.4.2007,  19:49 Найти цитируемый пост)
В любом учебнике по Си сказано, что inline функция увеличивает скорость, но в качестве накладных расходов - использует  дополнительную память.

В этой фразе явно видно непонимание сути inline. Что такое "дополнительная память"?
Как раз случай с вектором, это прямое доказательство ложности данного высказывания.

Это сообщение отредактировал(а) Daevaorn - 22.4.2007, 18:57
PM MAIL WWW   Вверх
Страницы: (5) Все 1 2 [3] 4 5 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
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.0623 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


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

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