Миф о бескомпромиссной эффективности STL-евых векторов
Когда вам говорят, что вектора в C++ так же быстры, как и массивы - не верьте! Так бывает не всегда.
Программа номер раз:
[~/C] cat a1.cpp
#include <stdlib.h>
#include <stdio.h>
int main(int argc, char** argv) {
int a[5];
int n = atoi(argv[1]);
for (int i=0; i<n; i++)
a[i%5] = i;
}
Программа номер 2:
[~/C] cat a2.cpp
#include <stdlib.h>
#include <stdio.h>
#include <vector>
using namespace std;
int main(int argc, char** argv) {
vector<int> a(5);
int n = atoi(argv[1]);
for (int i=0; i<n; i++)
a[i%5] = i;
}
А теперь компилируем:
[~/C] gcc -o a1 -O3 a1.cpp -lstdc++
[~/C] gcc -o a2 -O3 a2.cpp -lstdc++
И запускаем:
[~/C] ./a1 1000000000
5.718u 0.030s 0:05.82 98.6% 0+0k 0+0io 1237pf+0w
[~/C] ./a2 1000000000
7.077u 0.030s 0:07.15 99.3% 0+0k 0+0io 1259pf+0w
[~/C] ./a1 1000000000
5.718u 0.015s 0:05.82 98.2% 0+0k 0+0io 1237pf+0w
[~/C] ./a2 1000000000
7.046u 0.000s 0:07.17 98.1% 0+0k 0+0io 1257pf+0w
Вывод: вектора в C++ на 25% медленнее массивов.
Дисклеймер: для данной задачи, компилятора (gcc 3.4.4 под Cygwin) и процессора (Intel 1.6ГГц).
Да, и если кому-то интересны детали, то
Программа номер раз:
[~/C] cat a1.cpp
#include <stdlib.h>
#include <stdio.h>
int main(int argc, char** argv) {
int a[5];
int n = atoi(argv[1]);
for (int i=0; i<n; i++)
a[i%5] = i;
}
Программа номер 2:
[~/C] cat a2.cpp
#include <stdlib.h>
#include <stdio.h>
#include <vector>
using namespace std;
int main(int argc, char** argv) {
vector<int> a(5);
int n = atoi(argv[1]);
for (int i=0; i<n; i++)
a[i%5] = i;
}
А теперь компилируем:
[~/C] gcc -o a1 -O3 a1.cpp -lstdc++
[~/C] gcc -o a2 -O3 a2.cpp -lstdc++
И запускаем:
[~/C] ./a1 1000000000
5.718u 0.030s 0:05.82 98.6% 0+0k 0+0io 1237pf+0w
[~/C] ./a2 1000000000
7.077u 0.030s 0:07.15 99.3% 0+0k 0+0io 1259pf+0w
[~/C] ./a1 1000000000
5.718u 0.015s 0:05.82 98.2% 0+0k 0+0io 1237pf+0w
[~/C] ./a2 1000000000
7.046u 0.000s 0:07.17 98.1% 0+0k 0+0io 1257pf+0w
Вывод: вектора в C++ на 25% медленнее массивов.
Дисклеймер: для данной задачи, компилятора (gcc 3.4.4 под Cygwin) и процессора (Intel 1.6ГГц).
Да, и если кому-то интересны детали, то
ОС: Cygwin под Windows XP Professional,
Процессор: x86 Family 6 Model 13 Stepping 8 GenuineIntel ~1596 МГц
Компайлер: gcc
Версия и установки: стандартные (ничего не трогал), а именно:
[~/C] gcc -v
Reading specs from /usr/lib/gcc/i686-pc-cygwin/3.4.4/specs
Configured with: /usr/build/package/orig/test.respin/gcc-3.4.4-3/c onfigure --ver
bose --prefix=/usr --exec-prefix=/usr --sysconfdir=/etc --libdir=/usr/lib --libe
xecdir=/usr/lib --mandir=/usr/share/man --infodir=/usr/share/info --enable-langu
ages=c,ada,c++,d,f77,pascal,java,objc --enable-nls --without-included-gettext --
enable-version-specific-runtime-libs --without-x --enable-libgcj --disable-java-
awt --with-system-zlib --enable-interpreter --disable-libgcj-debug --enable-thre
ads=posix --enable-java-gc=boehm --disable-win32-registry --enable-sjlj-exceptio
ns --enable-hash-synchronization --enable-libstdcxx-debug
Thread model: posix
gcc version 3.4.4 (cygming special, gdc 0.12, using dmd 0.125)
Процессор: x86 Family 6 Model 13 Stepping 8 GenuineIntel ~1596 МГц
Компайлер: gcc
Версия и установки: стандартные (ничего не трогал), а именно:
[~/C] gcc -v
Reading specs from /usr/lib/gcc/i686-pc-cygwin/3.4.4/specs
Configured with: /usr/build/package/orig/test.respin/gcc-3.4.4-3/c
bose --prefix=/usr --exec-prefix=/usr --sysconfdir=/etc --libdir=/usr/lib --libe
xecdir=/usr/lib --mandir=/usr/share/man --infodir=/usr/share/info --enable-langu
ages=c,ada,c++,d,f77,pascal,java,objc --enable-nls --without-included-gettext --
enable-version-specific-runtime-libs --without-x --enable-libgcj --disable-java-
awt --with-system-zlib --enable-interpreter --disable-libgcj-debug --enable-thre
ads=posix --enable-java-gc=boehm --disable-win32-registry --enable-sjlj-exceptio
ns --enable-hash-synchronization --enable-libstdcxx-debug
Thread model: posix
gcc version 3.4.4 (cygming special, gdc 0.12, using dmd 0.125)
