Форум программистов, компьютерный форум CyberForum.ru

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
kvadro
11 / 9 / 1
Регистрация: 12.03.2012
Сообщений: 127
#1

Выбор хранилища - C++

25.10.2013, 17:28. Просмотров 572. Ответов 6
Метки нет (Все метки)

Есть объекты которые имеют свой id и которые должны хранится в хранилище. Далее переодически программа ищет нужный объект по id( int, присваивается не последовательно ) и работает с ним, т.е. важно время поиска объекта.

Появилось 2 способа реализации:
1) Хранить id в самом объекте как поле ( что и более правильно ), в качестве хранилища использовать std::vector.
2) Использовать std::unordered_map, id хранить как ключ объекта.

1 вариант быстрей и более правильный, возникает вопрос - нет ли подводных камней?

Набросал тест:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
#include <iostream> 
#include <cstdlib>
#include <vector>
#include <map>
#include <unordered_map>
#include <chrono>
#include <assert.h>
 
typedef int ClientId;
 
struct Client1
{
    Client1( ClientId _id ) : id( _id ) {}
 
    std::string name;
    ClientId id;
};
 
struct Client2
{
    std::string name;
};
 
// ================================================================================
Client1 *searchInVector( std::vector<Client1 *> &vec, ClientId id )
{
    for( Client1 *client : vec )
    {
        if ( client->id == id )
            return client;
    }
 
    return NULL;
}
 
// ================================================================================
Client2 *searchInMap( std::map<ClientId, Client2 *> &map, ClientId id )
{
    if ( map.find( id ) !=map.end() )
        return map[id];
 
    return NULL;
}
 
Client2 *searchInMap2( std::map<ClientId, Client2 *> &map, ClientId id )
{
    try
    {
        return map.at( id );
    }
    catch( std::out_of_range e )
    {
        return NULL;
    }
}
 
// ================================================================================
Client2 *searchInUnorderedMap( std::unordered_map<ClientId, Client2 *> &map, ClientId id )
{
    if ( map.find( id ) !=map.end() )
        return map[id];
 
    return NULL;
}
 
Client2 *searchInUnorderedMap2( std::unordered_map<ClientId, Client2 *> &map, ClientId id )
{
    try
    {
        return map.at( id );
    }
    catch( std::out_of_range e )
    {
        return NULL;
    }
}
 
 
int getTime( std::chrono::time_point<std::chrono::system_clock> start,
               std::chrono::time_point<std::chrono::system_clock> end )
{
    int elapsed = std::chrono::duration_cast<std::chrono::nanoseconds>(end-start).count();
    
    return elapsed;
}
 
 
std::vector<Client1 *> clients1;
std::map<ClientId, Client2 *> clients2;
std::unordered_map<ClientId, Client2 *> clients3;
 
 
int main( int argc, char* argv[] )
{
    std::chrono::time_point<std::chrono::system_clock> start, end;
 
    for( int i = 1; i <= 10000000; i++ )
    {
        Client1 *client1 = new Client1( i );
        Client2 *client2 = new Client2();
 
        clients1.push_back(client1);
        clients2.insert( { i, client2 } );
        clients3.insert( { i, client2 } );
    }
 
 
    for ( int test = 1; test < argc; test++ )
    {
        int cid = atoi( argv[test] );
 
        start = std::chrono::system_clock::now();
        searchInVector( clients1, cid );
        end = std::chrono::system_clock::now();
        std::cout << "Vector, id " << cid << ": " << getTime( start, end ) << std::endl ;
 
        start = std::chrono::system_clock::now();
        searchInMap(clients2, cid );
        end = std::chrono::system_clock::now();
        std::cout << "Map, id " << cid << ": " << getTime( start, end ) << std::endl ;
 
        start = std::chrono::system_clock::now();
        searchInMap2(clients2, cid );
        end = std::chrono::system_clock::now();
        std::cout << "Map2, id " << cid << ": " << getTime( start, end ) << std::endl ;
 
        start = std::chrono::system_clock::now();
        searchInUnorderedMap(clients3, cid );
        end = std::chrono::system_clock::now();
        std::cout << "Unordered map, id " << cid << ": " << getTime( start, end ) << std::endl ;
 
        start = std::chrono::system_clock::now();
        searchInUnorderedMap2(clients3, cid );
        end = std::chrono::system_clock::now();
        std::cout << "Unordered map2, id " << cid << ": " << getTime( start, end ) << std::endl ;
 
        std::cout << "===================" << std::endl ;
    }
}
Bash
1
2
clang++ -std=c++11 -O3 search.cc -o search
./search 10 9999999 200000000
Результаты:
Поиск ближнего элемента:
Vector, id 10: 0
Map, id 10: 3000
Map2, id 10: 0
Unordered map, id 10: 1000
Unordered map2, id 10: 0

Поиск дального элемента:
Vector, id 999999: 0
Map, id 999999: 1000
Map2, id 999999: 1000
Unordered map, id 999999: 0
Unordered map2, id 999999: 0

Поиск несуществующего элемента:
Vector, id 2000000: 0
Map, id 2000000: 1000
Map2, id 2000000: 77000
Unordered map, id 2000000: 1000
Unordered map2, id 2000000: 4000
Добавлено через 4 минуты
И я не могу понять почему такие результаты выдаёт std::vector на дальних элементах.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
25.10.2013, 17:28     Выбор хранилища
Посмотрите здесь:

Создание конфиденциального хранилища информации - C++
Мне необходимо написать хранилище конфиденциальной информации. Суть - написать программу, которая создавала бы и оперировала файлами,...

Разработка простейшего защищенного хранилища файлов - C++
Добрый день. У меня курсовая работа, а тема: создание защищенного хранилища файлов. Ничего сверхсложного быть не должно:...

Сделать что то типа закрытого хранилища файлов с доступом только из программы - C++
В общем, мне нужно сделать что то типа закрытого хранилища файлов с доступом только из программы. А теперь внимание, вопрос. Как...

Выбор хранилища данных - Носители информации
Здравствуйте. Планирую приобрести NAS. Основное для чего он нужен: 1) Хранения большого количества мультимедиа файлов. 2) Просмотр...

Выбор файлового хранилища. - Обо всем!
Ситуация следующая: Дома стоит комп в котором я пишу программы. На работе бук в котором я время от времени пишу программы. Хотелось...

Выбор HDD 3.5 для домашнего файлового хранилища - Жесткие диски
Здравствуйте! Подскажите - есть задача сделать домашний файловый сервер собрать комп в него вставить HDD общий объем примерно 20ТБ И...

Хранилища данных - Софт
Какие хранилища по типу google drive бесплатные существуют и какое лучшее и почему ?

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Shtirliz72
201 / 161 / 38
Регистрация: 25.10.2013
Сообщений: 527
26.10.2013, 01:16     Выбор хранилища #2
Цитата Сообщение от kvadro Посмотреть сообщение
И я не могу понять почему такие результаты выдаёт std::vector на дальних элементах.
А я не могу понять почему он у тебя вообще такие гиперактивные результаты выдаёт по сравнению с другими контейнерами. Может конечно это оптимизатор так постарался, но я сомневаюсь. Попробуй увеличить количество проходов по поиску, как ниже поступил я.

я немного переписал main
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
#define TURNS 10
#define TURNS2 (TURNS*1000)
int main(int argc, char *argv[])
{
    // QCoreApplication a(argc, argv);
    clock_t start, end;
 
    std::string strs[] = {"one", "two", "three", "four", "five", "six", "seven", "eight" };
    for( int i = 1; i <= 10000000; i++ )
    {
        int k = rand() % 8;
        Client1 *client1 = new Client1( i );
        client1->name = strs[k];
        Client2 *client2 = new Client2();
        client2->name = strs[k];
 
        if (!(i%100000))
            std::cout << "Generating test values: " << i/100000 << "%\r";
 
        clients1.push_back(client1);
        clients2.insert( std::pair<ClientId, Client2 *>(i, client2) );
        clients3.insert( std::pair<ClientId, Client2 *>(i, client2) );
    }
 
    // char str[][256] = {"sa", "10", "9999999", "200000000"};
    for ( int test = 1; test < /*4*/ argc; test++ )
    {
        long cid = atoi( /*str[test]*/argv[test] );
        std::cout << "turn " << test << " value: " << cid << std::endl;
 
        start = clock();
        for (int i = 0; i < TURNS; i++) searchInVector( clients1, cid );
        end = clock();
        std::cout << "Vector, id " << cid << ": " << (double)(end - start) / (CLOCKS_PER_SEC * TURNS) << std::endl ; ;
 
        start = clock();
        for (int i = 0; i < TURNS2; i++) searchInMap(clients2, cid );
        end = clock();
        std::cout << "Map1, id " << cid << ": " << (double)(end - start) / (CLOCKS_PER_SEC * TURNS2) << std::endl ;
 
        start = clock();
        for (int i = 0; i < TURNS2; i++) searchInMap2(clients2, cid );
        end = clock();
        std::cout << "Map2, id " << cid << ": " << (double)(end - start) / (CLOCKS_PER_SEC * TURNS2) << std::endl ;
 
        start = clock();
        for (int i = 0; i < TURNS2; i++) searchInUnorderedMap(clients3, cid );
        end = clock();
        std::cout << "Unordered map, id " << cid << ": " << (double)(end - start) / (CLOCKS_PER_SEC * TURNS2) << std::endl ;
 
        start = clock();
        for (int i = 0; i < TURNS2; i++) searchInUnorderedMap2(clients3, cid );
        end = clock();
        std::cout << "Unordered map2, id " << cid << ": " << (double)(end - start) / (CLOCKS_PER_SEC * TURNS2) << std::endl ;
 
        std::cout << "===================" << std::endl ;
    }
    // return a.exec();
}
и результаты:
turn 1 value: 10
Vector, id 10: 0
Map1, id 10: 1.5e-006
Map2, id 10: 7e-007
Unordered map, id 10: 7e-007
Unordered map2, id 10: 4e-007
===================
turn 2 value: 9999999
Vector, id 9999999: 0.4914
Map1, id 9999999: 2.5e-006
Map2, id 9999999: 1.2e-006
Unordered map, id 9999999: 7e-007
Unordered map2, id 9999999: 3e-007
===================
turn 3 value: 200000000
Vector, id 200000000: 0.4897
Map1, id 200000000: 1.4e-006
Map2, id 200000000: 5.3e-006
Unordered map, id 200000000: 2e-007
Unordered map2, id 200000000: 4.6e-006
===================
Добавлено через 5 часов 29 минут
Цитата Сообщение от kvadro Посмотреть сообщение

Появилось 2 способа реализации:
1) Хранить id в самом объекте как поле ( что и более правильно ), в качестве хранилища использовать std::vector.
2) Использовать std::unordered_map, id хранить как ключ объекта.

1 вариант быстрей и более правильный, возникает вопрос - нет ли подводных камней?
В общем - 2ой вариант явно быстрее.
Особенно его первая реализация searchInUnorderedMap.
Если же хочешь использовать vector, то лучше всего(по моим результатам - в два раза быстрей), будет версия с итераторами:
C++
1
2
3
4
5
6
7
8
9
10
11
Client1 *searchInVector2( std::vector<Client1 *> &vec, ClientId id )
{
    std::vector<Client1 *>::iterator endIt = vec.end();
    for(std::vector<Client1 *>::iterator i = vec.begin(); i < endIt; ++i )
    {
        if ( (*i)->id == id )
            return *i;
    }
 
    return NULL;
}
Также вскрылась ошибка из-за которой были странные результаты по времени.
std::chrono::duration_cast<std::chrono::nanoseconds>(end-start).count() возвращает long long, который у тебя преобразовывался в int - из-за этого были некорректные результаты.
Полный листинг:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
#include <assert.h>
 
#include <iostream>
#include <cstdlib>
#include <vector>
#include <map>
#include <unordered_map>
#include <chrono>
 
// #include <QCoreApplication>
 
#define TURNS 10
#define TURNS2 (TURNS*10000)
 
typedef long ClientId;
 
struct Client1
{
    Client1( ClientId _id ) : id( _id ) {}
 
    std::string name;
    ClientId id;
};
 
struct Client2
{
    std::string name;
};
 
// ================================================================================
Client1 *searchInVector( std::vector<Client1 *> &vec, ClientId id )
{
    for( Client1 *client : vec )
    {
        if ( client->id == id )
            return client;
    }
 
    return NULL;
}
 
Client1 *searchInVector2( std::vector<Client1 *> &vec, ClientId id )
{
    std::vector<Client1 *>::iterator endIt = vec.end();
    for(std::vector<Client1 *>::iterator i = vec.begin(); i < endIt; ++i )
    {
        if ( (*i)->id == id )
            return *i;
    }
 
    return NULL;
}
 
// ================================================================================
Client2 *searchInMap( std::map<ClientId, Client2 *> &map, ClientId id )
{
    if ( map.find( id ) !=map.end() )
        return map[id];
 
    return NULL;
}
 
Client2 *searchInMap2( std::map<ClientId, Client2 *> &map, ClientId id )
{
    try
    {
        return map.at( id );
    }
    catch( std::out_of_range e )
    {
        return NULL;
    }
}
 
// ================================================================================
Client2 *searchInUnorderedMap( std::unordered_map<ClientId, Client2 *> &map, ClientId id )
{
    if ( map.find( id ) !=map.end() )
        return map[id];
 
    return NULL;
}
 
Client2 *searchInUnorderedMap2( std::unordered_map<ClientId, Client2 *> &map, ClientId id )
{
    try
    {
        return map.at( id );
    }
    catch( std::out_of_range e )
    {
        return NULL;
    }
}
 
 
long long getTime( std::chrono::time_point<std::chrono::system_clock> start,
               std::chrono::time_point<std::chrono::system_clock> end )
{
    long long elapsed = std::chrono::duration_cast<std::chrono::nanoseconds>(end-start).count();
    return elapsed;
}
 
 
std::vector<Client1 *> clients1;
std::map<ClientId, Client2 *> clients2;
std::unordered_map<ClientId, Client2 *> clients3;
 
int main(int argc, char *argv[])
{
    // QCoreApplication a(argc, argv);
    // clock_t start, end;
    std::chrono::time_point<std::chrono::system_clock> start, end;
 
    std::string strs[] = {"one", "two", "three", "four", "five", "six", "seven", "eight" };
    for( int i = 1; i <= 10000000; i++ )
    {
        int k = rand() % 8;
        Client1 *client1 = new Client1( i );
        client1->name = strs[k];
        Client2 *client2 = new Client2();
        client2->name = strs[k];
 
        if (!(i%100000))
            std::cout << "Generating test values: " << i/100000 << "%\r";
 
        clients1.push_back(client1);
        clients2.insert( std::pair<ClientId, Client2 *>(i, client2) );
        clients3.insert( std::pair<ClientId, Client2 *>(i, client2) );
    }
    std::cout << "                                                          \r";
 
    char str[][256] = {"sa", "10", "2353257", "5678335", "9999899", "200000000"};
    for ( int test = 1; test < 6 /*argc*/; test++ )
    {
        long cid = atoi( str/*argv*/[test] );
        std::cout << "turn " << test << " value: " << cid << std::endl;
 
        /*
        start = clock();
        for (int i = 0; i < TURNS; i++) searchInVector( clients1, cid );
        end = clock();
        std::cout << "Vector: " << (double)(end - start) / (CLOCKS_PER_SEC * TURNS) << std::endl ; ;
 
        start = clock();
        for (int i = 0; i < TURNS; i++) searchInVector2( clients1, cid );
        end = clock();
        std::cout << "Vector2: " << (double)(end - start) / (CLOCKS_PER_SEC * TURNS) << std::endl ; ;
 
        start = clock();
        for (int i = 0; i < TURNS2; i++) searchInMap(clients2, cid );
        end = clock();
        std::cout << "Map1: " << (double)(end - start) / (CLOCKS_PER_SEC * TURNS2) << std::endl ;
 
        start = clock();
        for (int i = 0; i < TURNS2; i++) searchInMap2(clients2, cid );
        end = clock();
        std::cout << "Map2: " << (double)(end - start) / (CLOCKS_PER_SEC * TURNS2) << std::endl ;
 
        start = clock();
        for (int i = 0; i < TURNS2; i++) searchInUnorderedMap(clients3, cid );
        end = clock();
        std::cout << "Unordered map: " << (double)(end - start) / (CLOCKS_PER_SEC * TURNS2) << std::endl ;
 
        start = clock();
        for (int i = 0; i < TURNS2; i++) searchInUnorderedMap2(clients3, cid );
        end = clock();
        std::cout << "Unordered map2: " << (double)(end - start) / (CLOCKS_PER_SEC * TURNS2) << std::endl ;
        */
 
        start = std::chrono::system_clock::now();
        for (int i = 0; i < TURNS; i++) searchInVector( clients1, cid );
        end = std::chrono::system_clock::now();
        std::cout << "Vector: " << (double)getTime( start, end ) / (CLOCKS_PER_SEC * TURNS) << std::endl ;
 
        start = std::chrono::system_clock::now();
        for (int i = 0; i < TURNS; i++) searchInVector2( clients1, cid );
        end = std::chrono::system_clock::now();
        std::cout << "Vector2: " << (double)getTime( start, end ) / (CLOCKS_PER_SEC * TURNS) << std::endl ;
 
        start = std::chrono::system_clock::now();
        for (int i = 0; i < TURNS2; i++) searchInMap(clients2, cid );
        end = std::chrono::system_clock::now();
        std::cout << "Map: " << (double)getTime( start, end ) / (CLOCKS_PER_SEC * TURNS2) << std::endl ;
 
        start = std::chrono::system_clock::now();
        for (int i = 0; i < TURNS2; i++) searchInMap2(clients2, cid );
        end = std::chrono::system_clock::now();
        std::cout << "Map2: " << (double)getTime( start, end ) / (CLOCKS_PER_SEC * TURNS2)  << std::endl ;
 
        start = std::chrono::system_clock::now();
        for (int i = 0; i < TURNS2; i++) searchInUnorderedMap(clients3, cid );
        end = std::chrono::system_clock::now();
        std::cout << "Unordered: " << (double)getTime( start, end ) / (CLOCKS_PER_SEC * TURNS2) << std::endl ;
 
        start = std::chrono::system_clock::now();
        for (int i = 0; i < TURNS2; i++) searchInUnorderedMap2(clients3, cid );
        end = std::chrono::system_clock::now();
        std::cout << "Unordered map2: " << (double)getTime( start, end ) / (CLOCKS_PER_SEC * TURNS2) << std::endl ;
 
 
        std::cout << "===================" << std::endl ;
 
 
    }
    // return a.exec();
}
kvadro
11 / 9 / 1
Регистрация: 12.03.2012
Сообщений: 127
26.10.2013, 03:38  [ТС]     Выбор хранилища #3
turn 1 value: 10
Vector: 0
Vector2: 0
Map: 0.00465144
Map2: 0.00166152
Unordered: 0.00300801
Unordered map2: 0.001511
===================
turn 2 value: 9999999
Vector: 0
Vector2: 0
Map: 0.0154546
Map2: 0.00825744
Unordered: 0.0029381
Unordered map2: 0.00150442
===================
turn 3 value: 200000000
Vector: 0
Vector2: 0
Map: 0.00842853
Map2: 0.111889
Unordered: 0.00227184
Unordered map2: 0.163162
===================

Vector всё-равно нолик выдаёт))))

Добавлено через 7 минут
возвращает long long, который у тебя преобразовывался в int - из-за этого были некорректные результаты.
Переполнения небыло, так что всё нормально.
I.M.
564 / 547 / 5
Регистрация: 16.12.2011
Сообщений: 1,389
26.10.2013, 04:27     Выбор хранилища #4
kvadro, поиск по мапам сделан некорректно
C++
1
2
3
4
5
6
7
Client2 *searchInUnorderedMap( std::unordered_map<ClientId, Client2 *> &map, ClientId id )
{
    if ( map.find( id ) !=map.end() ) // вот тут идет поиск по мапе первый раз
        return map[id]; // а вот тут второй. более того, если элемента не найдено, то он создается
 
    return NULL;
}
И почему не пользуемся константными ссылками?

Добавлено через 1 минуту
В функции searchInUnorderedMap2 тоже двойной поиск, но без создания несуществующего элемента. Зато там трай-кетч блок, который скорости явно не добавляет
MrGluck
Модератор
Эксперт CЭксперт С++
6988 / 4159 / 592
Регистрация: 29.11.2010
Сообщений: 11,030
26.10.2013, 05:16     Выбор хранилища #5
Цитата Сообщение от kvadro Посмотреть сообщение
важно время поиска объекта.
тогда точно
Цитата Сообщение от kvadro Посмотреть сообщение
std::unordered_map, id хранить как ключ объекта.
вдобавок, дубликаты отсеит.
Цитата Сообщение от kvadro Посмотреть сообщение
Хранить id в самом объекте как поле ( что и более правильно )
id - свойство сущности или элемент реализации? (вопрос риторический)
Цитата Сообщение от kvadro Посмотреть сообщение
1 вариант быстрей и более правильный
неверно реализован алгоритм, поиск в векторе имеет линейную сложность против константной у ассоциативного контейнера std::unordered_map
Shtirliz72
201 / 161 / 38
Регистрация: 25.10.2013
Сообщений: 527
26.10.2013, 12:18     Выбор хранилища #6
Цитата Сообщение от kvadro Посмотреть сообщение
Vector всё-равно нолик выдаёт))))
Ты мой конечный код использовал? И у тебя всё равно 0 выдаёт на поиске значения 9999999? Значит убирай -O3, где-то он неверно оптимизирует.

Цитата Сообщение от kvadro Посмотреть сообщение
Переполнения не было, так что всё нормально.
У меня - было.

Ну и да, как посоветовали выше, - проверь код и корректность своих алгоритмов поиска.

Плюс у меня есть все основания полагать, что использовать с Vector лучше не vector<Client1 *> со структурой
C++
1
2
3
4
5
6
7
struct Client1
{
    Client1( ClientId _id ) : id( _id ) {}
 
    std::string name;
    ClientId id;
};
, а vector<Client1> со структурой:
C++
1
2
3
4
5
6
7
8
9
10
11
struct YourData 
{
     // твои данные
};
struct Client1
{
    Client1( ClientId _id ) : id( _id ) {}
 
    YourData *yourData;
    ClientId id;
};
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
27.10.2013, 01:05     Выбор хранилища
Еще ссылки по теме:

NAS хранилища - Сетевое оборудование
Интересует роутер или NAS хранилище которое имеет встроенный торрент. Но у роутеров с этим клиентом достаточно высокая цена. Нашел NAS...

Хранилища книг - Литература
Подскажите, пожалуйста, хорошие хранилища книг, для бесплатного скачивания в интернете.

Eclipse и облачные хранилища - JAVA IDE
Можно ли установить workspace в eclipse в облачном хранилище? Что бы работать с одним проектом из разных мест.

Создание облачного хранилища - Администрирование Windows
Доброго времени суток. Возникла такая проблема: есть ПК, который будет выступать в роли сервера и дисковое хранилище, подключенных по сети....

Распределенные хранилища данных - Программирование
Добрый Вечер!! Встал такой вопрос, что же такое Распределенное хранилище данных?!и Какие они вообще бывают?(FTP-сервера, Raid-массивы,...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
kvadro
11 / 9 / 1
Регистрация: 12.03.2012
Сообщений: 127
27.10.2013, 01:05  [ТС]     Выбор хранилища #7
Ты мой конечный код использовал?
Да

Значит убирай -O3, где-то он неверно оптимизирует.
С O2 и O1 тоже 0. Разница только с O0.

С gcc почти аналогично ( если смотреть на Vector2 )

turn 1 value: 10
Vector: 0
Vector2: 0
Map: 0.00495002
Map2: 0.00225128
Unordered: 0.0020621
Unordered map2: 0.000798682
===================
turn 2 value: 9999999
Vector: 60.4725
Vector2: 0.0001
Map: 0.0201291
Map2: 0.0107983
Unordered: 0.00165001
Unordered map2: 0.000717251
===================
turn 3 value: 200000000
Vector: 60.5023
Vector2: 0
Map: 0.0107102
Map2: 0.440921
Unordered: 0.00141394
Unordered map2: 0.44532
===================
Yandex
Объявления
27.10.2013, 01:05     Выбор хранилища
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru