首先通过C#实现斐波那契数列:

using System.Threading.Channels;

namespace App001
{
internal class Program
{ static async Task Main()
{
var count = 45;
await SomeTask(count); //channel run time:00:00:10.0122552ms
//await OneTask(count); //run time:00:00:23.1586639ms
Console.Read(); //多次运行结果类似
} static async Task SomeTask(int count)
{
var startTime = DateTime.Now;
var channel = Channel.CreateUnbounded<long>();
for (int i = 0; i < count; i++)
{
await channel.Writer.WriteAsync(i);
}
channel.Writer.Complete(); List<Task> tasks = new List<Task>();
for (int i = 0; i < 10; i++)
{
var task = Task.Factory.StartNew(async () =>
{
while (await channel.Reader.WaitToReadAsync())
{
if (channel.Reader.TryRead(out var result))
{
/***/
Console.WriteLine(Fib(result));
}
}
});
tasks.Add(task);
} await Task.WhenAll(tasks.ToArray()).ContinueWith(t =>
{
Console.WriteLine($"channel run time:{ DateTime.Now.Subtract(startTime)}ms");
});
} static Task OneTask(int count)
{
var startTime = DateTime.Now;
for (int i = 0; i < count; i++)
{
Console.WriteLine(Fib(i));
}
Console.WriteLine($"run time:{ DateTime.Now.Subtract(startTime)}ms");
return Task.CompletedTask;
} static long Fib(long n)
{
if (n <= 2)
return 1;
else
return Fib(n - 1) + Fib(n - 2);
}
}
}

这里是一个任务cpu和内存占用情况:

这里是十个任务cpu和内存占用情况:

结果:

下面是go实现斐波那契的代码:

func main() {
startTime := time.Now()
jobs := make(chan int, 100)
results := make(chan int, 100)
for count := 0; count < 10; count++ {
go worker(jobs, results)
} for i := 0; i < 45; i++ {
jobs <- i
} close(jobs) for j := 0; j < 45; j++ {
fmt.Println(<-results)
}
endTime := time.Now()
fmt.Println("channel run time:", endTime.Sub(startTime), "ms")
} func worker(jobs <-chan int, results chan<- int) {
for n := range jobs {
results <- fib(n)
}
} func fib(n int) int {
if n <= 2 {
return 1
}
return fib(n-1) + fib(n-2)
}

cpu和内存占用情况:

运行结果:

代码示例:

exercise/斐波那契Test at master · liuzhixin405/exercise (github.com)

go/concurrencyTest at main · liuzhixin405/go (github.com)

go和c#实现斐波那契数列的更多相关文章

  1. C#求斐波那契数列第30项的值(递归和非递归)

    using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.T ...

  2. 斐波拉契数列加强版——时间复杂度O(1),空间复杂度O(1)

    对于斐波拉契经典问题,我们都非常熟悉,通过递推公式F(n) = F(n - ) + F(n - ),我们可以在线性时间内求出第n项F(n),现在考虑斐波拉契的加强版,我们要求的项数n的范围为int范围 ...

  3. js中的斐波那契数列法

    //斐波那契数列:1,2,3,5,8,13…… //从第3个起的第n个等于前两个之和 //解法1: var n1 = 1,n2 = 2; for(var i=3;i<101;i++){ var ...

  4. 剑指Offer面试题:8.斐波那契数列

    一.题目:斐波那契数列 题目:写一个函数,输入n,求斐波那契(Fibonacci)数列的第n项.斐波那契数列的定义如下: 二.效率很低的解法 很多C/C++/C#/Java语言教科书在讲述递归函数的时 ...

  5. 算法: 斐波那契数列C/C++实现

    斐波那契数列: 1,1,2,3,5,8,13,21,34,....     //求斐波那契数列第n项的值 //1,1,2,3,5,8,13,21,34... //1.递归: //缺点:当n过大时,递归 ...

  6. 洛谷P1962 斐波那契数列 || P1349 广义斐波那契数列[矩阵乘法]

    P1962 斐波那契数列 大家都知道,斐波那契数列是满足如下性质的一个数列: • f(1) = 1 • f(2) = 1 • f(n) = f(n-1) + f(n-2) (n ≥ 2 且 n 为整数 ...

  7. Python递归及斐波那契数列

    递归函数 在函数内部,可以调用其他函数.如果一个函数在内部调用自身本身,这个函数就是递归函数.举个例子,我们来计算阶乘 n! = 1 * 2 * 3 * ... * n,用函数 fact(n)表示,可 ...

  8. 简单Java算法程序实现!斐波那契数列函数~

    java编程基础--斐波那契数列 问题描述:一只青蛙一次可以跳上1级台阶,也可以跳上2级.求该青蛙跳上一个n级的台阶总共有多少种跳法. 思路:可能出现的情况:(1) n=1 ,一种方法 ;(2)n=2 ...

  9. js 斐波那契数列(兔子问题)

    对于JS初学者来说,斐波那契数列一直是个头疼的问题,总是理不清思路. 希望看完这篇文章之后会对你有帮助. 什么是斐波那契数列 : 答: 斐波那契数列,又称黄金分割数列.因数学家列昂纳多·斐波那契(Le ...

  10. 剑指offer三: 斐波拉契数列

    斐波拉契数列是指这样一个数列: F(1)=1; F(2)=1; F(n)=F(n-1)+F(n); public class Solution { public int Fibonacci(int n ...

随机推荐

  1. 替换Spring容器中已经存在的Bean

    一.背景 我们在开发的过程中,经常会引入别人写的jar包实现某些功能.而别人的jar包一般都自动注入Spring容器中,假设别人都是通过@Bean或@Component注入的,并且没有加入@Condi ...

  2. HTML/ CSS 入门

    前言 我们在之前的学习中,对于网络有了一定的了解.现在我们来学习一些基础的 HTML/ CSS 知识.希望阅读完这篇文章能达到编写简单页面的程度. 目录: HTML/ CSS 的发明: HTML 基础 ...

  3. Java字符串比较 == 和 equals方法的区别

    今天在排除一个bug的时候出现了一个很低级但是也很容易被忽视的错误,在此写了一个小例子做记录. 首先我先说一下错误的场景,我读取了一段json数据,并使用JSONObject的实例对象的getStri ...

  4. Scala 函数闭包和柯里化

    1 package com.atguigu.function 2 3 object HighFunction { 4 def main(args: Array[String]): Unit = { 5 ...

  5. windows下安装SASS

    window下安装ruby与sass(附ruby) webstorm设置sass自动编译,及参数配置 安装sass以及如何在sublime里使用 sublime text 3 配置sass环境 sub ...

  6. #李超线段树,树链剖分#洛谷 4069 [SDOI2016]游戏

    题目 分析 就是把线段扔到了树上,注意区间查询要比较两个端点的函数值, 把区间赋值转换成两部分,从起点到LCA的区间是斜率为负数的线段, 从终点到LCA的区间是斜率为正数的线段. 代码 #includ ...

  7. openGauss中的sequence跟Oracle的sequence有什么区别?

    openGauss 中的 sequence 跟 Oracle 的 sequence 有什么区别? openGauss 中也提供了 sequence 序列功能,使用 Oracle 的用户应该都非常喜欢使 ...

  8. 记录协助Javaer硬件快速开发过程之Web技术栈对接施耐德网络IO网关

    前一段时间有个Java技术栈的朋友联系到我,需要快速对接现有的无人值守称重系统,这里的对接是指替代现有系统,而非软件层面的对接,也就是利用现有的硬件开发一套替代现有软件的自动化系统.主要设备包括地磅秤 ...

  9. nginx 均衡负载

    前言 在此只介绍一些nginx的简单的负载均衡. 正文 在这篇之前,请看我的nginx反向代理这一篇,是接着上面的例子写的. 我在上个例子中,分别是两个a.html 和 b.html 现在我把他们的名 ...

  10. 【进阶篇】Java 实际开发中积累的几个小技巧(二)

    目录 前言 六.自定义注解 6.1定义注解 6.2切面实现 6.3业务使用 七.抽象类和接口 7.1隔离业务层与 ORM 层 7.2隔离子系统的业务实现 7.3选择对比 文章小结 前言 笔者目前从事一 ...