1 / 1 / 0
Регистрация: 11.10.2020
Сообщений: 59
1

Проверить эффективность многопоточности

15.11.2020, 13:02. Показов 1046. Ответов 6
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Здравствуйте, я не сильно разбираюсь в многопоточном программировании, поэтому нужна помощь в вопросе. Нужно научиться группировать вычислительные операции с целью оптимизации скорости
вычислений. Есть 6 функций, которые нужно вычислить. Хотел проверить при помощи chrono, что будет эффективнее, но в итоге таймер показывает разное время. Всё ли я правильно сделал? И если да, то может надо вбить в аргументы функций числа больше, чтобы доказать эффективность многопоточности? Я пробовал вычислять с многозначными числами, но результат был почти такой же.

Кликните здесь для просмотра всего текста

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
#include <iostream>
#include <thread>
 
using namespace std;
 
double f1(double a, double b, double c, double d) {
    double up = pow(a + b, 2) - pow(c + d, 2);
    double down = pow(c + a, 2) * pow(b + d, 2);
    return up/down;
}
 
double f2(double a, double b, double c, double d) {
    double up = pow(a + b, 2) - pow(c + d, 2) + pow(a + d, 2);
    double down = pow(c + a, 2) * pow(b + d, 2);
    return up / down;
}
 
double f3(double a, double b, double c, double d) {
    double up = pow(a + b, 2) - pow(c + d, 2);
    double down = pow(a + b, 2) - pow(c + d, 2) + pow(a + d, 2);
    return up / down;
}
 
double f4(double a, double b, double c, double d, double e, double f, double g, double h) {
    double up = pow(a + b, 2) + pow(c + d, 2) + pow(e + f, 2) + pow(g + h, 2);
    double down = pow(a + h, 3);
    return up / down;
}
 
double f5(double a, double b, double c, double d, double e, double f, double g, double h) {
    double up = pow(a + b, 2) - pow(c + d, 3) + pow(e + f, 3) + pow(g + h, 3);
    double down = pow(c + a, 2) * pow(b + d, 2);
    return up / down;
}
 
double f6(double a, double b, double c, double d, double e, double f, double g, double h) {
    double up = pow(c + d, 3) * pow(g + h, 3);
    double down = pow(a + b, 3) - pow(c + d, 3) + pow(e + f, 3) + pow(g + h, 3);
    return up / down;
}
 
int main() {
    auto start = chrono::high_resolution_clock::now();
    double a, b, c, d, e, f, g, h;
    a = 1, b = 2, c = 3, d = 4, e = 5, f = 6, g = 7, h = 8;
 
    auto lf1 = [&a,&b,&c,&d,&e,&f,&g,&h]() {
        double result[3];
        result[0] = f4(a, b, c, d, e, f, g, h);
        result[0] = f5(a, b, c, d, e, f, g, h);
        result[0] = f6(a, b, c, d, e, f, g, h);
        cout << result[0] << endl;
        cout << result[1] << endl;
        cout << result[2] << endl;
    };
    thread th1(lf1);
    //cout << f1(a, b, c, d) << endl;
    //cout << f2(a, b, c, d) << endl;
    //cout << f3(a, b, c, d) << endl;
    cout << f4(a, b, c, d, e, f, g, h) << endl;
    cout << f5(a, b, c, d, e, f, g, h) << endl;
    cout << f6(a, b, c, d, e, f, g, h) << endl;
    th1.join();
    auto end = chrono::high_resolution_clock::now();
    chrono::duration<float> duration = end - start;
    cout << "Time spent - " << duration.count() << endl;    //0.00(2-4)
    return 0;
}
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
15.11.2020, 13:02
Ответы с готовыми решениями:

Соотношение многопоточности приложения c++ и многопоточности на уровне системы?
Возник следующий вопрос: в C++ существует два варианта работы с многопоточностью - std::theard и...

Как проверить эффективность продвижения?
Доброго времени суток. Суть вопроса собственна такова. Есть человек. Он занимается продвижением...

О многопоточности
Интересно, стало, а сколько всего потоков я могу открыть в своем проекте, существуют ли какие...

по многопоточности
У меня есть анимация переходов... я её применил на боди и футер так сказать.. как сделать чтобы...

6
610 / 415 / 151
Регистрация: 11.01.2019
Сообщений: 1,746
15.11.2020, 13:08 2
Ты тут делаешь что-то не то. Что надо проверить? Сформулируй четко. Еще и зачем-то вывод в поток кладешь в параллель внутри лямбды. Он же время "пожирает"!
0
1 / 1 / 0
Регистрация: 11.10.2020
Сообщений: 59
15.11.2020, 14:31  [ТС] 3
Цитата Сообщение от jugu Посмотреть сообщение
Ты тут делаешь что-то не то. Что надо проверить? Сформулируй четко. Еще и зачем-то вывод в поток кладешь в параллель внутри лямбды. Он же время "пожирает"!
Да, написал не так. Сейчас переделал. В итоге многопоточность затрачивает в среднем 0.01с, а без неё - 0.00004с. Как я понял, нужно при помощи многопоточности ускорить процесс вычисления функций. Вот переделанный код. В целях лр написано было "Научиться группировать вычислительные операции с целью оптимизации скорости вычислений".

Кликните здесь для просмотра всего текста

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
#include <iostream>
#include <thread>
 
using namespace std;
 
double f1(double a, double b, double c, double d) {
    double up = pow(a + b, 2) - pow(c + d, 2);
    double down = pow(c + a, 2) * pow(b + d, 2);
    return up/down;
}
 
double f2(double a, double b, double c, double d) {
    double up = pow(a + b, 2) - pow(c + d, 2) + pow(a + d, 2);
    double down = pow(c + a, 2) * pow(b + d, 2);
    return up / down;
}
 
double f3(double a, double b, double c, double d) {
    double up = pow(a + b, 2) - pow(c + d, 2);
    double down = pow(a + b, 2) - pow(c + d, 2) + pow(a + d, 2);
    return up / down;
}
 
double f4(double a, double b, double c, double d, double e, double f, double g, double h) {
    double up = pow(a + b, 2) + pow(c + d, 2) + pow(e + f, 2) + pow(g + h, 2);
    double down = pow(a + h, 3);
    return up / down;
}
 
double f5(double a, double b, double c, double d, double e, double f, double g, double h) {
    double up = pow(a + b, 2) - pow(c + d, 3) + pow(e + f, 3) + pow(g + h, 3);
    double down = pow(c + a, 2) * pow(b + d, 2);
    return up / down;
}
 
double f6(double a, double b, double c, double d, double e, double f, double g, double h) {
    double up = pow(c + d, 3) * pow(g + h, 3);
    double down = pow(a + b, 3) - pow(c + d, 3) + pow(e + f, 3) + pow(g + h, 3);
    return up / down;
}
 
int main() {
    auto start = chrono::high_resolution_clock::now();
    double a, b, c, d, e, f, g, h;
    a = 1, b = 2, c = 3, d = 4, e = 5, f = 6, g = 7, h = 8;
    double result[3];
 
    auto lf1 = [&]() {
        double result[3];
        result[0] = f4(a, b, c, d, e, f, g, h);
        result[1] = f5(a, b, c, d, e, f, g, h);
        result[2] = f6(a, b, c, d, e, f, g, h);
        //cout << result[0] << endl;
        //cout << result[1] << endl;
        //cout << result[2] << endl;
        return result;
    };
    thread th1(lf1);
 
    double result1 = f1(a, b, c, d);
    double result2 = f2(a, b, c, d);
    double result3 = f3(a, b, c, d);
    //double result4 = f4(a, b, c, d, e, f, g, h);
    //double result5 = f5(a, b, c, d, e, f, g, h);
    //double result6 = f6(a, b, c, d, e, f, g, h);
    th1.join();
    auto end = chrono::high_resolution_clock::now();
    chrono::duration<float> duration = end - start;
    cout << result1 << endl << result2 << endl << result3 << endl;
    //cout << result4 << endl << result5 << endl << result6 << endl;
    cout << result[0] << endl << result[1] << endl << result[2] << endl;
    cout << "Time spent - " << fixed << duration.count() << endl;
    return 0;
}
0
6579 / 4564 / 1843
Регистрация: 07.05.2019
Сообщений: 13,726
15.11.2020, 15:35 4
Лучший ответ Сообщение было отмечено NkL как решение

Решение

Цитата Сообщение от NkL Посмотреть сообщение
Да, написал не так. Сейчас переделал. В итоге многопоточность затрачивает в среднем 0.01с, а без неё - 0.00004с.
На одном вызове ты ничего не измеришь. Надо вызвать одну функцию много раз, и замерить общее время.
Это во-первых.

Добавлено через 1 минуту
Во-вторых - а что ты выполняешь в потоках? Ты вроде запускаешь один поток и ждёшь его завершения. Это то же самое, что просто выполнить код без запуска потока.
1
1 / 1 / 0
Регистрация: 11.10.2020
Сообщений: 59
15.11.2020, 16:05  [ТС] 5
Цитата Сообщение от oleg-m1973 Посмотреть сообщение
На одном вызове ты ничего не измеришь. Надо вызвать одну функцию много раз, и замерить общее время.
Это во-первых.
Добавлено через 1 минуту
Во-вторых - а что ты выполняешь в потоках? Ты вроде запускаешь один поток и ждёшь его завершения. Это то же самое, что просто выполнить код без запуска потока.
Функции не менял. Вот переделал. Разница во времени - 2 раза. Теперь всё правильно?

Кликните здесь для просмотра всего текста

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
int main() {
    setlocale(LC_ALL, "ru");
    auto start1 = chrono::high_resolution_clock::now();
    double a, b, c, d, e, f, g, h;
    a = 1, b = 2, c = 3, d = 4, e = 5, f = 6, g = 7, h = 8;
 
    double result1, result2, result3, result4, result5, result6;
    for (int i = 0; i < 1000000; i++) {
        result1 = f1(a, b, c, d);
        result2 = f2(a, b, c, d);
        result3 = f3(a, b, c, d);
        result4 = f4(a, b, c, d, e, f, g, h);
        result5 = f5(a, b, c, d, e, f, g, h);
        result6 = f6(a, b, c, d, e, f, g, h);
    }
 
    auto end1 = chrono::high_resolution_clock::now();
    chrono::duration<float> duration1 = end1 - start1;
    cout << result1 << endl << result2 << endl << result3 << endl;
    cout << result4 << endl << result5 << endl << result6 << endl;
    cout << "Затрачено времени без многопоточности - " << fixed << duration1.count() << endl << endl;
 
    double result[3] = { 0,0,0 };
    auto lf1 = [&]() {
        for (int i = 0; i < 1000000; i++) {
            result[0] = f4(a, b, c, d, e, f, g, h);
            result[1] = f5(a, b, c, d, e, f, g, h);
            result[2] = f6(a, b, c, d, e, f, g, h);
        }
        return result;
    };
 
    auto start2 = chrono::high_resolution_clock::now();
    a = 1, b = 2, c = 3, d = 4, e = 5, f = 6, g = 7, h = 8;
    thread th1(lf1);
    for (int i = 0; i < 1000000; i++) {
        result1 = f1(a, b, c, d);
        result2 = f2(a, b, c, d);
        result3 = f3(a, b, c, d);
    }
    th1.join();
    auto end2 = chrono::high_resolution_clock::now();
    chrono::duration<float> duration2 = end2 - start2;
    cout << result1 << endl << result2 << endl << result3 << endl;
    cout << result[0] << endl << result[1] << endl << result[2] << endl;
    cout << "Затрачено времени с многопоточностью - " << fixed << duration2.count() << endl;
 
    return 0;
}

Проверить эффективность многопоточности
0
610 / 415 / 151
Регистрация: 11.01.2019
Сообщений: 1,746
15.11.2020, 16:08 6
Цитата Сообщение от NkL Посмотреть сообщение
В итоге многопоточность затрачивает в среднем 0.01с, а без неё - 0.00004с.
Потоки надо хорошо загрузить работой, тогда будет ощутимый эффект. То есть время на создание и управление потоками должно быть значительно меньше времени их выполнения.
1
6579 / 4564 / 1843
Регистрация: 07.05.2019
Сообщений: 13,726
15.11.2020, 16:35 7
Цитата Сообщение от NkL Посмотреть сообщение
Функции не менял. Вот переделал. Разница во времени - 2 раза. Теперь всё правильно?
Вроде да. Похоже на правду.

Добавлено через 2 минуты
Цитата Сообщение от NkL Посмотреть сообщение
a = 1, b = 2, c = 3, d = 4, e = 5, f = 6, g = 7, h = 8;
    thread th1(lf1);
    for (int i = 0; i < 1000000; i++) {
        result1 = f1(a, b, c, d);
        result2 = f2(a, b, c, d);
        result3 = f3(a, b, c, d);
    }
    th1.join();
Попробуй ещё вот так
C++
1
2
3
4
5
6
7
auto fut = std::async(lf1);
for (int i = 0; i < 1000000; i++) {
    result1 = f1(a, b, c, d);
    result2 = f2(a, b, c, d);
    result3 = f3(a, b, c, d);
}
fut.wait();
0
15.11.2020, 16:35
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
15.11.2020, 16:35
Помогаю со студенческими работами здесь

Эффективность программы
Помогите пожалуйста составить эффективность данных программ: Program QQ1; const n=7; m=8; var...

эффективность StoredProcedure?
имеет ли смысл использовать встроенные процедуры или лучше размещать запросы на странице? как...

Эффективность перевозок
Мне надо написать программу на clips, которая будет рассчитывать эффективность перевозок из Москвыв...

эффективность сравнения
вот у меня 2 метода решения линейных уравнения гаусса и простой итерации нужно сравнить...

Периодическая эффективность
У меня такая проблема: реклама в директе работает периодами. То есть 1 неделю звонки идут, другую...

эффективность алгоритма
кнут &quot;искусство программирования&quot;, том 1, 3-е издание, 35 страница я не понял запись ограничения...


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

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru