摘要: 前言 GC 的设计里一直有一个很难绕开的矛盾:高吞吐、低延时、低内存占用,通常很难同时做到。 传统做法里,想要更短的停顿,往往要把更多工作搬到并发阶段,甚至让平时的对象访问承担更高成本;想要更高的吞吐量,又往往意味着平时路径成本必须足够低,于是更多工作会堆到回收阶段;想要更低的内存占用,则又需要更积 阅读全文
posted @ 2026-03-10 01:29 hez2010 阅读(227) 评论(2) 推荐(9)
摘要: 前言 在 .NET 里写查询的时候,很多场景下数据其实早就都在内存里了:不是数据库连接,也不是某个远程服务的结果,而就是一个数组或者 List<T>。我只是想过滤一下、投影一下。这时候,通常有几种选择: 写一个 foreach 循环 —— 性能好、可控,但代码稍微有点啰嗦; 用 LINQ —— 写起 阅读全文
posted @ 2025-11-24 00:54 hez2010 阅读(5613) 评论(36) 推荐(73)
摘要: 同步代码和异步代码 一般而言,代码可分为同步与异步两类。两者同样需要等待操作完成:同步会阻塞当前线程,直至操作结束后再继续执行后续逻辑;异步则不阻塞当前线程,而是在发起操作时预先注册完成后的处理逻辑,待操作完成时由操作本身或外部机制触发该逻辑。 于是这就带来一个问题,那就是同步代码和异步代码的写法是 阅读全文
posted @ 2025-09-18 00:42 hez2010 阅读(5552) 评论(10) 推荐(68)
摘要: GC 的 STW 问题 GC,垃圾回收器,本质上是一种能够自动管理自己分配的内存的生命周期的内存分配器。这种方法被大多数流行编程语言采用,然而当你使用垃圾回收器时,你会失去对应用程序如何管理内存的控制。C# 允许在自动控制内存的基础之上局部对内存进行手动控制,但是自动控制仍然是主要的场景。 然而 G 阅读全文
posted @ 2025-05-22 00:29 hez2010 阅读(5388) 评论(25) 推荐(66)
摘要: 前言 .NET NativeAOT 想必不少开发者都已经很熟悉了,它可以将 .NET 程序集直接编译到原生的机器代码,从而可以脱离 VM 直接运行。简单的一句 dotnet publish -c Release -r <rid> /p:PublishAot=true 就可以做到。 在编写 C++ 程 阅读全文
posted @ 2025-04-07 22:55 hez2010 阅读(3735) 评论(10) 推荐(49)
摘要: 前言 什么?用 C# 插值字符串处理器写一个输入用的 sscanf?你确定不是输出用的 sprintf? 我猜不少读者看到标题后大概会有上述的想法。然而我们这里还真就是实现 sscanf,而不是 sprintf。 插值字符串处理器 C# 有一个特性叫做插值字符串,使用插值字符串,你可以自然地往字符串 阅读全文
posted @ 2025-02-16 17:06 hez2010 阅读(1912) 评论(6) 推荐(31)
摘要: Brainfly: 用 C# 类型系统构建 Brainfuck 编译器 阅读全文
posted @ 2025-01-31 23:27 hez2010 阅读(1943) 评论(6) 推荐(15)
摘要: 本系列为 RyuJIT 教程,将分为多篇进行更新发布,旨在给对 .NET 编译器有兴趣、以及希望参与 .NET JIT 编译器开发工作的人提供一些参考资料。 阅读全文
posted @ 2024-12-09 20:59 hez2010 阅读(1527) 评论(13) 推荐(28)
摘要: 前言 预计在 2024 年 11 月,C# 13 将与 .NET 9 一起正式发布。今年的 C# 更新主要集中在 ref struct 上进行了许多改进,并添加了许多有助于进一步提高生产力的便利功能。 本文将介绍预计将在 C# 13 中添加的功能。 注意:目前 C# 13 还未正式发布,因此以下内容 阅读全文
posted @ 2024-07-27 01:16 hez2010 阅读(4774) 评论(11) 推荐(32)
摘要: 前言 Windows 自从很久以来就有一个叫做 COM 的 Native ABI。这是一套面向对象的 ABI,在此之上 Windows 基于 COM ABI 暴露了各种各样的 API,例如 Management API、Shell API 和 DirectX API 就是典型。COM 自然不仅局限于 阅读全文
posted @ 2024-02-21 19:51 hez2010 阅读(3804) 评论(2) 推荐(18)