Новости

Блог Програміста

Суть експерименту: є масив з n елементів. У цьому масиві потрібно замінити кожен 3 елемент масиву на будь-яке значення. Заміна проводиться 3 вищепереліченими способами з виміром швидкодії кожного. Кількість елементів масиву варіюється від 1 000 000 до 100 000 000 c з кроком в 1 000 000. Для кожного методу і кол-ва елементів масиву перевірка здійснюється 50 разів з перебуванням середнього часу. Після закінчення виміру продуктивності, побудувати графіки залежності часу виконання заміни від кількості елементів масиву по 3 методам. Проаналізувати динаміку кожного з методів.

Порівняти швидкодію 3 методів доступу до елементів масиву на запис.

Для побудови графіків я використовував бібліотеку QT. Малював просто на QLable, її і вивів на екран.

Нижче представлена ​​програма реалізує вищевказану завдання:

#include <QApplication> #include "QPainter" #include <QLabel> #include <QRect> #include <QPixmap> #include <QDebug> #include <iostream> #include <valarray> #include <unistd.h> #include < time.h> #define ZAMENA 1 using namespace std; long Simple (long count) {int * na = new int [count]; long t1 = clock (); for (int i = 1; i <count; i = 3) na [i] = ZAMENA; long t2 = clock (); delete [] na; return t2-t1; } Long Valarray (long count) {std :: valarray <int> a (count); long t1 = clock (); for (int i = 1; i <count; i = 3) a [i] = ZAMENA; long t2 = clock (); return t2-t1; } Long Slice (long count) {std :: valarray <int> a (count); long t1 = clock (); slice s (1, count / 3,3); a [s] = ZAMENA; long t2 = clock (); return t2-t1; } Int main (int argc, char * argv []) {int w = 500; int h = 500; QColor SimplePen (255,0,0); QColor SlicePen (0,255,0); QColor ValarrayPen (0,0,255); QApplication app (argc, argv); QLabel * MainLable = new QLabel ( "Graphs"); MainLable-> setBaseSize (w, h); QPixmap MainPixMap (w, h); MainPixMap.fill (MainLable, 0,0); QPainter MainPainter (& MainPixMap); MainPainter.fillRect (MainPainter.viewport (), QColor (255,255,255)); MainPainter.setPen (SimplePen); MainPainter.drawLine (10,10,100,10); MainPainter.drawText (110,10, "Simple"); MainPainter.setPen (SlicePen); MainPainter.drawLine (10,25,100,25); MainPainter.drawText (110,25, "Slice"); MainPainter.setPen (ValarrayPen); MainPainter.drawLine (10,40,100,40); MainPainter.drawText (110,40, "Valarray"); / * * Example of drawing y = f% u043E% u043E (x) int count = 1000000; int dx = 1000; double maxy = foo (count); for (double x = dx; x <count; x = dx) {double y = foo (x); double y2 = foo (x dx); double x2 = x dx; MainPainter.drawLine ((x / count) * w, h - ((y / maxy) * h), (x2 / count) * w, h - ((y2 / maxy) * h)); } * / Int count_tests = 50; long n = 100000000; long dx = 1000000; long * args = new long [n / dx]; long * SimpleTimes = new long [n / dx]; long * SliceTimes = new long [n / dx]; long * ValarrayTimes = new long [n / dx]; for (int i = 0; i <n / dx; i) {args [i] = dx * i; } Long max = 0; qDebug () << "Simple begins"; for (int j = 0; j <n / dx-1; j) {long S = 0; for (int i = 0; i <count_tests; i) S = Simple (args [j]); S = S / count_tests; SimpleTimes [j] = S; max = max <S? S: max; if (j% 10 == 0) qDebug () << j; } QDebug () << "Simple ends"; qDebug () << "Valarray begins"; for (int j = 0; j <n / dx-1; j) {long S = 0; for (int i = 0; i <count_tests; i) S = Valarray (args [j]); S = S / count_tests; ValarrayTimes [j] = S; max = max <S? S: max; if (j% 10 == 0) qDebug () << j; } QDebug () << "ValarrayTimes ends"; qDebug () << "Slice begins"; for (int j = 0; j <n / dx-1; j) {long S = 0; for (int i = 0; i <count_tests; i) S = Slice (args [j]); S = S / count_tests; SliceTimes [j] = S; max = max <S? S: max; if (j% 10 == 0) qDebug () << j; } QDebug () << "Slice ends"; qDebug () << "max" << max; for (int j = 0; j <n / dx-2; j) {MainPainter.setPen (SimplePen); MainPainter.drawLine (w * args [j] / n, h- (h * SimpleTimes [j] / max), w * args [j 1] / n, h- (h * SimpleTimes [j 1] / max)) ; MainPainter.setPen (SlicePen); MainPainter.drawLine (w * args [j] / n, h- (h * SliceTimes [j] / max), w * args [j 1] / n, h- (h * SliceTimes [j 1] / max)) ; MainPainter.setPen (ValarrayPen); MainPainter.drawLine (w * args [j] / n, h- (h * ValarrayTimes [j] / max), w * args [j 1] / n, h- (h * ValarrayTimes [j 1] / max)) ; } MainLable-> setPixmap (MainPixMap); MainLable-> show (); return app.exec (); } #include <QApplication> #include QPainter #include <QLabel> #include <QRect> #include <QPixmap> #include <QDebug> #include <iostream> #include <valarray> #include <unistd Виконувалася вона довго. Якщо є бажання - компільте на здоров'я: текстовку вище викиньте в файл main.cpp, створіть файл tryValarray.pro такого змісту:
TARGET = app SOURCES + = main.cpp \
виконати
qmake
make
./app
На виході отримаєте зображення з графіками. Праворуч - результат на моїй машині.
Зробимо висновки:
Залежність прямо пропорційна у всіх методів. Але у старого дідівського набагато -больше коефіцієнт зростання.
2 і 3 методи практично ідентичні за часом виконання і активно виграють у старого дідівського. Однак, третім методом користуватися зручніше і швидше з точки зору швидкості написання коду. Дуже раджу valarray і slice при обробці масивів великих розмірностей в олімпіадах - важливість критерію швидкодії програми і швидкості написання коду там очевидна.

Уважаемые партнеры, если Вас заинтересовала наша продукция, мы готовы с Вами сотрудничать. Вам необходимо заполнить эту форму и отправить нам. Наши менеджеры в оперативном режиме обработают Вашу заявку, свяжутся с Вами и ответят на все интересующее Вас вопросы.

Или позвоните нам по телефонам: (048) 823-25-64

Организация (обязательно) *

Адрес доставки

Объем

Как с вами связаться:

Имя

Телефон (обязательно) *

Мобильный телефон

Ваш E-Mail

Дополнительная информация: