baidu
摘要: Linux下有vsyscall来优化一些例如time(NULL), gettimeofday这种调用的消耗; 但是Windows下, 没有类似的东西, 但是思路还是有的 1. 程序启动的时候, 获取一下准确的时间戳 2. 然后每次需要获取时间的时候, 获取一下流逝的时间, 可以通过获取CPU的tic 阅读全文
posted @ 2020-01-28 16:26 egmkang 阅读(508) 评论(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 阅读(831) 评论(1) 推荐(0) 编辑
摘要: 在C++里面, 我们可以根据一个消息的名称, 动态的创建一个实例 这个在protobuf里面是集成进去了, 在其他语言也有类似的东西. 通过这个, 我们就让轻松实现编解码库, 而不需去构造一个映射表. 但是, 但是在rust里面, 是没有这种东西的. 比较难的地方是rust全局变量必须要实现Send 阅读全文
posted @ 2019-09-07 17:22 egmkang 阅读(1428) 评论(0) 推荐(0) 编辑
摘要: 又拾起了rust语言, 想写一点东西玩一玩, 但是发现连一个获取本机IP地址的库都没有, 还得挽起袖子自己撸. https://crates.io/crates/local_ipaddress 没有用ifconfig, 也没有扫描网卡, 就开了一个UdpSocket尝试着去连一个IP地址, 然后看本 阅读全文
posted @ 2019-09-03 01:13 egmkang 阅读(3472) 评论(3) 推荐(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 阅读(4220) 评论(0) 推荐(0) 编辑
摘要: 看了一圈, 没看到稍微好用的ConnectionPool, 除了一个aiomysql, 但是这个是异步的, 我暂时没有用到这么高版本的Python, 所以就动手造一个轮子. 原理比较简单, 先造一个线程安全的集合, 无非就是Lock+Set, 然后修改PyMySQL的close方法, 把实例对象和我 阅读全文
posted @ 2017-10-01 12:16 egmkang 阅读(1765) 评论(0) 推荐(0) 编辑
摘要: 先吐槽一下libmysqlclientAPI的设计, 多个线程同时去connect居然会core掉. 后来Google了一番, 才发现mysql_real_connect不是线程安全的, 需要一些额外的处理. 具体就是: 首先调用一次mysql_library_init, 在整个程序生命周期中只需要 阅读全文
posted @ 2017-08-29 18:04 egmkang 阅读(819) 评论(0) 推荐(1) 编辑
摘要: 前两天给我们的json写一个解析函数, 之前用的正宗的json parser, 支持完整的json特性. 但是实际上我们用到特性, 只有key-value的映射, value的类型只有数字和字符串两种类型. 由于parse的速度比较慢, 所以我打算自己用字符串解析一遍. 第一个能工作的原型出来的时候 阅读全文
posted @ 2017-08-29 18:03 egmkang 阅读(1702) 评论(0) 推荐(1) 编辑
摘要: 还是上次那个json解析程序的优化, 虽然速度已经比较理想, 但是看到IndexOf占到整个解析时长的20%+, 心里还是不爽. 我写的IndexOf是按照UTF16字符, 一个字符一个字符去比较的, 所以当时能想到的办法, 就是一次比较多个字符. 大概是五六年前, 我看过某一个libc里面实现的s 阅读全文
posted @ 2017-08-29 18:02 egmkang 阅读(545) 评论(0) 推荐(0) 编辑
摘要: 这两天在看C# SIMD相关的东西, 在爆栈上面搜到一段代码, 表示很震惊, 还是得贴出来… 这段代码里面的sseAssemblyBytes, 实际上是一段汇编代码, 他先把这段汇编代码拷贝到虚拟内存里面去, 然后设置这块内存可以被执行EXECUTE_READWRITE, 从而在这块内存上创建一个函 阅读全文
posted @ 2017-08-29 18:01 egmkang 阅读(672) 评论(0) 推荐(3) 编辑
摘要: 上古时期的程序员, 肯定都知道Handle对象, 一般中文翻译成句柄. 一般的Handle在实现上, 都是一个整数, 而这个整数可以理解为一个指针, 指针指向的地址呢, 又保存了另外一个指针. 之所以这么搞, 是因为这样搞可以让真实的对象可以挪动. 考虑一个一个对象A, 保存在Handle里面, 由 阅读全文
posted @ 2017-08-29 18:01 egmkang 阅读(1277) 评论(0) 推荐(0) 编辑
摘要: 一个client发送消息给orleans, 就只需要掉用Grain的函数就行了. 但是有时候Grain需要发送消息给client, 在orleans里面, 就只能通过Observer来实现. 有了上面的代码, 我们就可以按照自己的需求造一个广播出来. 发送消息给Client上所有的人 发送消息给Cl 阅读全文
posted @ 2017-08-29 18:00 egmkang 阅读(942) 评论(0) 推荐(0) 编辑
摘要: 就上面这方法, 居然比new object慢了几十倍(在x86和x64上面表现不一), 我当时就惊呆了, 后来研究一番才发现, new T()被翻译成System.Activator.CreateInstance(), 真的是日了狗了. 把代码改成 然后只比new object慢了四五倍… 阅读全文
posted @ 2017-08-29 17:58 egmkang 阅读(936) 评论(0) 推荐(0) 编辑
摘要: 这两天在玩Consul, 他的.Net驱动使用了HttpClient来发送Http请求. 但是我的电脑上装有SS, 所以请求会被SS过滤一次, 然后导致请求的延迟一直比较高. 然后只需要改写一下HttpClient的Proxy规则, 就可以让他不要用系统的代理, 请求的速度也会加快不少 阅读全文
posted @ 2017-08-29 17:57 egmkang 阅读(1843) 评论(0) 推荐(0) 编辑
摘要: 游戏服务器里面总是有一大堆的配置文件需要读取, 而且这些配置文件的读取: * 要不然做成弱类型的, 就是一堆字符串或者数字, 不能看出来错误(需要重新检测一次) * 要不然做成强类型的, 每种类型都需要自己Parse一下 我个人比较喜欢后者, 因为前者LoadConfig的代码简单, 但是写逻辑的时 阅读全文
posted @ 2017-08-29 17:56 egmkang 阅读(2646) 评论(0) 推荐(0) 编辑
摘要: 我们服务器内用leveldb存一些不是很重要的, 但是又需要(半)持久化的东西. 可是自从2016到现在, 碰见好几次不同类型的死锁. 直到今天, 才发现真正的原因, 那就是leveldb不支持fork. 所以在你使用leveldb的时候, 一定需要注意初始化顺序: fork init leveld 阅读全文
posted @ 2017-08-29 17:54 egmkang 阅读(382) 评论(0) 推荐(0) 编辑
摘要: 游戏里面经常有转盘活动, 为了让转盘表现自然一点, 就需要自己模拟阻尼运动, 分为三个过程: 匀加速运动, 匀速运动, 匀减速运动 设定最高速度为MaxSpeed, SpeedUp1(匀加速运动的加速度), SpeedUp2(匀减速运动的加速度), Expect(期望停留的弧度点) 其实模拟只需要把 阅读全文
posted @ 2017-08-29 17:49 egmkang 阅读(1066) 评论(0) 推荐(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 阅读(1128) 评论(0) 推荐(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 阅读(1762) 评论(2) 推荐(0) 编辑
摘要: 公司一哥们说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 阅读(38730) 评论(11) 推荐(0) 编辑