摘要: 看了一圈, 没看到稍微好用的ConnectionPool, 除了一个aiomysql, 但是这个是异步的, 我暂时没有用到这么高版本的Python, 所以就动手造一个轮子. 原理比较简单, 先造一个线程安全的集合, 无非就是Lock+Set, 然后修改PyMySQL的close方法, 把实例对象和我阅读全文
posted @ 2017-10-01 12:16 egmkang 阅读(66) 评论(0) 编辑
摘要: 先吐槽一下libmysqlclientAPI的设计, 多个线程同时去connect居然会core掉. 后来Google了一番, 才发现mysql_real_connect不是线程安全的, 需要一些额外的处理. 具体就是: 首先调用一次mysql_library_init, 在整个程序生命周期中只需要阅读全文
posted @ 2017-08-29 18:04 egmkang 阅读(27) 评论(0) 编辑
摘要: 前两天给我们的json写一个解析函数, 之前用的正宗的json parser, 支持完整的json特性. 但是实际上我们用到特性, 只有key-value的映射, value的类型只有数字和字符串两种类型. 由于parse的速度比较慢, 所以我打算自己用字符串解析一遍. 第一个能工作的原型出来的时候阅读全文
posted @ 2017-08-29 18:03 egmkang 阅读(24) 评论(0) 编辑
摘要: 还是上次那个json解析程序的优化, 虽然速度已经比较理想, 但是看到IndexOf占到整个解析时长的20%+, 心里还是不爽. 我写的IndexOf是按照UTF16字符, 一个字符一个字符去比较的, 所以当时能想到的办法, 就是一次比较多个字符. 大概是五六年前, 我看过某一个libc里面实现的s阅读全文
posted @ 2017-08-29 18:02 egmkang 阅读(41) 评论(0) 编辑
摘要: 这两天在看C# SIMD相关的东西, 在爆栈上面搜到一段代码, 表示很震惊, 还是得贴出来… 这段代码里面的sseAssemblyBytes, 实际上是一段汇编代码, 他先把这段汇编代码拷贝到虚拟内存里面去, 然后设置这块内存可以被执行EXECUTE_READWRITE, 从而在这块内存上创建一个函阅读全文
posted @ 2017-08-29 18:01 egmkang 阅读(15) 评论(0) 编辑
摘要: 上古时期的程序员, 肯定都知道Handle对象, 一般中文翻译成句柄. 一般的Handle在实现上, 都是一个整数, 而这个整数可以理解为一个指针, 指针指向的地址呢, 又保存了另外一个指针. 之所以这么搞, 是因为这样搞可以让真实的对象可以挪动. 考虑一个一个对象A, 保存在Handle里面, 由阅读全文
posted @ 2017-08-29 18:01 egmkang 阅读(20) 评论(0) 编辑
摘要: 一个client发送消息给orleans, 就只需要掉用Grain的函数就行了. 但是有时候Grain需要发送消息给client, 在orleans里面, 就只能通过Observer来实现. 有了上面的代码, 我们就可以按照自己的需求造一个广播出来. 发送消息给Client上所有的人 发送消息给Cl阅读全文
posted @ 2017-08-29 18:00 egmkang 阅读(64) 评论(0) 编辑
摘要: 就上面这方法, 居然比new object慢了几十倍(在x86和x64上面表现不一), 我当时就惊呆了, 后来研究一番才发现, new T()被翻译成System.Activator.CreateInstance(), 真的是日了狗了. 把代码改成 然后只比new object慢了四五倍…阅读全文
posted @ 2017-08-29 17:58 egmkang 阅读(19) 评论(0) 编辑
摘要: 这两天在玩Consul, 他的.Net驱动使用了HttpClient来发送Http请求. 但是我的电脑上装有SS, 所以请求会被SS过滤一次, 然后导致请求的延迟一直比较高. 然后只需要改写一下HttpClient的Proxy规则, 就可以让他不要用系统的代理, 请求的速度也会加快不少阅读全文
posted @ 2017-08-29 17:57 egmkang 阅读(15) 评论(0) 编辑
摘要: 游戏服务器里面总是有一大堆的配置文件需要读取, 而且这些配置文件的读取: * 要不然做成弱类型的, 就是一堆字符串或者数字, 不能看出来错误(需要重新检测一次) * 要不然做成强类型的, 每种类型都需要自己Parse一下 我个人比较喜欢后者, 因为前者LoadConfig的代码简单, 但是写逻辑的时阅读全文
posted @ 2017-08-29 17:56 egmkang 阅读(152) 评论(0) 编辑
摘要: 我们服务器内用leveldb存一些不是很重要的, 但是又需要(半)持久化的东西. 可是自从2016到现在, 碰见好几次不同类型的死锁. 直到今天, 才发现真正的原因, 那就是leveldb不支持fork. 所以在你使用leveldb的时候, 一定需要注意初始化顺序: fork init leveld阅读全文
posted @ 2017-08-29 17:54 egmkang 阅读(28) 评论(0) 编辑
摘要: 游戏里面经常有转盘活动, 为了让转盘表现自然一点, 就需要自己模拟阻尼运动, 分为三个过程: 匀加速运动, 匀速运动, 匀减速运动 设定最高速度为MaxSpeed, SpeedUp1(匀加速运动的加速度), SpeedUp2(匀减速运动的加速度), Expect(期望停留的弧度点) 其实模拟只需要把阅读全文
posted @ 2017-08-29 17:49 egmkang 阅读(185) 评论(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 阅读(587) 评论(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 阅读(1347) 评论(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 阅读(30008) 评论(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 阅读(1316) 评论(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 阅读(565) 评论(0) 编辑
摘要: 以前都写年制,说了这一年做了啥.其实这一年做了啥不是很要紧,关键是,未来一年要做啥.所以搞个TODO:1. 看书 D&E, GSM, Haskell 如果有精力在看看操作系统方面的2. 网络程序库继续完善3. 股票翻红阅读全文
posted @ 2013-01-25 01:02 egmkang 阅读(713) 评论(3) 编辑
摘要: 生产者消费者问题,是永远的经典. 单纯让多个线程去竞争,占有资源然后处理,会让系统的复杂度变得相当复杂,并且整个系统的并发也很难控制.为了让系统简单化,流畅化,引入消息队列,而且这样,系统更具有相当高的吞吐量.因为做的事情简单而有效. 根据具体业务的不同,个人(认为)把消息队列分为1:1模型,还有就是N:M模型的. 如果消费者的消费能力非常高.个人认为就应该使用1:1的队列.这种队列足够简单,可以进行各种优化,比如避免动态内存分配,锁优化,使用lock-free等.这样可以让主循环的等待时间降到最低,使其可以专心致志进行各种逻辑处理. 有时,有些业务逻辑,不是很在乎时许,允许比较小...阅读全文
posted @ 2012-11-17 21:23 egmkang 阅读(8428) 评论(16) 编辑
摘要: 我实现的网络库中使用了C++11中的shared_ptr. 昨天做profile,发现很多CPU都消耗在shared_ptr上,所以打算看看shared_ptr的效率如何. 实验是这样的,弄一个临时的shared_ptr,然后不停的拷贝,拷贝100W次,看消耗多长时间.实验对象是gcc 4.6.2和clang 3.1(libc++).最后输出各自消耗的时间,编译选项,O0和O2. 上代码:#include <thread>#include <memory>#include <unistd.h>#include <iostream>#include阅读全文
posted @ 2012-11-06 20:55 egmkang 阅读(7860) 评论(5) 编辑