- 论坛徽章:
- 9
|
本帖最后由 wlmqgzm 于 2017-06-12 01:34 编辑
这几天在测试windows版本, 为了优化性能, 将windows版本的tcmalloc也链接进来, 发现windows下性能反而下降了, 原因不明. 测试是在一台古老的双核机器上, 或者是核心比较少的情况下, tcmalloc并没有优势的原因.
在windows下使用 tcmalloc 库, 需要注意的要点是:
1)用microsoft vs2015编译 tcmalloc , 默认的是win32模式, 这样编译出来的是32位的链接库dll和lib, 需要自己定义 X64模式, 选择拷贝win32的其他设置, 执行重新生成, 才能编译出64位的链接库dll和lib.
尝试链接的时候, 发现链接格式 不正确的提示, 回过头来检查, 发现是X64/win32 的原因.
2)使用步骤1)的 tcmalloc 库, 我这边是在另外一台机器上, 安装的是windows 下的mingw/gcc, 需要注意的是: 除了要添加上步骤1)编译的链接库外, 需要 指定gcc 链接参数 -u __tcmalloc, 否则, 根本就不会链接上 tcmalloc 库. 这个参数是翻了无数gcc的资料, 一直没有任何资料说明, 试验了多种办法, 最终连猜带蒙弄出来的.
在windwos下折腾使用 jemalloc 库, 编译链接成功, 使用的是静态链接的方式, 然而编译期间告警很多, 都是一堆的重复定义之类的, 运行时出现了 crash 问题, 折腾很久未找到解决办法, 暂时先放弃掉.
抽空学习了operator new/delete 的一些用法, 以及new 的 enplace 模式, 一直在想有没有合适的渠道, 可以用来进一步优化性能.
然后将 boost pool 封装了一下, 实现了 thread_local_memory 的封装, 尝试准备多线程并发, 然而, 单独一测试boost pool, 发现boost pool的性能实在是太烂, 烂泥扶不上墙, 算了吧.
除非自己从头弄一套, 唉.
另外 operator new/delete 本身是static的, 想实现的一些用法, 还各种受限, 尝试了一阵子, 放弃了, 总之, 要简单的实现高效率的内存管理不容易.
测试中还发现一个问题, 就是new/delete 的开销远远大于malloc/free 的开销, 在上面的例子中,相差数千倍, 即使是一个最简单的struct,
这两天就会提交一个windows的服务 版本, 不过性能比linux慢很多, 按说网络库底层是boost asio 的, 应该没有这么太大差距, 都是一个库.
windows安装程序是用 inno setup实现的, 里面注册服务 是用sc.exe 来实现的, 路径是利用 expand..({app})来获得的, 总之, 测试工程师在开发安装程序这块, 这两个问题一致搞不定, 我找了一些资料, 最终把这2个功能点实现了. |
|