多线程BigInteger操作
本文关键字:操作 BigInteger 多线程 | 更新日期: 2023-09-27 18:01:53
执行非常复杂的BigInteger操作非常慢,例如
BigInteger.Pow(BigInteger(2),3231233282348);
我想知道是否有任何方法我可以多线程任何这些基本的数学函数
这取决于数学函数,但我真的看不出你怎么能加速基本的数学函数。对于这类计算,流程中的下一步通常依赖于流程中的前一步。只有当计算的部分可以独立计算时,线程才会真正有帮助。在最后的步骤中,这些可以结合起来产生结果。您需要自己将这些计算分解为可以并发运行的部分。
例如:如果你有一个2 * 3 + 3 * 4的公式。您可以运行两个线程,第一个计算2 * 3,第二个计算3 * 4。然后,您可以在最后将结果放在一起,并将两个结果相加。你需要弄清楚如何将计算分解成更小的部分,然后相应地执行它们。
在使用power的示例中,您可以在4个线程中计算出以下内容,然后在最后通过将结果相乘来组合结果:
BigInteger.Pow(BigInteger(2),807808320587);
BigInteger.Pow(BigInteger(2),807808320587);
BigInteger.Pow(BigInteger(2),807808320587);
BigInteger.Pow(BigInteger(2),807808320587);
这不会为您节省任何时间,因为所有4个核心都将在尝试解决相同的事情时挣扎,您将在最后将它们彼此相乘,这就是单线程解决方案所做的事情。在某些处理器上,它甚至会慢得多,因为如果其他处理器空闲,它们通常会加速一个核心。我把它分解了就像把2^5分解成2^2 * 2^3一样
BigInteger.Pow(BigInteger(2), 3231233282348);
将包含
Log(2)/Log(10) * 3231233282348 == 9.727e11
数字;所以它需要900 GB来写答案。这就是为什么
如果你正在使用。net 4.5,请阅读async await:
http://blog.stephencleary.com/2012/02/async-and-await.html