Author Archives: csslayer

Memory pool

自从fcitx的内核从古老的gbk转向了utf8之后,自带拼音和码表的字符串就带来了一些问题。 首先情况是这样的在我的系统上,fcitx的自带拼音加载后将占用28MB的内存,考虑下的话,其中有个 (2int+2pointer)*词数的数据结构,其次是词本身,有约4MB,词总数约20万。那么估计一下的话拼音应该占用约8.5M。考虑刚刚启动不加载的时候,占用约6M,总计应该在14M左右。那多出来的14M都干啥去了呢?(并无内存泄露) 之前也一直没有关注这件事情,不过在前几天在 @henryhu 的建议下增加了一个Memory pool的实现。这个实现非常naive,乃至于不能单独释放申请的内存(只能整体释放)。不过对于fcitx自身拼音和码表的实现这个情况来说,是一个非常合适的选择。 首先有兴趣的人可以来做一个实验,写一个for循环,每次使用malloc申请1字节,循环申请1M次。然后看看操作系统的内存使用量。然后修改下,每次申请16字节,循环申请64k次,总量也是1MB,然后再看看操作系统内存使用量。 具体实现如下,内存不足时默认每次申请8k字节的内存块,如果一次申请超过8k就申请8k的2的n次方那么大的内存。每个块使用一个offset标记里面当前free的位置,当offset和容量的差距小于某个threshold的时候,就将其从可申请的list中移除,保证在遍历候选内存块的列表时的效率,那些不使用的部分成为可以忽略的内存碎片。(实际设定threshold = 16,16相比 8k 可忽略不计) 对于码表和拼音来说,其中的数据是几乎不用单独释放的,这正好可以采用这种naive的实现(而不是使用比较复杂的full functional的memory pool)。 那么最终的效果就是在我的系统上fcitx自带拼音加载后使用内存达到14MB,符合最开始的预期使用。 Ref: http://code.google.com/p/fcitx/issues/detail?id=133 http://en.wikipedia.org/wiki/Memory_pool

Posted in fcitx development | 8 Comments

My CMake Tutorial 3

我的风格其实极其诡异,因为我只想讲我乐意讲的,但保证实用性,除了第一次的类hello world,全部脚本都在实际项目中使用(当然很多是fcitx的 😛 )。学习曲线什么的,谁管啊。 如果你想找前面的内容,请猛击 https://www.csslayer.info/wordpress/category/cmake/ 顺带一提,本人近期一直占据oholh cmake 语言提交 http://www.ohloh.net/languages/74 排行中的一名。(有段生猛的时间也挤进过C语言的排名……不过现在出来了 :P) 本次大容量,包括三个内容,创建自己的可以被find_package使用的CMake脚本,复杂自定义文件生成,Gettext整合。

Posted in cmake | Tagged | 3 Comments

My CMake Tutorial 2

其实我的感觉是大家都被我第一篇给蒙骗了……从第二篇开始我就要开始走非主流路线。 如何 make uninstall cmake是没有make uninstall支持的。 你可能觉得很无语。不过还是有方法的,这个方法也被应用于fcitx的每个项目当中。另外如果你使用KDE的话 – find_package(KDE4) – 那么KDE也会自动提供uninstall,不用你麻烦了。 那么现在来看看这是怎么实现的。 在make install的时候,cmake会生成一个文件 install_manifest.txt ,里面是要安装的文件。而uninstall的基本思想就是读他,然后把里面列出的文件删掉。 一般而言我会这么做,新建一个文件夹叫cmake,然后在里面放上以下内容的文件,命名为cmake_uninstall.cmake.in。 if (NOT EXISTS “@CMAKE_CURRENT_BINARY_DIR@/install_manifest.txt”)     message(FATAL_ERROR “Cannot find install manifest: \”@CMAKE_CURRENT_BINARY_DIR@/install_manifest.txt\””) endif(NOT EXISTS “@CMAKE_CURRENT_BINARY_DIR@/install_manifest.txt”) file(READ “@CMAKE_CURRENT_BINARY_DIR@/install_manifest.txt” files) string(REGEX REPLACE “\n” “;” files “${files}”) … Continue reading

Posted in cmake | Tagged | 3 Comments

围观对岸的输入法小风波

围观而已。 GCIN & HIME http://moto.debian.tw/viewtopic.php?f=49&t=16373 http://moto.debian.tw/viewtopic.php?f=49&t=16384 估计他们想不到这边还有个坐在几千公里外的fcitx开发者在远处……

Posted in Linux | 8 Comments

fcitx-libpinyin & fcitx-table-extra

其实是前几天才看到有0.3发布了,于是这几天开始完成fcitx-libpinyin,没想到真的和在Twitter上说的一样是3天的事情。目前已经基本完成了,除非要增加额外libpinyin没提供的功能,现在拼音,双拼,以及注音都应该可以正常工作。 代码: https://github.com/fcitx/fcitx-libpinyin 需要 fcitx-git 的代码(4.2)。 想要使用cloudpinyin的话,也请使用 fcitx-cloudpinyin 的 git 代码(其实也就是增加几个输入法名称判断而已。)。注音不能用 fcitx-cloudpinyin(考虑到用词不同……意义不大)。 fcitx-table-extra 包含了额外码表,需要 fcitx 4.2 (git),因为需要码表新的支持。目前包含郑码(专利已过期),仓颉,和嘸蝦米(专利已过期)。 https://github.com/fcitx/fcitx-table-extra 顺带一提,fcitx-libpinyin实现代码量 1154 行。 嘛,算个fcitx的伪圣诞礼物?开始写的时候可没想这么多……

Posted in fcitx development | Tagged , , , , | 5 Comments