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

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

31.03.2017, 19:33. Показов 7141. Ответов 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
1719 / 568 / 187
Регистрация: 12.03.2016
Сообщений: 2,169
10.04.2017, 13:53
Студворк — интернет-сервис помощи студентам
Вы используете переменные long long которые занимают 8 байт. В ассемблере регистры общего назначения (eax, ecx и т.д.) имеют разрядность 4 байта, значит не подходят (через костыли конечно можно). Значит надо использовать avx регистры (sse не рассматриваем). Если стека хватит то можно и на чисто ассемблерной вставке, если нет, то для этого в плюсах есть simd команды, которые работают так же шустро.
1
 Аватар для bedvit
1210 / 261 / 22
Регистрация: 20.05.2016
Сообщений: 1,147
Записей в блоге: 22
10.04.2017, 14:10  [ТС]
мановар, алгоритм простой
Кликните здесь для просмотра всего текста
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
// ConsoleApplication4.cpp: определяет точку входа для консольного приложения.
#include "stdafx.h"
#include <string>
#include <vector>
#include <iostream>
#include <thread>
 
using namespace std;
//поиск переменных для решения уравнения x^3 + y^3 = z^3 - 1
    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;
        wstring s;
        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 = x * 12599/10000;
 
            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)
                    {
                        s = to_wstring(k++) + L"   " + to_wstring(x) + L"   " + to_wstring(y) + L"   " + to_wstring(z) + L"\n";
                        wcout << s;
                    }
                }
            }
        }
 
    }
 
int main()
{
    string s;
    threadsN = thread::hardware_concurrency();
    wcout << wstring(L"Enter the maximum value of the variables for equation (x ^ 3 + y ^ 3 = z ^ 3 - 1), followed by <Enter>:\n") << endl;
    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;
 
    vector<thread> thr(threadsN);
    for (int i = 1; i <= threadsN; i++) thr[i-1] = thread(Func, i);
    for (int i = 1; i <= threadsN; i++) thr[i-1].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;
    }

Суть: ищем в задаваемом диапазоне переменных (например до 100 000) переменные удовлетворяющие уравнению x^3 + y^3 = z^3 - 1.
Мах. границу диапазона вводит пользователь - только натуральные числа (минимальная всегда 1). Далее строится массив (вектор) степеней этих чисел (до макс.границы). Далее в отдельных потоках (зависит от количества лог. ядер ЦП), запускается числодробилка -Func(), которая из этого массива/вектора подбирает варианты когда они удовлетворяют уравнению и выводит в консоль (в main() переменные не возвращаются, но есть глобальные переменные - общие для потоков)
Ветка с зеркальными вариантами х,у обрезается. Обрезаются итерации - которые заведомо не дадут нужного результата.

Добавлено через 7 минут
Естественно каждый поток считает с шагом по массиву/вектору числа самих потоков - threadsN (очень хорошо и равномерно параллелится).
Цитата Сообщение от мановар Посмотреть сообщение
long long
потому как число в кубе растет быстро и вылезает за рамки long, то же быстро.

Добавлено через 4 минуты
Цитата Сообщение от мановар Посмотреть сообщение
avx регистры
Цитата Сообщение от мановар Посмотреть сообщение
есть simd команды
признаюсь, пока слаб в оном.
1
1719 / 568 / 187
Регистрация: 12.03.2016
Сообщений: 2,169
10.04.2017, 14:12
Потоки еще не изучал (в планах), но на avx переложить попробую.
0
7804 / 6568 / 2988
Регистрация: 14.04.2014
Сообщений: 28,705
10.04.2017, 14:38
Цитата Сообщение от мановар Посмотреть сообщение
В ассемблере регистры общего назначения (eax, ecx и т.д.) имеют разрядность 4 байта
Ты говоришь про 32-битные процессоры. Сейчас есть RAX, RBX... - 64 бита.

Добавлено через 3 минуты
Цитата Сообщение от bedvit Посмотреть сообщение
студия 2017->в свойствах с/с++ ->Оптимизация?
Да. Там ставь Maximize Speed. И приложение делай 64-бита.
0
1719 / 568 / 187
Регистрация: 12.03.2016
Сообщений: 2,169
10.04.2017, 14:51
nmcf, из головы вылетело, сразу чего то в avx уперся.

Добавлено через 6 минут
Так можно почти все на асме вставками сделать, но какое это сравнение с плюсами.
0
7804 / 6568 / 2988
Регистрация: 14.04.2014
Сообщений: 28,705
10.04.2017, 14:57
мановар, для начала надо включить оптимизацию и посмотреть в окне дизассемблера, что сделал компилятор.
0
 Аватар для bedvit
1210 / 261 / 22
Регистрация: 20.05.2016
Сообщений: 1,147
Записей в блоге: 22
10.04.2017, 15:11  [ТС]
Цитата Сообщение от nmcf Посмотреть сообщение
Maximize Speed
Полная оптимизация (/Ох) и все другие на макс(Ob2,Oi,Ot, указатели на фреймы?, Gt,GL) Платформа x64.
Прирост пока малозаметный.
Как не странно (строк немного), в районе 20% от всего времени (расчет до 300 000) - отбирает вывод и преобразование строки.
C++
1
2
                        s = to_wstring(k++) + L"   " + to_wstring(x) + L"   " + to_wstring(y) + L"   " + to_wstring(z) + L"\n";
                        wcout << s;
думаю зайти через printf - гуглю.
0
1719 / 568 / 187
Регистрация: 12.03.2016
Сообщений: 2,169
10.04.2017, 15:11
Не спорю, а то не нужную работу можно проделать.
0
7804 / 6568 / 2988
Регистрация: 14.04.2014
Сообщений: 28,705
10.04.2017, 16:21
Цитата Сообщение от bedvit Посмотреть сообщение
в районе 20% от всего времени (расчет до 300 000) - отбирает вывод и преобразование строки
Она, что, часто выводится? Попробуй заменить на ostringstream.
0
 Аватар для bedvit
1210 / 261 / 22
Регистрация: 20.05.2016
Сообщений: 1,147
Записей в блоге: 22
10.04.2017, 18:35  [ТС]
через printf, запись короче в 3 раза, но как не удивительно, выводится несколько дольше...
C++
1
printf("%d %d %d %d\n", k++,x,y,z);
Хотя вот здесь пишут, что как бы должно быть наоборот.
Кликните здесь для просмотра всего текста
Развитие архитектур процессоров пошло так, что printf явно получает преимущества и мало что делается для повышения производительности полиморфического подхода, заложенного в cout. Поэтому, если вам нужны производительность и эффективность, лучше выбрать printf.


Добавлено через 1 минуту
Цитата Сообщение от nmcf Посмотреть сообщение
часто выводится?
в диапазоне до 300 000 - 52 строки по 4 переменной в каждой
0
 Аватар для bedvit
1210 / 261 / 22
Регистрация: 20.05.2016
Сообщений: 1,147
Записей в блоге: 22
18.04.2017, 09:30  [ТС]
Было бы интересно увидить аасемблерную вставку в числодробилке, протестировать.Не хватает знаний в данном направлении.
0
9988 / 2960 / 497
Регистрация: 05.10.2013
Сообщений: 8,128
Записей в блоге: 243
18.04.2017, 19:43
Сравнение насколько может быть быстрее из тутора: Tutorial — Create C/C++ plugins for Unity3D

Reference machine: Macbook Pro 15″ Mid 2014, Intel I7 2.2Ghz
  • Fill 10000 x 10000 Integer array with series:
    [Unity C#] 1.0258 seconds vs 0.2346 seconds [C Library]
  • Fill 500 x 500 Integer array with series:
    [Unity C#] 3.794 milliseconds vs 0.35 milliseconds [C Library]
  • Fill 10000 x 10000 Integer array with Random numbers:
    [Unity C#] 4.26 seconds vs 0.995 seconds [C Library]
  • Fill 10000 x 10000 Integer array with Perlin Noise:
    [Unity C#] 6.015 seconds vs 2.394 seconds [C Library]
  • Fill 500 x 500 Integer array with Perlin Noise:
    [Unity C#] 20,47 milliseconds vs 5.697 milliseconds [C Library]
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
18.04.2017, 19:43

Принцип работы цикла на конкретном примере
Приветствую, форумчане. Учу 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 записей...


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

Или воспользуйтесь поиском по форуму:
52
Ответ Создать тему
Новые блоги и статьи
Запрет дублирования строк в табличной части
Maks 13.09.2026
Реализация из решения ниже выполнена на нетиповом справочнике "Нормы ТО" с табличной часть "Виды ТО", разработанного в КА2, со следующими реквизитами: - ВидТО (СправочникСсылка. ВидыТО); - ВидГСМ. . .
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр.
Jin X 06.09.2026
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр. Работая с форумом и нейросетями в браузере часто хочется что-то подкорректировать или добавить какого-то функционала. Ниже прикреплён. . .
Программа опроса у.з. расходомера SLS-720F
Argus19 02.09.2026
Программа опроса у. з. расходомера SLS-720F Программа опрашивает один раз в минуту три ультразвуковых расходомера SLS-720F через интерфейс RS-485 по протоколу Modbus RTU. Опрашиваются регистры. . .
Hyper-V: Компьютер должен поддерживать доверенный платформенный модуль 2.0.
Maks 31.08.2026
При установке Windows 11 на виртуальную машину Hyper-V 2-го поколения вылезла такая ошибка: Решение: в параметрах виртуальной машины, в разделе "Безопасность" (Security) активировать флаг. . .
Архитектура биовида Стива в Майнкрафте: Зачем бонобо кубический каннибализм
anaschu 30.08.2026
Кубический Вагинокапитализм в Minecraft: Математический инвариант ОДУ и рок Стивов-бонобо Главная задача разработанной «Модели Всего» — наглядно продемонстрировать наличие системной «судьбы». . .
Оттачиваю умение писать js программы.
russiannick 30.08.2026
Проектом выходного дня стало написание Книги шифров Виженера. Итогом стала версия 200, синий туман. Синий туман назван так, потому что замораживает текст под собой. Нажатие синих кнопок управляют. . .
мат медиц модель 30. презентация проекта
anaschu 27.08.2026
хоп хоп хоп хидахоп, а я кладую))
Как у меня протекала болезнь
zorxor 27.08.2026
Здравствуйте, друзья! Эта запись блога предназначена именно для вас - для моих дорогих друзей, которые знали меня лично. Чтобы ответить на вопрос - а что же со мной произошло на самом деле? Я учился. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru