摘要:受限于当时的基础设施, 只能做到这样的程度: C# Protobuf如何做到0分配内存的序列化 但是Protobuf 3.13开始提供对Span的支持, 就意味着可以真正做到0分配内存, 对GC非常友好: Add ParseFrom(ReadOnlySequence<byte>) method to 阅读全文
posted @ 2020-12-22 11:13 egmkang 阅读(182) 评论(0) 推荐(0) 编辑
摘要:586之前的CPU, 会通过LOCK锁总线的形式来实现原子操作. 686开始则提供了存储一致性(Cache coherence), 这是多处理的基础, 也是原子操作的基础. 1. 存储的粒度 存储的组织形式(粒度)是以CacheLine为单位的, 通常为64字节甚至更高(早期也有32字节的). 然后 阅读全文
posted @ 2020-12-04 10:10 egmkang 阅读(886) 评论(0) 推荐(0) 编辑
摘要:首先, 这个Flash不是我们在浏览器用的Flash这种技术, 而是: 动作缓慢, 车速极快 闪电(Flash). 18年的某一个周末, 即兴用Python写了一个Virtual Actor模式的demo, 起了一个名字叫Flash, 是因为速度快如闪电 做framework快, 通过framewo 阅读全文
posted @ 2020-11-30 10:08 egmkang 阅读(341) 评论(0) 推荐(0) 编辑
摘要:若干年前写了一篇<<浦发银行的价值投资>>, 中心思想实际上非常简单, 就是假设ROE不变, 然后估算内在价值. 单纯从ROE的角度来看, 估算不是很离谱, 毕竟现在已经快2021年了. 当时的估算用ROE 15%去做预测, ROE虽然是一路向下到2019年12%, 实际上变化不算是非常大. 但是P 阅读全文
posted @ 2020-11-29 18:26 egmkang 阅读(93) 评论(0) 推荐(0) 编辑
摘要:通用的CP系统有etcd和consul, 通用的对立面就是专用系统. 所以在某些场合是有这种需求的. 然而etcd embed的可用性极差, Windows上面跑会出现各种问题, 而且不能定制协议, 你必须得用etcd定义好的协议和客户端来和etcd集群通讯. 所以这时候的选择: 1. 忍着 2. 阅读全文
posted @ 2020-11-28 15:08 egmkang 阅读(385) 评论(2) 推荐(0) 编辑
摘要:Dapr是为云上环境设计的跨语言, 事件驱动, 可以便捷的构建微服务的系统. balabala一堆, 有兴趣的小伙伴可以去了解一下. Dapr提供有状态和无状态的微服务. 大部分人都是做无状态服务(微服务)的, 只是某些领域无状态并不好使, 因为开销实在是太大了; 有状态服务有固定的场景, 就是要求 阅读全文
posted @ 2020-11-05 21:57 egmkang 阅读(937) 评论(0) 推荐(1) 编辑
摘要:优化C#服务器的思路和工具的使用 优化服务器之前, 需要先对问题的规模做合理的预估, 然后对关键的数据做采样, 做对比, 看和自己的预估是否一致, 误差大在什么地方, 是预估的不对, 还是系统实现有问题. 策划对某游戏服务器的要求是3000到5000人在线. 大概的估算 玩了玩游戏, 在前期任务的流 阅读全文
posted @ 2020-09-16 10:28 egmkang 阅读(815) 评论(0) 推荐(7) 编辑
摘要:通过P/Invoke加速C#程序 任何语言都会提供FFI机制(Foreign Function Interface, 叫法不太一样), 大多数的FFI机制是和C API. C#提供了P/Invoke来和操作系统, 第三方扩展进行交互. FFI通常用来和老的代码交互, 例如有大量的遗留代码, 重写成本 阅读全文
posted @ 2020-09-15 10:02 egmkang 阅读(711) 评论(1) 推荐(7) 编辑
摘要:C# Alloc Free编程之实践 上一篇说了Alloc Free编程的基本理论. 这篇文章就说怎么具体做实践. 常识 之所以说是常识, 那是因为我们在学任何一门语言的时候, 都能在各种书上看到各种各样的best practice. 这些内容也确实是最佳实践, 需要去遵守. 但是现实代码里面看到, 阅读全文
posted @ 2020-09-14 09:47 egmkang 阅读(537) 评论(7) 推荐(11) 编辑
摘要:C# Alloc Free编程 首先Alloc Free这个词是我自创的, 来源于Lock Free. Lock Free是说通过原子操作来避免锁的使用, 从而来提高并行程序的性能; 与Lock Free类似, Alloc Free是说通过减少内存分配, 从而提高托管内存语言的性能. 基础理论 对于 阅读全文
posted @ 2020-09-11 12:35 egmkang 阅读(3104) 评论(16) 推荐(19) 编辑
摘要:C#多线程逻辑编程 多线程编程以难著称, 有很多人碰见多线程编程就会畏缩, 不敢前进, 言必称死锁/卡死. 但是合理编程是不会碰到死锁这种问题. 对语言了解 工欲善其事必先利其器, 必须要对语言提供的同步机制和期扩展有所了解. Linux系统(库)提供的同步机制有: 锁 原子操作 条件变量 其中原子 阅读全文
posted @ 2020-09-10 10:08 egmkang 阅读(506) 评论(0) 推荐(2) 编辑
摘要:网络框架的选择 C++语言里面有asio和libuv等网络库, 可以方便的进行各种高效编程. 但是C#里面, 情况不太一样, C#自带的网络API有多种. 例如: Socket TcpStream(同步接口和BeginXXX异步接口) TcpStream Async/Await Pipeline I 阅读全文
posted @ 2020-09-09 11:23 egmkang 阅读(1072) 评论(5) 推荐(5) 编辑
摘要:估计很多人在网上看到各种各样的DeepClone实现, 例如: 1. 通过BinaryFormatter进行二进制序列化 这玩意儿序列化出来的东西还带namespace类型, 尺寸非常大, 调试一下就知道极其不靠谱 有些人又开始动歪脑筋了, 说我搞一个JSON序列化, 或者BSON序列化可不可以 2 阅读全文
posted @ 2020-04-13 23:30 egmkang 阅读(851) 评论(7) 推荐(0) 编辑
摘要:题目很简单, 就是IMessage对象怎么变成Byte[] 答案1: msg.ToByteArray() 这肯定不符合我们的要求 答案2: using var memoryStream = new MemoryStream(); using var codedOutputStream = new C 阅读全文
posted @ 2020-04-04 23:43 egmkang 阅读(818) 评论(0) 推荐(2) 编辑
摘要:闲话少说直接说步骤: 1. 羊毛 https://www.namebase.io/airdrop 要求条件: 1) 要有github账号 2) 2019年2月之前有16+个follower 3) 要有当时的私钥 2. 先去namebase.io注册账号 注册账号有一步是需要身份证或者护照的, 我用了 阅读全文
posted @ 2020-02-23 12:03 egmkang 阅读(2503) 评论(1) 推荐(0) 编辑
摘要:长链接发送request/response时, 绝大部分包都是小包, 而每个小包都要消耗一个IP包, 成本大约是20-30us, 普通千兆网卡的pps大约是60Wpps, 所以想要提高长链接密集IO的应用性能, 需要做包的合并, 也称为了scatter/gather io或者vector io. 在 阅读全文
posted @ 2020-02-12 15:52 egmkang 阅读(1448) 评论(0) 推荐(3) 编辑
摘要:网上的教程大都是手动通过protoc编译, 比较难用 给当前工程添加"Google.Protobuf"和"Grpc.Tools"的引用(通过nuget), 然后添加proto文件, 编辑.csproj文件 <Project Sdk="Microsoft.NET.Sdk"> <PropertyGrou 阅读全文
posted @ 2020-02-04 01:35 egmkang 阅读(682) 评论(0) 推荐(1) 编辑
摘要:服务器内经常会有一些多读少写的场景, 具体问题需要分析一下, 如果是这种场景, 这边提供一个思路来降低多线程程序锁的冲突, 进而极大的提升程序的性能. 例如一个Dictionary<String, String> A, 需要多读少写, 不会很频繁的写, 而且不会修改Value值, 那么可以构造一个A 阅读全文
posted @ 2020-01-28 16:39 egmkang 阅读(415) 评论(0) 推荐(0) 编辑
摘要:Linux下有vsyscall来优化一些例如time(NULL), gettimeofday这种调用的消耗; 但是Windows下, 没有类似的东西, 但是思路还是有的 1. 程序启动的时候, 获取一下准确的时间戳 2. 然后每次需要获取时间的时候, 获取一下流逝的时间, 可以通过获取CPU的tic 阅读全文
posted @ 2020-01-28 16:26 egmkang 阅读(416) 评论(0) 推荐(0) 编辑
摘要:创建一个bat脚本, 里面写上: reg delete HKEY_CURRENT_USER\Software\JetBrains\dotMemory /freg delete HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Ex 阅读全文
posted @ 2020-01-28 16:18 egmkang 阅读(586) 评论(0) 推荐(0) 编辑