摘要:
服务器经常会用到压缩,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 阅读全文
摘要:
立志要把D&E看两三遍,所以这边列一个读书笔记,觉得什么有必要就记下来.1. 内联 在带类的C里面,在类声明里面实现的成员函数,可以被内联.class stack{ //会被内联 char pop() { if(top <= min) error("stack underflow"); return *--top; }}; 在C++里面,提供的inline关键字,也可以用来内联. 另外,static修饰的非成员函数,有internal连接属性,也是可能会被内联掉.2. 窄转换 早期想法不允许"破坏信息的"隐式转换.可是后来发现每个C程序内都 阅读全文
摘要:
以前都写年制,说了这一年做了啥.其实这一年做了啥不是很要紧,关键是,未来一年要做啥.所以搞个TODO:1. 看书 D&E, GSM, Haskell 如果有精力在看看操作系统方面的2. 网络程序库继续完善3. 股票翻红 阅读全文
摘要:
生产者消费者问题,是永远的经典. 单纯让多个线程去竞争,占有资源然后处理,会让系统的复杂度变得相当复杂,并且整个系统的并发也很难控制.为了让系统简单化,流畅化,引入消息队列,而且这样,系统更具有相当高的吞吐量.因为做的事情简单而有效. 根据具体业务的不同,个人(认为)把消息队列分为1:1模型,还有就是N:M模型的. 如果消费者的消费能力非常高.个人认为就应该使用1:1的队列.这种队列足够简单,可以进行各种优化,比如避免动态内存分配,锁优化,使用lock-free等.这样可以让主循环的等待时间降到最低,使其可以专心致志进行各种逻辑处理. 有时,有些业务逻辑,不是很在乎时许,允许比较小... 阅读全文
摘要:
我实现的网络库中使用了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 阅读全文
摘要:
llvm带来很多很多好用的东西,比如clang,还有一个STL实现:libcxx.其优点不表,就说怎么打印STL容器内的元素吧. 实际上gdb,包括任何调试工具,都是不了解STL的,因为他不知道STL内部是怎么实现的.所以需要展示STL内部元素的时候,就需要用到一些脚本,或者插件之类的(VS也是这样).gdb在7.x支持python写插件,所以很多人都用python插件来打印libstdc++容器内的元素. llvm官方本身没有实现pretty printers,包括lldb这个项目也一样(只是实现了部分容器的parser). 本来还想讲讲怎么实现一个容器的parser,不过想想其实... 阅读全文
摘要:
C++11带来诸多特性,random就是其一.1. random_device 标准库提供了一个非确定性随机数生成设备.在Linux的实现中,是读取/dev/urandom设备;Windows的实现居然是用rand_s,在这里强烈谴责一下. random_device提供()操作符,用来返回一个min()到max()之间的一个数字.如果是Linux(Unix Like或者Unix)下,都可以使用这个来产生高质量的随机数,可以理解为真随机数.#include <iostream>#include <random>int main(){ std::random_device 阅读全文
摘要:
gcc 4.6的mutex/thread实现可能有一点问题,导致在用mutex/thread之类的时候,会出现chrono编译出现错误,不能提示.研究了一下,clang 3.1支持libc++的mutex/thread,果断把STL的实现切换到libc++.安装比较容易,编译完成之后,把libc++.so.xxx拷贝到/usr/lib下面,然后创建软连接;再把libc++的头文件拷贝到/usr/include/c++/v1下.编译的时候只需要加上参数-stdlib=libc++,如果要用mutex/thread这些C++11内容,还要加上参数-std=c++11.可是clang complet 阅读全文
摘要:
题目不知道怎么取才好,但是意思很简单:如果你暴露一个复杂对象给Lua,实现类似于OO编程的话,那么也要把析构函数暴露给Lua.否则的话,lua gc的时候,回收垃圾对象,没有找到回收函数,就直接free掉了,这在C++中,是相当致命的.tolua++中的tolua_cclass函数,用来注册lua对象,TOLUA_API void tolua_cclass (lua_State* L, const char* lname, const char* name, const char* base, lua_CFunction col)同时会把最后的那个参数col,注册到lua对象的元表里面:sta 阅读全文
摘要:
服务器代码依赖了boost的function和bind,用来做回调,异步调用时会出现这种down机.闲话少说上代码:void fn(std::string str);char *temp_str = new char[24];strcpy(temp_str,"1212");boost::function f = boost::bind(fn,temp_str);f();这边的f函数对象里面保存了一个temp_str的指针,如果是同步调用,会有临时的std::string变量产生,产生拷贝一次temp_str,之后就不在引用temp_str,所以不会出现任何问题;可是如果是异 阅读全文
摘要:
我们服务器一直在用boost/sgl stl的hash table,但是从来没有考虑过其中的效率问题,虽然hash_map/unordered_map跑的可能真的比map快一些,可能应该不是你理解的那么快.其实他可以更快一些!!! 当我自己尝试着实现了一个hash table之后,我发现确实如此.这篇文章也是来说说,如何实现较快的一个. 通常的hash table都是用开链法,开放地址法来解决冲突.开链法是总容易实现的一个,而且因为效率稳定,被加入了C++11,取名unordered_map.不过效率实在不咋地. 开放地址法的hash table,我是从google-sparseha... 阅读全文
摘要:
2011年都干了些啥....读书:1. 聪明的投资者2. 超级数字天才3. 西游记4. 程序开发心理学5. Unix网络编程6. Unix环境高级编程...或者还有其他的,暂时不记得了技术???....好像没干啥,就天天写代码....搞搞C++,Valgrind,Lua,宕机等等2012年,希望自己可以认真的去写写网络程序,虽然号称是写服务器的,但是从来没写过网络程序;希望可以认真的去看看几个开源的代码,研究一下;over 阅读全文
摘要:
大学还没毕业,买了一些建行,一些交行..... 虽然现在还认为那些股票不错,不过终究发生过换股,全换成浦发,古井贡酒,还有鲁泰,出现了一些亏损,记录如下: 其中塔牌,华兰生物是做短线亏损,其他几个本来打算做长线,后来发现收益较好的品种,换股.... 股票名称 交易亏损(RMB) 农业银行 165.95 交通银行 1675.99 建设银行 288.00 三一重工 290.66 苏宁电器 677.41 塔牌集团 281.30 华兰生物 65.72 一共亏损:3445.82. 谨记. 阅读全文
摘要:
相信很多人碰到过一个问题,就是代码太多了,不知道在哪里把这个对象给修改掉了.这个其实有两种办法的.1. 在调试的时候,可以下数据断点. gdb有watch断点.比如gdb>watch *(int*)0x12433,要记住,如果想要一只监视这个数据,就要用地址,否则过了这个scope,数据断点就无效了,还有就是,监视的值如果用内置数据类型可以表达的话,是有硬件断点的,否则效率茫茫低.....2. 运行的时候,本文主要讲这个. 先来回顾一下,我们都知道一个exec,都有好几个段,比如代码段,数据段等.这些段是有读写属性的,例如代码段只可以读,栈段是可以读写~~.那么我们就想把一个对象塞到一个 阅读全文
摘要:
相信一些朋友也碰见过这样的面试题目,本文尝试着给出解答.1. 分配对象在堆上 那么,必然要禁止对象在栈上面分配.一个很简单的办法,就是构造函数私有化(提供额外的接口生成对象),那么在栈上面就不可以分配.可是我们还需要这个对象要被析构,那么可以提供一个接口,显式的释放掉这个接口,也就是说delete也得给他禁掉~~~ 考虑另外一个问题,C++有placement new,我自己new一块内存,然后在你这上面构造.问题就变得很恶心,看来我们只有把new,delete都给他禁掉... 好了,我们现在知道该怎么做:createInstance()接口产生对象dispose()接口销毁对象new/... 阅读全文
摘要:
网友问了一个问题,说对象A在内部可以修改HP.外部对象只能访问对象A的HP,不能修改.这东西其实可以用__index和__newindex来实现.__index指向对象A,这样就可以访问;__newindex重写,修改hp的话,就禁止.就可以完成他的需求.下面给出简单的代码:function cannotModifyHp(object) local proxy = {} local mt = { __index = object, __newindex = function(t,k,v) if k ~= "hp" then object[k] = v en... 阅读全文
摘要:
很大程度上,野指针都是因为编码不善,习惯不好所产生的.要解决野指针,就要养成好习惯,不要动不动就public数据成员,所有的数据访问都抽象成接口,最好只在一个地方delete数据.前段时间游戏技术测试,down机无限,搞的很头疼.后来用valgrind的memcheck工具,找到很多野指针.valgrind很好用,除了有一点慢:-)valgrind --tool=memcheck --leak-check=full --log-file=./log_file.log --showpossibly-lost=no --malloc-fill=0xff --free-fill=0x11 ./exe 阅读全文
摘要:
CPI那么高,为了抗通胀,我买了股票,号称是价值投资:-),可是一直没有算过具体能有多少收益.... 今天算了一下浦发银行的收益,不算不知道,一算吓一跳啊. 去年年报每股净资产8.57RMB,今年由于分割了股票,所以每股净资产大约是(8.99+0.42)/1.3 = 7.2RMB,作为起始每股净资产 阅读全文
摘要:
set nocompatibleset backspace=indent,eol,startset nobackupset history=50set rulerset showcmdset showmatchset hlsearchset incsearchset ignorecasesyntax onfiletype plugin indent onautocmd FileType text setlocalset autoindentset cindentset numberset expandtabset tabstop=4set shiftwidth=4set nowrapset l 阅读全文
摘要:
1. 一个程序员用在写程序上的时间大概占他的工作时间的10-20%,大部分的程序员每天大约能写出10-12行的能进入最终的产品的代码 — —不管他的技术水平有多高。 好的程序员花去90%的时间在思考、研究和实验,来找出最优方案。差的程序员花去90%的时间在调试问题程序、盲目的修改程序,期望某种写法能可行。“一个卓越的车床工可以要求比一个一般的车床工多拿数倍高的工资,但一个卓越的软件写手的价值会10000倍于一个普通的写手。”——比尔 盖茨 2. 一个优秀的程序员的效率会是一个普通的程序员的十倍之上。一个伟大的程序员的效率会是一个普通程序员的20-100倍。这不是夸张 — — 1960年以来的. 阅读全文