使用 DryIoc 替换 Abp 的 DI 框架

一、背景

你说我 Castle Windsor 库用得好好的,为啥要大费周章的替换成 DryIoc 库呢?那就是性能,DryIoc 是一款优秀而且轻量级的 DI 框架,整个项目代码就两个文件,加起来代码 1 万行左右(PS: 大部分都是注释)。

在各个 Ioc 容器的性能评测当中,DryIoc 以其优异的性能成为我选择使用他的原因。Abp 使用的 Castle Windsor 在解析复杂对象的时候,速度非常慢,而替换为 DryIoc 之后速度可以提升 150% 以上。

【注意】

本文仅对 .NET Core 相关的库进行更改并测试,.NET Framework 相关的库并没有进行修改测试。

《CLR Via C#》读书笔记:27.计算限制的异步操作

一、CLR 线程池基础

一般来说如果计算机的 CPU 利用率没有 100% ,那么说明很多进程的部分线程没有运行。可能在等待 文件/网络/数据库等设备读取或者写入数据,又可能是等待按键、鼠标移动等事件。

执行 I/O 限制的操作时,操作系统通过设备驱动程序通知硬件干活,而 CPU 处于一种空闲状态。而在现代应用程序当中,使用线程池来执行计算限制的操作,而不是手动创建线程。

每个 CLR 都有自己独立的线程池,并且由各自 CLR 控制的所有 AppDomain 所共享。

线程池本身维护了一个请求队列,当程序需要执行一个异步操作的时候,会将一个记录项追加到队列之中,然后由线程池将该记录项分派给线程池线程,如果没有线程则创建一个新的线程。线程任务处理完整之后,将该线程放入线程池中等待以后进行复用。

线程池本身是启发式的,结合程序负载,他会自己根据当前线程池内线程的状态销毁/新增线程。

《CLR Via C#》读书笔记:26.线程基础

一、线程开销

操作系统创建线程是有代价的,其主要开销在下面列举出来了。

内存开销

  1. 线程内核对象

    拥有线程描述属性与线程上下文,线程上下文占用的内存空间为 x86 架构 占用 700 字节、x64 架构 1240 字节 、ARM 架构 350 字节。

  2. 线程环境块(TEB)

    TEB 消耗一个内存页,占用 4KB内存。

  3. 用户模式栈。

    用户模式栈存储传递给方法的局部变量与实参,并且还存储有一个地址用于当前方法返回的时候,线程应该从哪个地方继续执行。默认 Windows 分配保留 1MB 内存。

《CLR Via C#》读书笔记:24.运行时序列化

一、什么是运行时序列化

序列化的作用就是将对象图(特定时间点的对象连接图)转换为字节流,这样这些对象图就可以在文件系统/网络进行传输。

二、序列化/反序列化快速入门

一般来说我们通过 FCL 提供的 BinaryFormatter 对象就可以将一个对象序列化为字节流进行存储,或者通过该 Formatter 将一个字节流反序列化为一个对象。

Abp 源码分析:十六、后台工作与后台工作者

0. 简介

在某些时候我们可能会需要执行后台任务,或者是执行一些周期性的任务。比如说可能每隔 1 个小时要清除某个临时文件夹内的数据,可能用户会要针对某一个用户群来群发一组短信。前面这些就是典型的应用场景,在 Abp 框架里面为我们准备了后台作业和后台工作者来帮助我们解决这个问题。

后台作业与后台工作者的区别是,前者主要用于某些耗时较长的任务,而不想阻塞用户的时候所使用。后者主要用于周期性的执行某些任务,从 “工作者” 的名字可以看出来,就是一个个工人,而且他们每个工人都拥有单独的后台线程。

Built with Hugo
主题 StackJimmy 设计