随笔分类 -  程序设计

摘要:最近闲来无事编写了一个异步redis客户端.为了测试其性能逐对redis和ssdb做了一次性能对比测试.首先介绍下测试环境,i5 4核心 3.6主频的台式机器,服务器客户断均运行在同一台机器上.测试内容是1000条hashtable数据,分别有两个属性chianfo和skill,每个属性存放100字... 阅读全文
posted @ 2015-05-08 21:42 sniperHW 阅读(1056) 评论(0) 推荐(0)
摘要:首先从一起多线程无锁算法的事故说起,以下是一个无锁栈的实现测试,但在开-O2以上优化的情况下它却无法正常工作: #include "lf_stack.h" #include "kn_list.h" #include "kn_time.h" #include "kn_thread.h" #includ... 阅读全文
posted @ 2014-12-28 16:10 sniperHW 阅读(592) 评论(0) 推荐(0)
摘要:对象引用的正确性在多线程环境下是一个复杂的问题,[请参考,处理由引用计数引起的泄漏](http://www.cnblogs.com/sniperHW/archive/2012/12/07/2808130.html).简单来说,我们应该尽量减少使用强引用,否则将有可能产生[处理由引用计数引起的泄漏]一... 阅读全文
posted @ 2014-12-28 12:42 sniperHW 阅读(1570) 评论(0) 推荐(1)
摘要:[原文](http://www.codeproject.com/Articles/153898/)#1 引言最近对于注重性能的应用程序,我们有了一种能显著提高程序性能的选择:多线程.线程的概念实际上已经存在了很长时间.在过去,多数计算机只有一个处理器,线程主要用于将一个大的任务拆分成一系列更小的执行... 阅读全文
posted @ 2014-12-18 17:33 sniperHW 阅读(15342) 评论(7) 推荐(6)
摘要:P54A (*) Check whether a given term represents a binary treeWrite a predicate istree which returns true if and only if its argument is a list represen... 阅读全文
posted @ 2014-09-28 13:35 sniperHW 阅读(1441) 评论(0) 推荐(0)
摘要:[L-99: Ninety-Nine Lisp Problems](http://www.ic.unicamp.br/~meidanis/courses/mc336/2006s2/funcional/L-99_Ninety-Nine_Lisp_Problems.html)列表处理类问题的解答,用Sc... 阅读全文
posted @ 2014-09-18 16:15 sniperHW 阅读(735) 评论(0) 推荐(0)
摘要:最近研究函数式编程,都是haskell和scheme交互着看的,所以笔记中两种语言的内容都有,练习一般也都用两种语言分别实现.本篇练习一些数组有关的问题,之所以与数组相关是因为在命令式编程中以下问题的核心数据结构主要是数组,而在scheme和haskell中主要是用list来实现.scheme中没有... 阅读全文
posted @ 2014-09-17 17:24 sniperHW 阅读(465) 评论(0) 推荐(0)
摘要:最近在为distri.lua实现一个lua调试系统,有一个简单的需求,lua导入一个文件的时候,将这个文件的文件名记录下来,以方便调试器在设置断点的时候判断是否一个合法的文件.lua导入文件是通过luaL_loadfilex实现的,一个简单的思路就是修改luaL_loadfilex,在luaL_lo... 阅读全文
posted @ 2014-08-30 12:11 sniperHW 阅读(3536) 评论(0) 推荐(0)
摘要:在多线程开发中,消息队列是一种有效的线程间通讯方式.我在开发KendyNet的过程中一直在寻找一种高效而易用的消息队列实现.期间使用过的一种实现可参考message queue的设计。这个实现的消息队列是相当高效的,但其存在的一个问题是,如果发送方相对较慢,则需要一个定时机制以固定间隔将本线程中缓存... 阅读全文
posted @ 2014-07-31 20:54 sniperHW 阅读(2720) 评论(1) 推荐(3)
摘要:cocos2dx基于引用计数管理内存,所有继承自CCObject的对象都将获得引用计数的能力,可通过调用retain成员函数用于引用计数值,调用release减少引用计数值,当计数值减为0时销毁对象.cocos2dx的对象管理是树形结构的,可通过调用父亲节点的addChild成员函数将一个子节点对象... 阅读全文
posted @ 2014-06-15 19:52 sniperHW 阅读(10340) 评论(0) 推荐(1)
摘要:为了更好的体现luanet的设计意图和避免与网上另一个开源项目重名造成混淆, luanet正式更名为distri.lua.后需开发工作包括跨平台,日志,通过Fork创建新线程正在开发中.新地址:https://github.com/sniperHW/distri.lua 阅读全文
posted @ 2014-05-05 22:44 sniperHW 阅读(1104) 评论(0) 推荐(0)
摘要:本文只介绍epoll的主要流程而不是分析源代码,如果需要了解更多的细节可以自己翻阅相关的内核源代码.相关内核代码:fs/eventpoll.c判断一个tcp套接字上是否有激活事件:net/ipv4/tcp.c:tcp_poll函数每个epollfd在内核中有一个对应的eventpoll结构对象.其中关键的成员是一个readylist(eventpoll:rdllist)和一棵红黑树(eventpoll:rbr).一个fd被添加到epoll中之后(EPOLL_ADD),内核会为它生成一个对应的epitem结构对象.epitem被添加到eventpoll的红黑树中.红黑树的作用是使用者调用EPOL 阅读全文
posted @ 2014-03-23 18:43 sniperHW 阅读(7842) 评论(0) 推荐(0)
摘要:续上篇,本篇介绍一个完整的golang文件传输服务器。完整的代码可以看服务器,客户端网络使用的框架如上篇介绍,这里就不再复述.首先定义3个命令码:const ( request_file = 1 file_size = 2 transfering = 3)request_file用于请求文件传输,附带的命令参数是文件key.file_size用于通告客户端文件的大小.transfering用于传输文件内容,附带参数是文件内容的二进制数据.服务器的文件配置示例../learnyouhaskell.pdf=haskell../golang.1.1.2.chm=golang../N... 阅读全文
posted @ 2014-03-07 22:27 sniperHW 阅读(7171) 评论(2) 推荐(0)
摘要:学习golang的时间断断续续加起来也有将近一个月了,这期间都是偶看翻几页书,没有写过实际的代码.最近做一个app项目,是一个展示类 的软件,当客户要看某个图片时首先向服务器发出一个请求,比对图片的版本,如果版本与本地一致,则直接显示,如果版本落后了则由服务 器将最新的版本发送给客户端.对服务器的需求就是一个简单的版本比对和文件传输,于是打算用go去实现,正好也可以练练手.在设计上,受到以往框架设计的影响,还是使用了wpacket,rpacket和共享buffer这个方案,不同的地方是go的网络API不支持gather io,所以buffer没有被实现为buffer list,而是一整块的连续 阅读全文
posted @ 2014-03-04 21:48 sniperHW 阅读(3827) 评论(2) 推荐(1)
摘要:有了tcmalloc和jemalloc,在大多数情况下我们都没有必要再自己写通用的内存分配器(应该说对于极大多数的程序员,都不可能写出比这个两个更好的通用内存分配器)。但是,如果对性能有极致的要求,写一个比通用内存分配器效率更高的池式对象分配器是可能的。一个最简单也高效的实现就是freelist,每次分配的时候从freelist中get一个,释放的时候put回去就好了。其实现在单线程下是相当简单的,也就几十行代码。但是在多线程的环境下,问题稍微复杂一点,因为可能有多个线程需要操作freelist,那么就要用锁去保护这个freelist,每次get和put的时候都要加锁显然会导致freelist 阅读全文
posted @ 2014-03-01 23:03 sniperHW 阅读(1200) 评论(1) 推荐(0)
摘要:##使用kendynet构建异步redis访问服务最近开始在kendynet上开发手游服务端,游戏类型是生存挑战类的,要存储的数据结构和类型都比较简单,于是选择了用redis做存储,数据类型使用string基本就足够了。于是在kendynet上写了一个简单的redis异步访问接口.###设计理念1.项目时间紧迫,不打算提供一个大而全的访问接口,只提供一个request接口用以发出redis请求.2.数据在redis中key和value都存储为string,由使用者负责将数据序列化成string,从string反序列化回数据.3.服务支持本地访问和远程访问,服务自动根据请求发起的位置将结果返回给 阅读全文
posted @ 2014-01-20 22:21 sniperHW 阅读(1152) 评论(0) 推荐(0)
摘要:首先本文并不打算详细的介绍A*算法,要想大致的了解A*算法可参看下面两篇文章:http://wenku.baidu.com/view/d39faba1284ac850ad02425d.htmlhttp://wenku.baidu.com/view/eaa14f11f18583d049645992.html其次,不用太纠结算法的效率,例如remove_min_pnode函数使用线性探索寻找最小值,实际上可以使用二叉堆或别的方法提高执行效率.本文的目的是提供一个较通用的A*框架,用于解决游戏中的寻路问题.首先看下结构的定义://一个地图块节点struct map_node{};//路径节点stru 阅读全文
posted @ 2012-12-21 15:43 sniperHW 阅读(8246) 评论(2) 推荐(1)
摘要:前段时间实现的C协程依赖栈传递参数,在开启优化时会导致错误,于是实现了一个ucontext的版本,但ucontext的切换效率太差了,在我的机器上执行4000W次切换需要11秒左右,这达不到我的要求,所以重新设计了实现,使得在开启优化时也能得到正确的结果.并且效率也令人满意,4000W次切换仅需要730ms左右,足足比ucontext的实现快乐近15倍。下面贴出实现:#include "uthread.h"#include <stdlib.h>#include <ucontext.h>#include <pthread.h>#includ 阅读全文
posted @ 2012-08-05 22:52 sniperHW 阅读(3420) 评论(20) 推荐(1)
摘要:最近两天测试了下tcmalloc,性能的确牛B.所以修改了下固定对象分配器,模仿tcmalloc利用tls做thread cache.下面是在我机器上对自己写的各个内存分配器与tcmalloc的对比测试,fix_obj_pool finish:326fix_obj_pool finish:165fix_obj_pool finish:168fix_obj_pool finish:164fix_obj_pool finish:174fix_obj_pool finish:164fix_obj_pool finish:174fix_obj_pool finish:185fix_obj_pool f 阅读全文
posted @ 2012-07-24 11:33 sniperHW 阅读(2248) 评论(9) 推荐(0)
摘要:本篇使用上一篇提供的接口,实现一个简单的协程调度框架.基本思想是,创建一个调度器,用于将处于活动状态的协程调度运行,调度器维护着一个actived列表,调用spawn创建协程时,将新建立的协程添加到活动列表中。调用schedule将启动调度器主循环.coro.h#ifndef _CORO_H#define _CORO_H#include <stdint.h>#include "uthread.h"struct coro{ struct coro *next; uthread_t ut; uint32_t id; start_fun st_fun; uint32_ 阅读全文
posted @ 2012-06-20 16:32 sniperHW 阅读(2288) 评论(0) 推荐(1)