共 5 页: 上一页 1 2 3 4 5 下一页
摘要:以前都写年制,说了这一年做了啥.其实这一年做了啥不是很要紧,关键是,未来一年要做啥.所以搞个TODO:1. 看书 D&E, GSM, Haskell 如果有精力在看看操作系统方面的2. 网络程序库继续完善3. 股票翻红 阅读全文
posted @ 2013-01-25 01:02 egmkang 阅读 (775) 评论 (3) 编辑
摘要:生产者消费者问题,是永远的经典. 单纯让多个线程去竞争,占有资源然后处理,会让系统的复杂度变得相当复杂,并且整个系统的并发也很难控制.为了让系统简单化,流畅化,引入消息队列,而且这样,系统更具有相当高的吞吐量.因为做的事情简单而有效. 根据具体业务的不同,个人(认为)把消息队列分为1:1模型,还有就是N:M模型的. 如果消费者的消费能力非常高.个人认为就应该使用1:1的队列.这种队列足够简单,可以进行各种优化,比如避免动态内存分配,锁优化,使用lock-free等.这样可以让主循环的等待时间降到最低,使其可以专心致志进行各种逻辑处理. 有时,有些业务逻辑,不是很在乎时许,允许比较小... 阅读全文
posted @ 2012-11-17 21:23 egmkang 阅读 (10466) 评论 (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 阅读 (8698) 评论 (5) 编辑
摘要:llvm带来很多很多好用的东西,比如clang,还有一个STL实现:libcxx.其优点不表,就说怎么打印STL容器内的元素吧. 实际上gdb,包括任何调试工具,都是不了解STL的,因为他不知道STL内部是怎么实现的.所以需要展示STL内部元素的时候,就需要用到一些脚本,或者插件之类的(VS也是这样).gdb在7.x支持python写插件,所以很多人都用python插件来打印libstdc++容器内的元素. llvm官方本身没有实现pretty printers,包括lldb这个项目也一样(只是实现了部分容器的parser). 本来还想讲讲怎么实现一个容器的parser,不过想想其实... 阅读全文
posted @ 2012-11-02 23:22 egmkang 阅读 (1874) 评论 (13) 编辑
摘要: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 阅读全文
posted @ 2012-09-06 12:58 egmkang 阅读 (47392) 评论 (4) 编辑
摘要: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 阅读全文
posted @ 2012-08-29 18:20 egmkang 阅读 (1250) 评论 (0) 编辑
摘要:题目不知道怎么取才好,但是意思很简单:如果你暴露一个复杂对象给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 阅读全文
posted @ 2012-07-01 17:12 egmkang 阅读 (9238) 评论 (9) 编辑
摘要:服务器代码依赖了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,所以不会出现任何问题;可是如果是异 阅读全文
posted @ 2012-04-15 16:59 egmkang 阅读 (1289) 评论 (4) 编辑
摘要:我们服务器一直在用boost/sgl stl的hash table,但是从来没有考虑过其中的效率问题,虽然hash_map/unordered_map跑的可能真的比map快一些,可能应该不是你理解的那么快.其实他可以更快一些!!! 当我自己尝试着实现了一个hash table之后,我发现确实如此.这篇文章也是来说说,如何实现较快的一个. 通常的hash table都是用开链法,开放地址法来解决冲突.开链法是总容易实现的一个,而且因为效率稳定,被加入了C++11,取名unordered_map.不过效率实在不咋地. 开放地址法的hash table,我是从google-sparseha... 阅读全文
posted @ 2012-01-18 14:40 egmkang 阅读 (10882) 评论 (2) 编辑
摘要:2011年都干了些啥....读书:1. 聪明的投资者2. 超级数字天才3. 西游记4. 程序开发心理学5. Unix网络编程6. Unix环境高级编程...或者还有其他的,暂时不记得了技术???....好像没干啥,就天天写代码....搞搞C++,Valgrind,Lua,宕机等等2012年,希望自己可以认真的去写写网络程序,虽然号称是写服务器的,但是从来没写过网络程序;希望可以认真的去看看几个开源的代码,研究一下;over 阅读全文
posted @ 2012-01-18 13:43 egmkang 阅读 (487) 评论 (1) 编辑
摘要:大学还没毕业,买了一些建行,一些交行..... 虽然现在还认为那些股票不错,不过终究发生过换股,全换成浦发,古井贡酒,还有鲁泰,出现了一些亏损,记录如下: 其中塔牌,华兰生物是做短线亏损,其他几个本来打算做长线,后来发现收益较好的品种,换股.... 股票名称 交易亏损(RMB) 农业银行 165.95 交通银行 1675.99 建设银行 288.00 三一重工 290.66 苏宁电器 677.41 塔牌集团 281.30 华兰生物 65.72 一共亏损:3445.82. 谨记. 阅读全文
posted @ 2011-12-27 13:27 egmkang 阅读 (472) 评论 (2) 编辑
摘要:相信很多人碰到过一个问题,就是代码太多了,不知道在哪里把这个对象给修改掉了.这个其实有两种办法的.1. 在调试的时候,可以下数据断点. gdb有watch断点.比如gdb>watch *(int*)0x12433,要记住,如果想要一只监视这个数据,就要用地址,否则过了这个scope,数据断点就无效了,还有就是,监视的值如果用内置数据类型可以表达的话,是有硬件断点的,否则效率茫茫低.....2. 运行的时候,本文主要讲这个. 先来回顾一下,我们都知道一个exec,都有好几个段,比如代码段,数据段等.这些段是有读写属性的,例如代码段只可以读,栈段是可以读写~~.那么我们就想把一个对象塞到一个 阅读全文
posted @ 2011-10-25 22:55 egmkang 阅读 (2654) 评论 (8) 编辑
摘要:相信一些朋友也碰见过这样的面试题目,本文尝试着给出解答.1. 分配对象在堆上 那么,必然要禁止对象在栈上面分配.一个很简单的办法,就是构造函数私有化(提供额外的接口生成对象),那么在栈上面就不可以分配.可是我们还需要这个对象要被析构,那么可以提供一个接口,显式的释放掉这个接口,也就是说delete也得给他禁掉~~~ 考虑另外一个问题,C++有placement new,我自己new一块内存,然后在你这上面构造.问题就变得很恶心,看来我们只有把new,delete都给他禁掉... 好了,我们现在知道该怎么做:createInstance()接口产生对象dispose()接口销毁对象new/... 阅读全文
posted @ 2011-10-25 22:40 egmkang 阅读 (2650) 评论 (0) 编辑
摘要:网友问了一个问题,说对象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... 阅读全文
posted @ 2011-09-27 14:16 egmkang 阅读 (4070) 评论 (2) 编辑
摘要:很大程度上,野指针都是因为编码不善,习惯不好所产生的.要解决野指针,就要养成好习惯,不要动不动就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 阅读全文
posted @ 2011-09-26 22:51 egmkang 阅读 (6491) 评论 (4) 编辑
摘要:CPI那么高,为了抗通胀,我买了股票,号称是价值投资:-),可是一直没有算过具体能有多少收益....今天算了一下浦发银行的收益,不算不知道,一算吓一跳啊.去年年报每股净资产8.57RMB,今年由于分割了股票,所以每股净资产大约是(8.99+0.42)/1.3 = 7.2RMB,作为起始每股净资产然后假设每年的净资产收益率为15%,去年是15.59%,据以往历史,15%的净资产收益率还是比较容易达到的.算算5年,10年后,浦发的净资产有多少:7.2(1+0.15)^5 = 14.487.2*(1+0.15)^10 = 29.12银行牛市时,PB会比较高一点,3倍算是比较高的,那么大约可以估算出1 阅读全文
posted @ 2011-08-13 19:22 egmkang 阅读 (1714) 评论 (2) 编辑
摘要: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 阅读全文
posted @ 2011-07-16 11:16 egmkang 阅读 (487) 评论 (2) 编辑
摘要:1. 一个程序员用在写程序上的时间大概占他的工作时间的10-20%,大部分的程序员每天大约能写出10-12行的能进入最终的产品的代码 — —不管他的技术水平有多高。 好的程序员花去90%的时间在思考、研究和实验,来找出最优方案。差的程序员花去90%的时间在调试问题程序、盲目的修改程序,期望某种写法能可行。“一个卓越的车床工可以要求比一个一般的车床工多拿数倍高的工资,但一个卓越的软件写手的价值会10000倍于一个普通的写手。”——比尔 盖茨 2. 一个优秀的程序员的效率会是一个普通的程序员的十倍之上。一个伟大的程序员的效率会是一个普通程序员的20-100倍。这不是夸张 — — 1960年以来的. 阅读全文
posted @ 2011-06-19 14:50 egmkang 阅读 (553) 评论 (4) 编辑
摘要:一来闲的蛋疼,二来我们代码里面有一些fastdelegate的代码,在clang下面实在编译不过去,所以打算重造一个轮子,至少标准一点(换个编译器能编译过去...)....废话不说,上代码:// C++版的多播委托,使用boost::function// 为了在各个编译器下面都能编译// author:egmkang#ifndef __ZEVENT_T_H__#define __ZEVENT_T_H__#include <boost/function.hpp>#include <list>template<typename T>class zEventBas 阅读全文
posted @ 2011-06-11 10:10 egmkang 阅读 (2099) 评论 (5) 编辑
摘要:本文炒冷饭.说实话,一直挺看好Thrift,支持的语言又多,代码写的有很清晰,效率又不低,为啥研究Protocol Buffer的人那么多.不管那么多了....Thrift中的对象序列化是我很看好的东西,他用compiler+类库,让你高效的完成任务,而且可以少犯错误.试想,有谁可以保证自己设计的对象,不会再改变呢?数据库的schema改了,你可以改改查询语句,但是如果你对象改了,之前序列化好的东西,有时候就很难搞回来了.(哎.....)废话不说,看Thrift里面怎么搞的.1. Thrift支持的数据类型Thrift支持的数据类型定义在TProtocol.h这个头文件中,有一个TType的枚 阅读全文
posted @ 2011-05-14 16:02 egmkang 阅读 (12636) 评论 (4) 编辑
共 5 页: 上一页 1 2 3 4 5 下一页