我正在研究Fibonacci范围计算算法。
我已经尝试过简单的 - 增加for循环和矩阵乘法,并尝试使用Task
,Parallel
和其他TPL功能重构它们。
但最简单的(for循环的增量)仍然覆盖所有其他人。
public static IEnumerable<int> FibonacciSimple(uint x)
{
int prev = -1;
int next = 1;
for (uint i = 0; i < x; i++)
{
int sum = prev + next;
prev = next;
next = sum;
yield return sum;
}
}
这是否意味着CLR关心所有这些并且没有挑战空间,或者有什么可以玩的?
答案 0 :(得分:2)
您是否尝试过使用LINQ,只是为了好玩和参考:
int n = 10;
int result = Enumerable.Range(1, n)
.Skip(2)
.Aggregate(new { Current = 1, Prev = 1 },
(x, index) => new { Current = x.Prev + x.Current, Prev = x.Current })
.Current;
比添加AsParallel
后快了两倍:
int fib2 = Enumerable.Range(1, n)
.AsParallel()
.Skip(2)
.Aggregate(new { Current = 1, Prev = 1 },
(x, index) => new { Current = x.Prev + x.Current, Prev = x.Current })
.Current;
因为Fibonacci计算不能轻易并行化,只是增加了线程开销。