您的位置:首页 > 其它

使用并行的方法计算斐波那契数列 (Fibonacci)

2013-07-18 18:19 363 查看
今天给公司同事做关于并行编程的内部培训,大家对是否能用并行的方法计算斐波那契数列(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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: