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

今天给公司同事做关于并行编程的内部培训,大家对是否能用并行的方法计算斐波那契数列(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>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值