Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / WinForms, .Net Framework Новый топик    Ответить
 Как оптимизировать перемножние результатов массива задач?  [new]
v skopin
Member

Откуда: Germany
Сообщений: 928
Привет всем!

Задача следующая: имею массив - Task<BigInteger>[Environment.ProcessorCount] нужно перемножить все результаты.
На данный момент это решается так:
return Task.WhenAll(tasks).ContinueWith(_ =>
        tasks
            .Select(t => t.Result)
            .AsParallel()
            .Aggregate((a, b) => a * b),
    TaskContinuationOptions.ExecuteSynchronously).Result;
Однако очевидно, что это не оптимальное решение, тк при получение первых двух результатов уже можно начать считать, не дожидаясь остальных. Так же очевидно(хотя проверил), если имеем планировщик в к-ом BigInteger Result { get; private set; } + lock (_lock){ Result *= task.Result; } это ещё медленнее(точнее практически столько же, как и без AsParallel()), чем выше.

Заранее благодарю ВС

Сообщение было отредактировано: 18 ноя 21, 13:20
18 ноя 21, 13:15    [22397451]     Ответить | Цитировать Сообщить модератору
 Re: Как оптимизировать перемножние результатов массива задач?  [new]
petalvik
Member

Откуда:
Сообщений: 738
Process asynchronous tasks as they complete
18 ноя 21, 13:35    [22397465]     Ответить | Цитировать Сообщить модератору
 Re: Как оптимизировать перемножние результатов массива задач?  [new]
v skopin
Member

Откуда: Germany
Сообщений: 928
petalvik,
тоже дольше, там просто действие разделено во времени, те не в конце, а по ходу исполнения, но временные затраты такие как у без AsParallel()(((
18 ноя 21, 13:45    [22397475]     Ответить | Цитировать Сообщить модератору
 Re: Как оптимизировать перемножние результатов массива задач?  [new]
Andromeda777
Member

Откуда: Петербург
Сообщений: 68
v skopin
Привет всем!

Задача следующая: имею массив - Task<BigInteger>[Environment.ProcessorCount] нужно перемножить все результаты.
На данный момент это решается так:
return Task.WhenAll(tasks).ContinueWith(_ =>
        tasks
            .Select(t => t.Result)
            .AsParallel()
            .Aggregate((a, b) => a * b),
    TaskContinuationOptions.ExecuteSynchronously).Result;
Однако очевидно, что это не оптимальное решение, тк при получение первых двух результатов уже можно начать считать, не дожидаясь остальных. Так же очевидно(хотя проверил), если имеем планировщик в к-ом BigInteger Result { get; private set; } + lock (_lock){ Result *= task.Result; } это ещё медленнее(точнее практически столько же, как и без AsParallel()), чем выше.

Заранее благодарю ВС

Я не уверен, тут зависит от данных, но вы больше ресурсов потратите на накладные операции. Интересная задача, я потестирую различные решения, какой у вас порядок количества чисел?
18 ноя 21, 13:52    [22397480]     Ответить | Цитировать Сообщить модератору
 Re: Как оптимизировать перемножние результатов массива задач?  [new]
v skopin
Member

Откуда: Germany
Сообщений: 928
Andromeda777,
не знаю точно - пишу для родственника-физика ... что-то в космосе считает. Тестирую на 1000000! (факториал)
18 ноя 21, 14:07    [22397492]     Ответить | Цитировать Сообщить модератору
 Re: Как оптимизировать перемножние результатов массива задач?  [new]
vb_sub
Member

Откуда:
Сообщений: 983
v skopin,
Если ты работаешь с числами, то может тебе будут полезны векторы?
18 ноя 21, 14:31    [22397513]     Ответить | Цитировать Сообщить модератору
 Re: Как оптимизировать перемножние результатов массива задач?  [new]
Shocker.Pro
Member

Откуда: ->|<- :адуктО
Сообщений: 22584
v skopin
Тестирую на 1000000! (факториал)
на факториале от миллиона? через сколько тысяч лет должен закончиться расчет?
Да и не влезет результат в BigInt, если хотя бы небольшая часть чисел будет больше 1 )

Сообщение было отредактировано: 18 ноя 21, 14:45
18 ноя 21, 14:43    [22397520]     Ответить | Цитировать Сообщить модератору
 Re: Как оптимизировать перемножние результатов массива задач?  [new]
v skopin
Member

Откуда: Germany
Сообщений: 928
Shocker.Pro
через сколько тысяч лет должен закончиться расчет?
через 00:02:44.0923093 (при ||-ом вычислении); к слову при нормальном что-то типа 7 минут

Сообщение было отредактировано: 18 ноя 21, 18:35
18 ноя 21, 18:26    [22397664]     Ответить | Цитировать Сообщить модератору
 Re: Как оптимизировать перемножние результатов массива задач?  [new]
mayton
Member

Откуда: loopback
Сообщений: 52996
Так как вы его считаете? Он же ни в память ни в диск не влезет.
18 ноя 21, 23:06    [22397731]     Ответить | Цитировать Сообщить модератору
 Re: Как оптимизировать перемножние результатов массива задач?  [new]
Сон Веры Павловны
Member

Откуда:
Сообщений: 6257
mayton
Так как вы его считаете?

Ну, может он его по формуле Стирлинга считает. Хотя с памятью да, в любом случае будет затык.
19 ноя 21, 03:10    [22397759]     Ответить | Цитировать Сообщить модератору
 Re: Как оптимизировать перемножние результатов массива задач?  [new]
Shocker.Pro
Member

Откуда: ->|<- :адуктО
Сообщений: 22584
в 1млн! только число порядков несколько миллионов
источника такого количества информации просто не существует
Я думаю, что с ТС просто возникло какое-то недопонимание ))

+
считается, что в известной наблюдаемой вселенной существует от 1078 до 1082 атомов


Сообщение было отредактировано: 19 ноя 21, 13:14
19 ноя 21, 13:11    [22397917]     Ответить | Цитировать Сообщить модератору
 Re: Как оптимизировать перемножние результатов массива задач?  [new]
mayton
Member

Откуда: loopback
Сообщений: 52996
Да. Если отбросить коэффициенты то по Стирлингу будет примерно
миллион в миллионной степени. Такие числа невозможно ни хранить
ни перемножать. Всей планеты Земля не хватит на это.

Наверное ТС страдает фигней.
19 ноя 21, 13:15    [22397918]     Ответить | Цитировать Сообщить модератору
 Re: Как оптимизировать перемножние результатов массива задач?  [new]
v skopin
Member

Откуда: Germany
Сообщений: 928
Боюсь разочаровать уважаемых знатоков: не просто считает, но и выводит на экран
На скане факториал 800000L - (долго работает ToString(), поэтому не 1 000 000), влезла в скан только часть последних нулей, размер шрифта 5)))))
результаты вычислений 1000000L! на 8ми ядерном ноутбучном i5 10ого поколения получен за 00:03:10.1499570.

К сообщению приложен файл. Размер - 149Kb


Сообщение было отредактировано: 20 ноя 21, 03:47
20 ноя 21, 03:45    [22398240]     Ответить | Цитировать Сообщить модератору
 Re: Как оптимизировать перемножние результатов массива задач?  [new]
v skopin
Member

Откуда: Germany
Сообщений: 928
проще же посмотреть, например тут: Factorial Calculator n!

там нет возможности посчитать для 1000000, только для 999999

Сообщение было отредактировано: 20 ноя 21, 04:00
20 ноя 21, 03:58    [22398241]     Ответить | Цитировать Сообщить модератору
 Re: Как оптимизировать перемножние результатов массива задач?  [new]
Shocker.Pro
Member

Откуда: ->|<- :адуктО
Сообщений: 22584
v skopin
Боюсь разочаровать уважаемых знатоков: не просто считает, но и выводит на экран
посчитать факторил - задача тривиальная и одноразовая, вопрос был в другом
Andromeda777
какой у вас порядок количества чисел?
и ответ
v skopin
Тестирую на 1000000! (факториал)

это и вызвало недоумение
20 ноя 21, 12:35    [22398285]     Ответить | Цитировать Сообщить модератору
 Re: Как оптимизировать перемножние результатов массива задач?  [new]
Shocker.Pro
Member

Откуда: ->|<- :адуктО
Сообщений: 22584
Ну то есть задача фактически перемножить 1000000 чисел, а не 1000000! чисел
20 ноя 21, 12:37    [22398286]     Ответить | Цитировать Сообщить модератору
Все форумы / WinForms, .Net Framework Ответить