.NET source 系列:System.Collections.Generic.Dictionary
探究了 .net framework 4.8 下的dictionary及其常见操作实现
探究了 .net framework 4.8 下的dictionary及其常见操作实现
参考版本为 .net framework 4.8
https://referencesource.microsoft.com/#mscorlib/system/collections/generic/list.cs
List<T>
,实现接口
IList<T>,IReadOnlyList<T>T[] _items
实现,当前已存储的元素个数为
_size
/ Count
,当前容量大小通过
Capacity得到,直接返回数组 _items
的长度。reference:
本文翻译自官方文档,补充了部分前置知识与帮助理解的示例。
Protocol Buffers (a.k.a., protobuf) are Google's language-neutral, platform-neutral, extensible mechanism for serializing structured data.
Protocol Buffers 是Google由推出的,跨语言、跨平台的用于序列化数据结构的可拓展机制 / 协议。
Protobuf的编码基于变种的Base128,下面先简单介绍Base64,Base128以及ZigZag编码。
reference: https://www.zhihu.com/question/585411183
Base64编码的设计初衷是为了让数据在设备间传输时,目标机器能够正确地“理解”字节流中的内容:字节流中的内容均可以通过ascii字符正常显示。
翻译自:https://perfetto.dev/docs/case-studies/memory#heapprofd
想看一下项目在真机上的表现,所以工作之余用了Perfetto来做项目的性能测试。阅读官方文档的时候发现了这一章节介绍了Linux内存管理的一些基础概念,所以就简单翻译了一下。
从内核的角度,内存被划分为等大小4KiB的块,这些块被称为页(pages)。
这些页被组织于连续的虚拟空间中,此空间称为VMA(Virtual Memory Area)。
当一个进程通过 mmap()
系统调用请求内存时,VMA就会被创建。一般情况下,应用不会直接调用mmap(),而是通过内存分配器间接调用,像是
C 的 malloc()
, C++ 的 operator new()
或是 Java
的 new X()
等等。
VMA可以被分为两种类型:文件后备页(file-backed)与匿名页(anonymous)。
预处理:构建加速网格
找一个包围盒,在包围盒中构建均匀网格,记录每一个与物体相交的网格
光线与场景求交
射出一道光线,让光线与格子求交,若格子内存在物体,再让光线与物体求交:光线与格子求交是快速的,而与实际物体求交是很慢的,通过这样的理念来优化
经验告诉我们
当格子数等于C * 对象数时,结果会比较好;三维空间下常数C可以取27
缺陷
当细节物品在空间中分布不均匀时,存在大规模集中、大规模空白:”Teapot in a stadium” problem
*在一些场景下还是好用的,仍有在使用