Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.66/29: Рейтинг темы: голосов - 29, средняя оценка - 4.66
 Аватар для bedvit
1208 / 259 / 22
Регистрация: 20.05.2016
Сообщений: 1,136
Записей в блоге: 21

Сравнение производительности С++ и С# на конкретном примере

31.03.2017, 19:33. Показов 6586. Ответов 51
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Приветствую знатоков С++ !
Можно ли на С++ вычислить быстрее, чем на C#, переменные для решения уравнения x ^ 3 + y ^ 3 = z ^ 3 - 1
К примеру в диапазоне до 100000.
Код на С#
Кликните здесь для просмотра всего текста
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
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Threading.Tasks;
 
namespace NET_Framework4
{
    //поиск переменных для решения уравнения x^3 + y^3 = z^3 - 1
    class Program
    {
        static long n;
        static long an;
        static long lim;
        static long k = 0;
        static long[] a;
        static int threadsN = Environment.ProcessorCount; //задать количество потоков
 
        static void Main(string[] args)
        {
            Console.WriteLine("Enter the maximum value of the variables for equation (x ^ 3 + y ^ 3 = z ^ 3 - 1), followed by <Enter>:\n");
            n = Convert.ToInt64(Console.ReadLine());
            Stopwatch sw = Stopwatch.StartNew();
            an = n * n * n;
            a = new long[n + 1];
            lim = (long)(Math.Pow((an - 1) / 2, 1d / 3d));
 
                for (long i = 1; i <= n; i++)
                    a[i] = i * i * i;
 
            var task = new List<Task>();
                for (int i = 1; i <= threadsN; i++)
                {
                    int k = i;
                    task.Add(new Task(() => Func(k)));
                }
            task.ForEach(t => t.Start());//стартуем task
            task.ForEach(t => t.Wait()); //ждем выполнения всех task
            sw.Stop();
            Console.WriteLine("Time {0}", sw.Elapsed);
            Console.Write("\nPress any key to continue... ");
            Console.ReadKey();
        }
 
        static void Func(long start)
        {
            long m = n;
            unsafe
            {
                fixed (long* a = Program.a)
                {
                    for (long x = start; x <= lim; x = x + threadsN)
                    {
                        long ax = a[x];
                        long r = an - ax - 1;
                        while (a[m] > r) m--;
                        long z = (long)(x * 1.2599);
 
                        for (long y = x; y <= m; y++)
                        {
                            long z3 = ax + a[y] + 1;
 
                            for (long az = a[z]; az <= z3; z++, az = a[z])
                            {
                                if (az == z3) Console.WriteLine(k++ + "   " + x + "   " + y + "   " + z);
                            }
                        }
                    }
                }
            }
        }
    }
}

Обсуждение на ветке С#.
Решение на C# прилагаю.
Вложения
Тип файла: rar XYZ_NET_Framework4.rar (3.2 Кб, 8 просмотров)
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
31.03.2017, 19:33
Ответы с готовыми решениями:

На конкретном примере
Добрый вечер! На конкретном примере показать как с помощью документа переносить данные из одного справочника в другой. Пусть это будет...

Маршрутизация на конкретном примере
ОС Win7 config Настройка протокола IP для Windows Имя компьютера . . . . . . . . . : NamePC Основной DNS-суффикс . ....

Линейный криптоанализ на конкретном примере
суть: есть исходный текст, есть зашифрованная комбинация известно, что шифрование происходило через XOR-операцию исходного текста и...

51
 Аватар для Kastaneda
5232 / 3205 / 362
Регистрация: 12.12.2009
Сообщений: 8,143
Записей в блоге: 2
31.03.2017, 20:24
Цитата Сообщение от bedvit Посмотреть сообщение
Можно ли на С++ вычислить быстрее, чем на C#
Это врядли, с чего С++'у быть быстрее сишарпа, он всего лишь обертка над ассемблером, а не какой-то там управляемый код
0
7804 / 6568 / 2988
Регистрация: 14.04.2014
Сообщений: 28,705
31.03.2017, 21:37
bedvit, программа маленькая - сделай на C++ и проверь.
0
 Аватар для bedvit
1208 / 259 / 22
Регистрация: 20.05.2016
Сообщений: 1,136
Записей в блоге: 21
31.03.2017, 21:50  [ТС]
Цитата Сообщение от Kastaneda Посмотреть сообщение
какой-то там управляемый код
- CLR - наше всё!
Цитата Сообщение от Kastaneda Посмотреть сообщение
Это врядли
А если сильно постарается?

nmcf, не знаю всех тонкостей С++, собственно поэтому и создал тему.

Добавлено через 1 минуту
Хочу понять - насколько разница большая.
0
1498 / 1213 / 821
Регистрация: 29.02.2016
Сообщений: 3,630
31.03.2017, 22:03
Сравнение скорости вычислений с# и С++
0
 Аватар для avgoor
1550 / 877 / 179
Регистрация: 05.12.2015
Сообщений: 2,555
01.04.2017, 03:45
bedvit, Меня всегда умиляло, что всевозможные сравнения по скорости типа C# vs С++, java vs C++ пишутся, апологетами этих самых C# и java. Причем те, кто их пишет - либо "ниасилили" C++, либо провокаторы.
Тесты все как один:
1) мы хотим честного тестирования, поэтому дадим фору C# и java на первый запуск, а то пока это все jit скомпилится...
2) мы тестируем скорость кода и соответственно ни одного new вы в нем не увидите, потому что если вдруг случится сборка мусора...
В результате получаем близкие по времени результаты и радуемся. А то, что киллер фича, ака автоматичское управление памятью, не при делах - то проблемы индейцев.

Добавлено через 10 минут
UPD. есть вариация пункта 2.
3) т.к. в java объект на стеке создать нельзя, пусть в C++ тоже будет new.
3
 Аватар для bedvit
1208 / 259 / 22
Регистрация: 20.05.2016
Сообщений: 1,136
Записей в блоге: 21
03.04.2017, 09:42  [ТС]
Уже набросили на вентилятор (java зашла). Наверное, я слишком громко тему назвал. Предлагаю:
1.убрать вентилятор - совсем.
2.снять подозрения с автора в тролинге (толстом, тонком и т.д.)
3.помочь перевести автору поис переменных по данному уравнению на с++ (наличие доброй воли)
4.НЕ сравнивать какие языки лучше, сборщик мусора, возможность ассемблерной вставки или мультиплатформенность(см.п1)
5.целью данной темы рассматривался вариант решения данного уравнения, прирост в вычислениях. До этого были варианты на VBA, Qbasic, других диалектах бейсика. Потом вариант на C#, теперь хотел посмотреть на С++.
Сам не программист С++. Был чистый интерес, срач не интересует. Всем спасибо!
0
 Аватар для avgoor
1550 / 877 / 179
Регистрация: 05.12.2015
Сообщений: 2,555
03.04.2017, 14:32
bedvit, сравнивать языки таким образом - все равно, что сравнивать скорость феррари и жигулей (любых других автомобилей) в городе, в час пик. Какие-то цифры вы получите, только цена им будет...
1
 Аватар для bedvit
1208 / 259 / 22
Регистрация: 20.05.2016
Сообщений: 1,136
Записей в блоге: 21
03.04.2017, 16:12  [ТС]
avgoor, не спорю, но у меня нет цели сравнивать языки глобально, хотелось понять, каков прирост на данном примере. Ведь логично, что нативный код быстрее управляемого.

Добавлено через 32 секунды
С одинаково оптимизированным кодом.
0
 Аватар для avgoor
1550 / 877 / 179
Регистрация: 05.12.2015
Сообщений: 2,555
03.04.2017, 16:17
Цитата Сообщение от bedvit Посмотреть сообщение
Ведь логично, что нативный код быстрее управляемого.
Такие мелкие куски и в C# скомпилятся в нативный код. Вы будете тестировать компиляторы, а не языки.
0
 Аватар для bedvit
1208 / 259 / 22
Регистрация: 20.05.2016
Сообщений: 1,136
Записей в блоге: 21
03.04.2017, 16:33  [ТС]
Все равно через CLR, хотя и только первый проход (?). Ведь для конечного пользователя (меня к примеру), не важно как работает программа (что там быстрее - сама программа, компилятор или отлаженный код и т.д.). Важно, что результат в первом случае выдается за 20 сек., во втором за 10 (к примеру). Согласны?
0
 Аватар для bedvit
1208 / 259 / 22
Регистрация: 20.05.2016
Сообщений: 1,136
Записей в блоге: 21
05.04.2017, 18:03  [ТС]
Цитата Сообщение от bedvit Посмотреть сообщение
помочь перевести автору поиск переменных по данному уравнению на с++ (наличие доброй воли)
Добрая воля не пришла, посему пришлось самому пилить код, на незнакомом языке.
Что получилось:
Кликните здесь для просмотра всего текста
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
// ConsoleApplication4.cpp: определяет точку входа для консольного приложения.
#include "stdafx.h"
#include <string>
#include <vector>
#include <algorithm>
#include <iostream>
#include <cmath>
#include <ctime>
#include <process.h>
#include <stdio.h>
#include <iostream>
#include <thread>
 
namespace C_plus_plus
{
    //поиск переменных для решения уравнения x^3 + y^3 = z^3 - 1
    class Program
    {
    public:
        static long long n;
        static long long an;
        static long long lim;
        static long long k;
        static std::vector<long long> a;
        static int threadsN; //задать количество потоков
        static void Main();
        static void Func(long long start);
    };
}
 
namespace C_plus_plus
{
    long long Program::n = 0;
    long long Program::an = 0;
    long long Program::lim = 0;
    long long Program::k = 0;
    std::vector<long long> Program::a;
    int Program::threadsN = 8;//Environment::ProcessorCount;
 
        void Program::Main()
    {
        std::wcout << std::wstring(L"Enter the maximum value of the variables for equation (x ^ 3 + y ^ 3 = z ^ 3 - 1), followed by <Enter>:\n") << std::endl;
        std::string s;
        std::getline(std::cin, s);
        n =  std::stoll(s);
        unsigned int start_time = clock(); // начальное время
        an = n * n * n;
        a = std::vector<long long>(n + 1);
        lim = static_cast<long long>(std::pow((an - 1) / 2, 1.0 / 3));
 
        for (long long i = 1; i <= n; i++)
        {
            a[i] = i * i * i;
        }
            std::thread thr1(Func, 1);
            std::thread thr2(Func, 2);
            std::thread thr3(Func, 3);
            std::thread thr4(Func, 4);
            std::thread thr5(Func, 5);
            std::thread thr6(Func, 6);
            std::thread thr7(Func, 7);
            std::thread thr8(Func, 8);
 
            thr1.join();thr2.join();thr3.join();thr4.join();thr5.join();thr6.join();thr7.join();thr8.join();
 
        unsigned int end_time = clock(); // конечное время
        unsigned int search_time = end_time - start_time; // искомое время
 
        std::wcout << std::wstring(L"Time ") << std::endl;;
        std::cout<<(search_time/1000.0)<< std::endl;;
    }
 
    void Program::Func(long long start)
    {
        long long m = n;
        for (long long x = start; x <= lim; x = x + threadsN)
        {
            long long ax = a[x];
            long long r = an - ax - 1;
            while (a[m] > r)
            {
                m--;
            }
            long long z = static_cast<long long>(x * 1.2599);
 
            for (long long y = x; y <= m; y++)
            {
                long long z3 = ax + a[y] + 1;
 
                for (long long az = a[z]; az <= z3; z++, az = a[z])
                {
                    if (az == z3)
                    {
                        std::wcout << k++ << std::wstring(L"   ") << x << std::wstring(L"   ") << y << std::wstring(L"   ") << z << std::endl;
                    }
                }
            }
        }
 
    }
}
 
 
int main()
{   C_plus_plus::Program::Main();
    system("pause");
    return 0;
    }

По вычислениям пока прироста не получил.
Пилил в Студии 2017.
Конструктив приветствуется.
0
7804 / 6568 / 2988
Регистрация: 14.04.2014
Сообщений: 28,705
05.04.2017, 18:43
Вывод не путается?
0
 Аватар для avgoor
1550 / 877 / 179
Регистрация: 05.12.2015
Сообщений: 2,555
05.04.2017, 19:11
Цитата Сообщение от bedvit Посмотреть сообщение
нативный код быстрее управляемого.
Где в вашем коде C# управляемый код в вычислениях? unsafe - это уже не совсем управляемый код.
Цитата Сообщение от bedvit Посмотреть сообщение
По вычислениям пока прироста не получил.
Цифры какие? У меня ваш код дает такие результаты: С++ 18.5 секунд, C# 23 секунды. Если убрать unsafe - сразу становится еще хуже. Причем этот пример именно за счет того, что там только арифметика, а нет специфичных для CLR вещей, в общем и не дожен давать разницы в скорости. Но из теста мы видим, что компилятор C# в нативный код чуть уступает компилятору C++. Ощутимая разница будет в тестах, в которых есть управление памятью.
0
 Аватар для bedvit
1208 / 259 / 22
Регистрация: 20.05.2016
Сообщений: 1,136
Записей в блоге: 21
06.04.2017, 09:21  [ТС]
Если вместо векторов сделать массивы и перейти на указатели думаю можно ещё отжать по времени.nmcf, есть в начале пару строк. avgoor, комп хороший, разница не заметна. Но я думаю есть ещё, где можно оптимизировать с++

Добавлено через 4 минуты
И да покажите как в цикле запустить потоки, ведь страшно смотреть на моё творчество! В С# через лямбда.
0
7804 / 6568 / 2988
Регистрация: 14.04.2014
Сообщений: 28,705
06.04.2017, 09:25
Цитата Сообщение от bedvit Посмотреть сообщение
Если вместо векторов сделать массивы
Это ничего не даст - размер постоянный.

А при выводе надо как минимум сначала формировать строку и после выводить разом.
0
 Аватар для bedvit
1208 / 259 / 22
Регистрация: 20.05.2016
Сообщений: 1,136
Записей в блоге: 21
06.04.2017, 09:45  [ТС]
Проверки границ массива не будет(?) В строку медленнее, чем сразу в консоль ИМХО(?)
0
7804 / 6568 / 2988
Регистрация: 14.04.2014
Сообщений: 28,705
06.04.2017, 09:54
Нет там проверок.
Если строку не формировать, то отдельные операции вывода будут смешиваться у разных потоков. В C#-то у тебя строка целиком выводится.
0
Любитель чаепитий
 Аватар для GbaLog-
3745 / 1801 / 566
Регистрация: 24.08.2014
Сообщений: 6,020
Записей в блоге: 1
06.04.2017, 10:12
Цитата Сообщение от bedvit Посмотреть сообщение
покажите как в цикле запустить потоки
массив потоков создайте.
Цитата Сообщение от bedvit Посмотреть сообщение
C++
1
std::wcout << k++ << std::wstring(L" * ") << x << std::wstring(L" * ") << y << std::wstring(L" * ") << z << std::endl;
не надо конструировать строку, чтобы её вывести:
std::wcout << L" "; <--- и так прекрасно работает.
threadsN сделайте constexpr и задавайте размер массива потоков этой переменной.
и да, функцию Main перенесите в main, а Func сделайте отдельной функцией.
не читается совершенно ваш кот.
как-то помню, читал книгу, и там говорилось, что делать из одного языка подобие другого - нонсенс.
1
 Аватар для bedvit
1208 / 259 / 22
Регистрация: 20.05.2016
Сообщений: 1,136
Записей в блоге: 21
06.04.2017, 16:29  [ТС]
Цитата Сообщение от GbaLog- Посмотреть сообщение
сделайте constexpr
Что это даст? ведь на этапе компиляции не известно сколько логический ядер процессора будет в системе.
сделал для win
C++
1
2
3
    SYSTEM_INFO sysinfo;
    GetSystemInfo(&sysinfo);
    threadsN = sysinfo.dwNumberOfProcessors;
Добавлено через 7 минут
Цитата Сообщение от GbaLog- Посмотреть сообщение
std::wcout << L" "; <--- и так прекрасно работает.
Можно полностью строку? Пока не соображу как вывести, что бы не
Цитата Сообщение от nmcf Посмотреть сообщение
смешиваться у разных потоков
Добавлено через 1 минуту
Цитата Сообщение от GbaLog- Посмотреть сообщение
массив потоков создайте
вообщем-то это и был вопрос.

Добавлено через 1 минуту
Цитата Сообщение от GbaLog- Посмотреть сообщение
и да, функцию Main перенесите в main, а Func сделайте отдельной функцией.
Кликните здесь для просмотра всего текста
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
// ConsoleApplication4.cpp: определяет точку входа для консольного приложения.
#include "stdafx.h"
#include <string>
#include <vector>
#include <algorithm>
#include <iostream>
#include <cmath>
#include <ctime>
#include <process.h>
#include <stdio.h>
#include <iostream>
#include <thread>
#include <windows.h>
using namespace std;
 
    long long n=0;
    long long an=0;
    long long lim=0;
    long long k=1;
    vector<long long> a;
    int threadsN; //задать количество потоков
 
    void Func(long long start)
    {
        long long m = n;
        for (long long x = start; x <= lim; x = x + threadsN)
        {
            long long ax = a[x];
            long long r = an - ax - 1;
            while (a[m] > r)
            {
                m--;
            }
            long long z = static_cast<long long>(x * 1.2599);
 
            for (long long y = x; y <= m; y++)
            {
                long long z3 = ax + a[y] + 1;
 
                for (long long az = a[z]; az <= z3; z++, az = a[z])
                {
                    if (az == z3)
                    {
                        wcout << k++ << wstring(L"   ") << x << wstring(L"   ") << y << wstring(L"   ") << z << endl;
                    }
                }
            }
        }
 
    }
 
int main()
{
    SYSTEM_INFO sysinfo;
    GetSystemInfo(&sysinfo);
    threadsN = sysinfo.dwNumberOfProcessors;
 
    wcout << wstring(L"Enter the maximum value of the variables for equation (x ^ 3 + y ^ 3 = z ^ 3 - 1), followed by <Enter>:\n") << endl;
    string s;
    getline(cin, s);
    n = stoll(s);
    unsigned int start_time = clock(); // начальное время
    an = n * n * n;
    a = vector<long long>(n + 1);
    lim = static_cast<long long>(pow((an - 1) / 2, 1.0 / 3));
 
    for (long long i = 1; i <= n; i++)
    {
        a[i] = i * i * i;
    }
    thread thr1(Func, 1);
    thread thr2(Func, 2);
    thread thr3(Func, 3);
    thread thr4(Func, 4);
    thread thr5(Func, 5);
    thread thr6(Func, 6);
    thread thr7(Func, 7);
    thread thr8(Func, 8);
 
    thr1.join(); thr2.join(); thr3.join(); thr4.join(); thr5.join(); thr6.join(); thr7.join(); thr8.join();
 
    unsigned int end_time = clock(); // конечное время
    unsigned int search_time = end_time - start_time; // искомое время
 
    wcout << wstring(L"Time ") << endl;;
    cout << (search_time / 1000.0) << endl;;
 
    system("pause");
    return 0;
    }
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
06.04.2017, 16:29
Помогаю со студенческими работами здесь

Принцип работы цикла на конкретном примере
Приветствую, форумчане. Учу PHP. В процессе обучения наткнулся на пример использования данных из массива в цикле: &lt;?php ...

Оптимальная реализация построения БД на конкретном примере
Добрый день! Вопрос следующий: базу данных вроде как принято наполнять посредством добавления новых записей. А что если у меня...

Использование функции округления на конкретном примере
Как использовать функцию округления на конкретном примере: #include &lt;iostream&gt; #include &lt;Math.h&gt; using namespace std; int...

Как распарсить JSON на джаве на конкретном примере?
I have the following JSON text that I need to parse to get &quot;id&quot;: 176514, What is the required code? Help my please!!! ...

Написать математическое решение задачи на конкретном примере
Здравствуйте, помогите пожалуйста написать математическое решение на конкретном примере. Условия задачи: Пользователь вводит 10 записей...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Access
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru