Image

Imageurod wrote in Imageru_cpp

Миф о бескомпромиссной эффективности 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ГГц).

Да, и если кому-то интересны детали, то
ОС: 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/configure --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)