我正在努力进行有关多线程的演示。我需要一个计算密集型函数/方法的例子。但与此同时,执行计算的代码应该很简单。
例如,我正在寻找一个函数,可能会像计算pi或e的第n位一样:
function calculatePiToNthDecimalDigit(digits) {
var pi = "3.";
for (var i = 1; i < digits; i++) {
pi += digitOfPiAtDecimalPlace(i);
}
return pi;
}
function digitOfPiAtDecimalPlace(decimalPlace) {
...
}
任何人都可以给我一个相对简单的函数示例但可以连续使用(例如紧密循环)以生成非常难以计算(需要很长时间)的值吗?
答案 0 :(得分:0)
我能想到的最简单的方法是总结一大堆数字。添加显然很容易,但如果列表很大,那将使计算密集,并且问题很适合多线程。
答案 1 :(得分:0)
真正的测试来自真正的问题。如何使用简单的公式(例如trapezoidal rule:
)对函数进行数值积分让我们尝试使用C#
来证明void Main(string[] args)
{
int N = 2097153;
double two = Integral(0, Math.PI, N);
double err = (2.0 - two) / 2.0;
Console.WriteLine("N={0} err={1}", N, err);
}
double f(double x) { return Math.Sin(x); }
double Integral(double a, double b, int N)
{
double h = (b - a) / N;
double res = (f(a) + f(b)) / 2;
for (int j = 1; j < N; j++)
{
double x = a + j*h;
res += f(x);
}
return h * res;
}
此时我在几毫秒后得到N=2097153
和err=2.1183055309848E-13
。如果你的准确度要高得多,那么随着舍入误差开始蔓延,误差会开始上升。我认为Pi
的计算会发生类似的事情,而你会在几毫秒内达到机器精度。除此之外,你真的在计算垃圾。您可以多次重复积分以获得更长的整体效果。
所以你可能会显示从140毫秒到90毫秒的时间下降并将其视为胜利。
答案 2 :(得分:0)
两个NxN矩阵的乘法具有与N ^ 3成比例的复杂度,因此仅通过对足够大的矩阵进行平方来创建“计算密集”任务相对容易。例如,当大小从N = 10到N = 100到N = 1000时,经典算法对矩阵乘法所需的(标量)乘法数从一千到一百万到十亿。
如果您的多线程演示旨在利用这些机会,那么此类任务也有很多并行处理的机会。例如。同一行可以并行乘以多个列。