原创 WebAssembly入門筆記[3]:利用Table傳遞引用

在《WebAssembly入門筆記[2]》中,我們介紹瞭如何利用Memory在作爲宿主的JavaScript應用和wasm模塊之間傳遞數據,但是Memory面向單純二進制字節的讀寫在使用起來還是不太方便,此時我們會更多地用到另一個重要的對象

原创 WebAssembly入門筆記[2]:利用Memory傳遞字節數據

利用靈活的“導入”和“導出”機制,WebAssembly與承載的JavaScript應用之間可以很便利地“互通有無”。《與JavaScript的交互》着重演示瞭如何利用函數的導入和導出實現功能的共享,接下來我們主要關注數據的傳遞或者共享。宗

原创 WebAssembly入門筆記[1]:與JavaScript的交互

前一陣子利用Balazor開發了一個NuGet站點,對WebAssembly進行了初步的瞭解,覺得挺有意思。在接下來的一系列文章中,我們將通過實例演示的方式介紹WebAssembly的一些基本概念和編程模式。首先我們先來說說什麼是WebAs

原创 模擬ASP.NET Core MVC設計與實現

前幾天有人在我的《ASP.NET Core框架揭祕》讀者羣跟我留言說:“我最近在看ASP.NET Core MVC的源代碼,發現整個系統太複雜,涉及的東西太多,完全找不到方向,你能不能按照《200行代碼,7個對象——讓你瞭解ASP.NET

原创 .NET的各種對象在內存中如何佈局[博文彙總]

在過去一段時間裏,我陸陸續續寫一些關於.NET對象類型佈局的文章,其中包括值類型和引用類型的內存佈局、字符串對象和數組的內存佈局等,這裏作一個簡單的彙總。[1] 如何計算一個實例佔用多少內存?我們都知道CPU和內存是程序最爲重要的兩類指標,

原创 NativeBuffering,一種高性能、零內存分配的序列化解決方案[性能測試續篇]

在《NativeBuffering,一種高性能、零內存分配的序列化解決方案[性能測試篇]》我比較了NativeBuffering和System.Text.Json兩種序列化方式的性能,通過性能測試結果可以看出NativeBuffering具

原创 實現一個極簡的字節數組對象池

.NET利用ArrayPoolPool<T>和MemoryPool<T>提供了針對Array/Memory<T>的對象池功能。最近在一個項目中需要使用到針對字節數組的對象池,由於這些池化的字節數組相當龐大,我希望將它們分配到POH上以降低G

原创 NativeBuffering,一種高性能、零內存分配的序列化解決方案[性能測試篇]

第一版的NativeBuffering([上篇]、[下篇])發佈之後,我又對它作了多輪迭代,對性能作了較大的優化。比如確保所有類型的數據都是內存對齊的,內部採用了池化機器確保真正的“零內存分配”等。對於字典類型的數據成員,原來只是“表現得像

原创 兩種基於時間窗口的限流器的簡單實現

之前開發的一款基於OpenTelemetry的Tracing組件需要使用基於速率限制(Rate Limiting)的跟蹤採樣策略,本想使用現有的解決方案,比如System.Threading.RateLimiting命名空間下的RateLi

原创 利用一段字節序列構建一個數組對象

《.NET中的數組在內存中如何佈局? 》介紹了一個.NET下針對數組對象的內存佈局。既然我們知道了內存佈局,我們自然可以按照這個佈局規則創建一段字節序列來表示一個數組對象,就像《以純二進制的形式在內存中繪製一個對象》構建一個普通的對象,以及

原创 .NET中的數組在內存中如何佈局?

總的來說,.NET的值類型和引用類型都映射一段連續的內存片段。不過對於值類型對象來說,這段內存只需要存儲其字段成員,而對應引用類型對象,還需要存儲額外的內容。就內存佈局來說,引用類型有兩個獨特的存在,一個是字符串,另一個就是數組。我在《你知

原创 NativeBuferring,一種零分配的數據類型[下篇]

上文說到Unmanaged、BufferedBinary和BufferedString是NativeBuffering支持的三個基本數據類型,其實我們也可以說NativeBuffering只支持Unmanaged和IReadOnlyBuff

原创 NativeBuferring,一種零分配的數據類型[上篇]

之前一個項目涉及到針對海量(千萬級)實時變化數據的計算,由於對性能要求非常高,我們不得不將參與計算的數據存放到內存中,並通過檢測數據存儲的變化實時更新內存的數據。存量的數據幾乎耗用了上百G的內存,再加上它們在每個時刻都在不斷地變化,所以每時

原创 Int64針對32位架構是按照4字節還是8字節對齊?

作爲構建.NET的標準,CLI Spec(ECMA-335)針對基元類型的對齊規則具有如下的描述。按照這個標準,我們是這麼理解的:8字節的數據類型(int64、unsigned int64和float64)根據採用的機器指令架構選擇4字節或

原创 你知道.NET的字符串在內存中是如何存儲的嗎?

毫無疑問,字符串是我們使用頻率最高的類型。但是如果我問大家一個問題:“一個字符串對象在內存中如何表示的?”,我相信絕大部分人回答不上來。我們今天就來討論這個問題。一、字符串對象的內存佈局 二、以二進制的方式創建一個String對象 三、字符