目录

介绍

延迟计算

公平调度

公平线程池


  • 下载源代码 - 9.3 KB

介绍

本文简要介绍了C中的延迟计算和公平调度的概念。

延迟计算

延迟计算(懒惰计算)是一种计算策略,它将表达式的计算延迟到需要它的值时候,并且还避免重复计算。共享可以通过指数因子比其他非严格计算策略(例如按名称调用)减少某些函数的运行时间。

下面列出了延迟计算的好处:

  • 通过避免不必要的计算以及计算复合表达式的错误条件来提高性能
  • 构建潜在无限数据结构的能力
  • 将控制流(结构)定义为抽象而不是原始的能力

.NET Framework提供了Lazy <T>以管理延迟计算。为了初始化一个延迟表达式,可以通过lambda来完成:

var lazyNumber = new Lazy<int>(() => 42);
Console.WriteLine(lazyNumber.Value); // -> 42

在下面的示例中,我们创建了两个惰性表达式,我们将尝试添加它们:

var x = new Lazy<int>(() => 42);      // -> Value is not created
var y = new Lazy<int>(() => 24);      // -> Value is not createdConsole.WriteLine(x + y);             // Error : operator '+' cannot be applied
Console.WriteLine(x.Value + y.Value); // -> 66

在下面的示例中,我们创建了一个实现边缘效果的延迟表达式,我们将尝试将其冻结。

var p = new Lazy<object>(() => { Console.WriteLine("Boo"); return null; });
// Cannot create Lazy<void> in C#, so return null

让我们尝试创建自己的Lazy<T>:

public class MyLazy<T>
{private readonly Func<T> _f;private bool _hasValue;private T _value;public MyLazy(Func<T> f){_f = f;}//// Use objects of type MyLazy<T> as objects of type T // through implicit keyword//public static implicit operator T(MyLazy<T> lazy){if (!lazy._hasValue){lazy._value = lazy._f();lazy._hasValue = true;}return lazy._value;}
}

MyLazy<T> 是一个包含以下字段的泛型类:

  • _f:延迟计算的函数,返回T类型的值
  • _value:T类型的值 (冻结值)
  • _hasValue:一个布尔值,指示是否已计算该值

为了使用MyLazy<T>类型的对象作为T类型的对象,使用implicit关键字。计算在类型转换时完成。

下面是一个MyLazy<T>示例用法。

var myLazyRandom = new MyLazy<double>(GetRandomNumber);
double myRandom = myLazyRandom;
Console.WriteLine("Random with MyLazy<double>: {0}", myRandom);

其中GetRandomNumber返回随机double,如下:

static double GetRandomNumber(){Random r = new Random();return r.NextDouble();
}

公平调度

公平调度是一种调度方法,其中所有作业随时间获得相等的资源份额。CPU使用率在系统中平均分配。

假设我们想要创建以下公平调度系统:管理处理器的中央系统分配给一组线程,以便每个线程都有一段时间。

线程将被建模为由处理器测试的代码并被切割成小块。这些部件中的每一件都将花费时间。处理器具有多个可同时处理的线程,可调度线程并让它们分段运行。为了选择要执行的线程,处理器将选择成本最低的线程。

线程将有一个叫做ThreadId的整数,表示线程标识符和一个计算已完成工作量的整数Workload。线程的工件将通过IEnumerable<int>类型的Worker属性表示。

因此:

  • Worker.Current值表示最后一件完成的成本
  • Worker.MoveNext()操作使线程完成一项工作

为简单起见,该线程将有一个方法Work(),其让线程完成一项工作并将其工作量添加到Workload中。

在下面的示例代码中,我们创建了一个包含10个线程的列表。

using System;
using System.Linq;
using System.Collections.Generic;class Program
{public class Thread{public int Workload { get; set; }public int ThreadId { get; private set; }private IEnumerator<int> Worker;  // an enumerator for these partspublic Thread(){Workload = 0;ThreadId = rng.Next() % 100 + 100;Worker = CreateWorker(this).GetEnumerator();}public int Work(){int load = Worker.Current;Workload += load;Worker.MoveNext();return load;}// Work processor (metaphorized)static Random rng = new Random();static IEnumerable<int> CreateWorker(Thread p){while (true){int load = rng.Next() % 9 + 1;Console.WriteLine("{0} : working for {1} hours (total load : {2})",p.ThreadId, load, p.Workload);yield return load;}}}static void Main(string[] args){Console.WriteLine("Yield!");var ListOfThreads = new List<Thread>();for (int i = 0; i < 10; i++){var processor = new Thread();ListOfThreads.Add(processor);}Thread p;for (int i = 0; i < 500; i++){p = ListOfThreads.Aggregate((curp, next) => {if (next.Workload < curp.Workload)return next;else return curp;});p.Work();}Console.WriteLine("Press any key to exit.");Console.ReadKey();}
}

在方法Main、first和formost中,创建了10个线程的列表。然后,线程的调度是在知道应该工作的线程是具有最小工作负载的线程的情况下完成的。

公平线程池

可以创建一个线程池,允许以公平的方式安排作业。随着时间的推移,所有工作都将获得相同的资源份额。因此,CPU使用率将在系统之间平均分配。

作业将在与标记关联的池中排队。要选择要运行的作业,池中的线程会循环遍历标记。因此,将保证与标签相关联的作业永远不会被与另一个标签相关联的一堆作业阻止。从队列中挑选作业时,池将在标记之间交替。

原文地址:https://www.codeproject.com/Articles/5162791/Introducting-Lazy-Evaluation-And-Fair-Scheduling-I

在C#中引入延迟计算和公平调度相关推荐

  1. 微服务项目中引入全链路监控平台:Pinpoint、SkyWalking、Zipkin怎么选?

    来源:www.jianshu.com/p/92a12de11f18 0 问题背景 随着微服务架构的流行,服务按照不同的维度进行拆分,一次请求往往需要涉及到多个服务.互联网应用构建在不同的软件模块集上, ...

  2. 如何百倍加速 Lo-Dash?引入惰性计算

    原文:How to Speed Up Lo-Dash ×100? Introducing Lazy Evaluation. 作者: Filip Zawada 译文:如何百倍加速 Lo-Dash?引入惰 ...

  3. 物联网“新篇章”:如何将机器学习引入边缘计算?

    自 2006 年云计算正式在科技世界中展露头角,近 13 年的迅猛发展,2019 年云计算市场早已不同以往.回顾昨日,2018 年风口浪尖上的云计算,"人人说云,事事上云",各大中 ...

  4. Elasticsearch 7.0中引入的新集群协调子系统如何使用?

    Elasticsearch之所以如此流行,其中一个原因是它可以从只有几个节点的小集群扩展到拥有数百个节点的大集群.它的核心是集群协调子系统.Elasticsearch 7提供了一个新的集群协调子系统, ...

  5. java延迟函数_Java 8:延迟计算

    Java8:Stream概念的细化,讨论延迟计算/惰性求值Lazy Evaluations. Java中常见的逻辑操作be1&&f(),是短路/short-circuiting计算,避 ...

  6. Java SE Eclipse中引入第三方jar及class

    使用eclipse开发Java SE 总免不了需要引入第三方的jar或者calss文件.这里给大家说一下如何在eclipse中引入第三方jar或者calss文件. 让我们先了解一下eclipse项目中 ...

  7. C# 9.0中引入的新特性init和record的使用思考

    .NET 5.0已经发布,C# 9.0也为我们带来了许多新特性,其中最让我印象深刻的就是init和record type,很多文章已经把这两个新特性讨论的差不多了,本文不再详细讨论,而是通过使用角度来 ...

  8. 解决在html中引入font-awesome的css文件后, 图标显示不出来

    今天小颖在做项目时,需要在html文件中引入font-awesome.min.css,但是引入后: 以前小颖在用font-awesome库里的图标时,都是直接从node中下包,然后在main.js中引 ...

  9. 第16/24周 SQL Server 2014中的基数计算

    大家好,欢迎回到性能调优培训.上个星期我们讨论在SQL Server里基数计算过程里的一些问题.今天我们继续详细谈下,SQL Server 2014里引入的新基数计算. 新基数计算 SQL Serve ...

最新文章

  1. 1、存在如下数列1、1、2、4、7、13、24、44、81、149......现要求该数列第n项的值(n从O开始算)。 程序运行结果: 1/2 输入:4 输出:7 输入:9 输出:149
  2. 神马搜索上线奥运会人气榜单 中国女排包揽前三
  3. 免费下载田志刚《呼叫中心知识库心得》电子书
  4. 微信关闭html5游戏吗,5月20日起,微信将彻底关闭这个功能!
  5. 017_Cookie
  6. 网络工程师技能图谱,这些你都会吗?
  7. hspice2014安装教程
  8. 我的Wiki:使用JConsole对WildFly(或JBoss AS7)进行远程JMX访问
  9. 数学建模学习笔记(十二)——奇异值分解
  10. 华为手机免root改mac_拿到华为手机,这4个默认设置一定要改,不然流量电量很快被耗光...
  11. 安装oracle 并使用impdp 导入库
  12. 国内学者新研究:中医AI登场,自动开出药方
  13. 谷歌开源Allstar 项目,保护GitHub 仓库安全
  14. HCIE-Security Day18:防火墙用户管理(一)上网用户+本地认证(portal认证)
  15. Xcode 真机运行报错Errors were encountered while preparing your device for development. Please check the De
  16. SOUI消息订阅事件实例
  17. Python及IPython安装使用
  18. 批量替换 Word 文档前几页
  19. Windows XP的定时关机命令
  20. java最大文件描述符,java – 为什么JDK NIO使用这么多的anon_inode文件描述符?

热门文章

  1. JAVA调用 keras,在TensorFlow(Python, Java)环境下使用Keras模型
  2. java 认证和授权_SpringSecurity一:认证和授权
  3. 新年春节项目海报设计,PSD分层模板,帮你顺利交稿!
  4. 设计作品展示类网站,设计提升调性必不可少
  5. 样机|UI大佬用的样机,都在这里哦!
  6. 优质淘宝产品描述页模板框架PSD分层模板,美工实用素材
  7. rpm-tree源码分析一波
  8. GNS3 Windows安装
  9. F-Stack KNI配置注意事项
  10. windows下python3用pip安装kivy和kivy示例