摘要:在C++里面, 我们可以根据一个消息的名称, 动态的创建一个实例 这个在protobuf里面是集成进去了, 在其他语言也有类似的东西. 通过这个, 我们就让轻松实现编解码库, 而不需去构造一个映射表. 但是, 但是在rust里面, 是没有这种东西的. 比较难的地方是rust全局变量必须要实现Send 阅读全文
posted @ 2019-09-07 17:22 egmkang 阅读 (17) 评论 (0) 编辑
摘要:又拾起了rust语言, 想写一点东西玩一玩, 但是发现连一个获取本机IP地址的库都没有, 还得挽起袖子自己撸. https://crates.io/crates/local_ipaddress 没有用ifconfig, 也没有扫描网卡, 就开了一个UdpSocket尝试着去连一个IP地址, 然后看本 阅读全文
posted @ 2019-09-03 01:13 egmkang 阅读 (13) 评论 (0) 编辑
摘要:先编辑/etc/resolv.conf, 添加一个DNS, 比如114.114.114.114 然后sudo apt-get install resolvconf 然后编辑/etc/resolvconf/resolv.conf.d/original, 添加DNS设置, /etc/resolv.con 阅读全文
posted @ 2018-01-13 22:16 egmkang 阅读 (1983) 评论 (0) 编辑
摘要:看了一圈, 没看到稍微好用的ConnectionPool, 除了一个aiomysql, 但是这个是异步的, 我暂时没有用到这么高版本的Python, 所以就动手造一个轮子. 原理比较简单, 先造一个线程安全的集合, 无非就是Lock+Set, 然后修改PyMySQL的close方法, 把实例对象和我 阅读全文
posted @ 2017-10-01 12:16 egmkang 阅读 (1151) 评论 (0) 编辑
摘要:先吐槽一下libmysqlclientAPI的设计, 多个线程同时去connect居然会core掉. 后来Google了一番, 才发现mysql_real_connect不是线程安全的, 需要一些额外的处理. 具体就是: 首先调用一次mysql_library_init, 在整个程序生命周期中只需要 阅读全文
posted @ 2017-08-29 18:04 egmkang 阅读 (245) 评论 (0) 编辑
摘要:前两天给我们的json写一个解析函数, 之前用的正宗的json parser, 支持完整的json特性. 但是实际上我们用到特性, 只有key-value的映射, value的类型只有数字和字符串两种类型. 由于parse的速度比较慢, 所以我打算自己用字符串解析一遍. 第一个能工作的原型出来的时候 阅读全文
posted @ 2017-08-29 18:03 egmkang 阅读 (331) 评论 (0) 编辑
摘要:还是上次那个json解析程序的优化, 虽然速度已经比较理想, 但是看到IndexOf占到整个解析时长的20%+, 心里还是不爽. 我写的IndexOf是按照UTF16字符, 一个字符一个字符去比较的, 所以当时能想到的办法, 就是一次比较多个字符. 大概是五六年前, 我看过某一个libc里面实现的s 阅读全文
posted @ 2017-08-29 18:02 egmkang 阅读 (175) 评论 (0) 编辑
摘要:这两天在看C# SIMD相关的东西, 在爆栈上面搜到一段代码, 表示很震惊, 还是得贴出来… 这段代码里面的sseAssemblyBytes, 实际上是一段汇编代码, 他先把这段汇编代码拷贝到虚拟内存里面去, 然后设置这块内存可以被执行EXECUTE_READWRITE, 从而在这块内存上创建一个函 阅读全文
posted @ 2017-08-29 18:01 egmkang 阅读 (236) 评论 (0) 编辑
摘要:上古时期的程序员, 肯定都知道Handle对象, 一般中文翻译成句柄. 一般的Handle在实现上, 都是一个整数, 而这个整数可以理解为一个指针, 指针指向的地址呢, 又保存了另外一个指针. 之所以这么搞, 是因为这样搞可以让真实的对象可以挪动. 考虑一个一个对象A, 保存在Handle里面, 由 阅读全文
posted @ 2017-08-29 18:01 egmkang 阅读 (415) 评论 (0) 编辑
摘要:一个client发送消息给orleans, 就只需要掉用Grain的函数就行了. 但是有时候Grain需要发送消息给client, 在orleans里面, 就只能通过Observer来实现. 有了上面的代码, 我们就可以按照自己的需求造一个广播出来. 发送消息给Client上所有的人 发送消息给Cl 阅读全文
posted @ 2017-08-29 18:00 egmkang 阅读 (361) 评论 (0) 编辑
摘要:就上面这方法, 居然比new object慢了几十倍(在x86和x64上面表现不一), 我当时就惊呆了, 后来研究一番才发现, new T()被翻译成System.Activator.CreateInstance(), 真的是日了狗了. 把代码改成 然后只比new object慢了四五倍… 阅读全文
posted @ 2017-08-29 17:58 egmkang 阅读 (205) 评论 (0) 编辑
摘要:这两天在玩Consul, 他的.Net驱动使用了HttpClient来发送Http请求. 但是我的电脑上装有SS, 所以请求会被SS过滤一次, 然后导致请求的延迟一直比较高. 然后只需要改写一下HttpClient的Proxy规则, 就可以让他不要用系统的代理, 请求的速度也会加快不少 阅读全文
posted @ 2017-08-29 17:57 egmkang 阅读 (279) 评论 (0) 编辑
摘要:游戏服务器里面总是有一大堆的配置文件需要读取, 而且这些配置文件的读取: * 要不然做成弱类型的, 就是一堆字符串或者数字, 不能看出来错误(需要重新检测一次) * 要不然做成强类型的, 每种类型都需要自己Parse一下 我个人比较喜欢后者, 因为前者LoadConfig的代码简单, 但是写逻辑的时 阅读全文
posted @ 2017-08-29 17:56 egmkang 阅读 (1145) 评论 (0) 编辑
摘要:我们服务器内用leveldb存一些不是很重要的, 但是又需要(半)持久化的东西. 可是自从2016到现在, 碰见好几次不同类型的死锁. 直到今天, 才发现真正的原因, 那就是leveldb不支持fork. 所以在你使用leveldb的时候, 一定需要注意初始化顺序: fork init leveld 阅读全文
posted @ 2017-08-29 17:54 egmkang 阅读 (105) 评论 (0) 编辑
摘要:游戏里面经常有转盘活动, 为了让转盘表现自然一点, 就需要自己模拟阻尼运动, 分为三个过程: 匀加速运动, 匀速运动, 匀减速运动 设定最高速度为MaxSpeed, SpeedUp1(匀加速运动的加速度), SpeedUp2(匀减速运动的加速度), Expect(期望停留的弧度点) 其实模拟只需要把 阅读全文
posted @ 2017-08-29 17:49 egmkang 阅读 (509) 评论 (0) 编辑
摘要:经常会用到C的格式化字符串,gcc/clang的扩展,都是可以进行字符串和可变参数的检测,不匹配,就会爆warning.自己手写的,需要加上一点代码,否则不会进行检测.1. 可变参数void my_printf(const char* format, ...) __attribute__ ((format (printf, 1, 2)))这里的1, 表示format string所在参数的下标(从1开始);2表示可变参数开始的下标.2. va_listvoid my_print(const char* format, va_list args) __attribute__ ((format ( 阅读全文
posted @ 2013-09-05 11:14 egmkang 阅读 (726) 评论 (0) 编辑
摘要:今天微博上有人发一个帖子,可以用js来函数式编程. 比如:function f(x, y, z) { return x + y + z;}var f1 = f.bind(null, 1);f1(2,3) === 6; 看完之后,我表我们lua也能实现这样的效果. function bind(f,...) local args={...} return function(...) local local_arg={...} local arg = {} for _,v in pairs(args) do table.insert(ar... 阅读全文
posted @ 2013-05-20 16:37 egmkang 阅读 (1535) 评论 (2) 编辑
摘要:公司一哥们说make_shared构造shared_ptr比new要慢,我表示怀疑.因为make_shared只分配一次内存,而new需要分配两次.所以写一个demo测试一下.分别测试开启优化,关闭优化,还有就是C++11开启move之后的性能情况.#include <string>#ifdef __GXX_EXPERIMENTAL_CXX0X__#include <memory>using namespace std;#else#include <boost/shared_ptr.hpp>#include <boost/make_shared.hpp 阅读全文
posted @ 2013-04-28 13:36 egmkang 阅读 (35992) 评论 (11) 编辑
摘要:服务器经常会用到压缩,zlib是默认选择,虽然还有很多其他的快速压缩算法,比如snappy和lz4.可是zlib拥有最广泛的支持和良好的压缩率,就是速度太不理想了.intel有一个高性能库ppl,期中包含zlib的优化.使用方式比较简单,就是链接一下就OK,性能大约可以提升30%左右.我把ppl装到/usr/local/ppl下面,所以有可能会需要添加include路径,看你需要初始化CPU么.include目录/usr/local/ipp/ipp/include然后是静态库/动态库目录:/usr/local/ipp/composer_xe_2013.1.117/ipp/lib/intel64 阅读全文
posted @ 2013-01-31 10:37 egmkang 阅读 (1644) 评论 (0) 编辑
摘要:立志要把D&E看两三遍,所以这边列一个读书笔记,觉得什么有必要就记下来.1. 内联 在带类的C里面,在类声明里面实现的成员函数,可以被内联.class stack{ //会被内联 char pop() { if(top <= min) error("stack underflow"); return *--top; }}; 在C++里面,提供的inline关键字,也可以用来内联. 另外,static修饰的非成员函数,有internal连接属性,也是可能会被内联掉.2. 窄转换 早期想法不允许"破坏信息的"隐式转换.可是后来发现每个C程序内都 阅读全文
posted @ 2013-01-25 01:11 egmkang 阅读 (650) 评论 (0) 编辑