今天给公司同事做关于并行编程的内部培训,大家对是否能用并行的方法计算斐波那契数列(Fibonacci),以及使用并行的方法能否提高其性能进行了一些讨论。
我的结论是:
1.可以使用并行的方法计算。
2. 如果只是单纯的计算斐波那契数列,则无法提高性能。但对“类似计算斐波那契数列的问题”,如果该问题的计算量够大,则有可能提高性能。
下面利用苹果的并行程序库GCD(Grand Central Dispatch),写了一段Objective-C代码来验证我的结论。如果单纯计算数列,则并行的方式反而比串行慢。为了仿真“大计算量的类斐波那契数列问题”,我在计算斐波那契数列的函数里加入了sleep 两秒的语句。实验结果显示,这种方式下并行可以提高性能。
下面是代码和实验结果:
#import <Foundation/Foundation.h>
int fibonacci(int i)
{
[NSThreadsleepForTimeInterval:2];
if (i < 2)
return i;
else
return fibonacci(i-1) + fibonacci(i-2);
}
int main(int argc, const char* argv[])
{
int a = 6;
NSLog(@"serial caculating Fibonacci(%d)...", a);
double start1 = [[NSDatedate] timeIntervalSince1970];
int fibo1 = fibonacci(a);
double end1 = [[NSDatedate] timeIntervalSince1970];
NSLog(@"fibonacci(%d) = %d, cost %f seconds", a, fibo1, end1-start1);
NSLog(@"parallel calculateing Fibonacci(%d)...", a);
double start2 = [[NSDatedate] timeIntervalSince1970];
__block int fibo2sub1 = 0;
__block int fibo2sub2 = 0;
dispatch_group_t group = dispatch_group_create();
dispatch_group_async(group, dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{fibo2sub1 = fibonacci(a-1);});
dispatch_group_async(group, dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{fibo2sub2 = fibonacci(a-2);});
dispatch_group_wait(group, DISPATCH_TIME_FOREVER);
[NSThreadsleepForTimeInterval:2];
int fibo2 = fibo2sub1 + fibo2sub2;
double end2 = [[NSDatedate] timeIntervalSince1970];
NSLog(@"fibonacci(%d) = %d, cost %f seconds", a, fibo2, end2 - start2);
dispatch_release(group);
return (0);
} //main
实验结果:
2013-07-18 17:42:04.613 Fibonacci[34666:303] serial caculating Fibonacci(6)...
2013-07-18 17:42:54.636 Fibonacci[34666:303] fibonacci(6) = 8, cost 50.021813 seconds
2013-07-18 17:42:54.637 Fibonacci[34666:303] parallel calculateing Fibonacci(6)...
2013-07-18 17:43:26.651 Fibonacci[34666:303] fibonacci(6) = 8, cost 32.013492 seconds
如果把代码中的sleep语句全部注释掉,单纯计算斐波那契数列,则结果是:
2013-07-18 18:04:39.885 Fibonacci[35617:303] serial caculating Fibonacci(6)...
2013-07-18 18:04:39.888 Fibonacci[35617:303] fibonacci(6) = 8, cost 0.000017 seconds
2013-07-18 18:04:39.889 Fibonacci[35617:303] parallel calculateing Fibonacci(6)...
2013-07-18 18:04:39.890 Fibonacci[35617:303] fibonacci(6) = 8, cost 0.000246 seconds
<script type="text/javascript"> </script><script type="text/javascript" src="http://pagead2.googlesyndication.com/pagead/show_ads.js"></script>