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

来源:互联网 发布:世界各国知乎 编辑:程序博客网 时间:2024/06/05 18:12

今天给公司同事做关于并行编程的内部培训,大家对是否能用并行的方法计算斐波那契数列(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"><!--google_ad_client = "ca-pub-1944176156128447";/* cnblogs 首页横幅 */google_ad_slot = "5419468456";google_ad_width = 728;google_ad_height = 90;//--></script><script type="text/javascript" src="http://pagead2.googlesyndication.com/pagead/show_ads.js"></script>
原创粉丝点击