奇淫巧计系列
文章平均质量分 79
pennyliang
of the people, by the people, for the people--abraham lincoln
展开
-
linux编程的108种奇淫巧计-12(存储计算)
linux编程的108种奇淫巧计-12(存储计算)原创 2010-12-09 17:18:00 · 3315 阅读 · 5 评论 -
linux编程的108种奇淫巧计-16(如何达到内存最大带宽,复杂指令)【续】
linux编程奇淫巧计16(如何达到内存最大带宽,复杂指令)【续】原创 2011-03-10 21:25:00 · 7541 阅读 · 12 评论 -
linux编程奇淫巧计17(如何达到内存最大带宽,精简指令,预取和NT)
linux编程奇淫巧计17(如何达到内存最大带宽,精简指令,预取和NT)原创 2011-03-17 00:30:00 · 3700 阅读 · 0 评论 -
将神的恩赐发挥到极致【转自Maling】
转自:http://blog.csdn.net/linguranus/archive/2011/02/16/6189676.aspx希望CSDN的编辑,将这个博客推荐到首页,非常了不起的成果。以下全文转载,来自Maling。转载 2011-03-30 13:25:00 · 5094 阅读 · 1 评论 -
关于bit操作(bit_set test_bit)
今天发现一个奇怪的现象,用linux内核的bitops.h里面的bit_set和test_bit居然没有不用汇编的代码快。记录下来,备忘。 下面是可执行程序,THUIRDB暂时没有bitops里面的实现,改用我自己写的实现了。当然bitops里的实现,nr可以很大,而我的代码nr只能是0-63之间的一个数,对THUIRDB的应用来说,足够了。#include "std原创 2011-06-07 16:08:00 · 12443 阅读 · 0 评论 -
linux奇淫巧计 put variables in a regsiter
#define max(a,b) ({ \ typeof (a) _a = (a); \ typeof (b) _b = (b); \ _a > _b ? _a:_b; \ })#include "stdio.h"int main(void){ register int a a原创 2012-01-01 00:13:37 · 2409 阅读 · 2 评论 -
linux编程的108种奇淫巧计之18(SIMD)
在优化的层次中,从上到下依次是,业务级,算法级,编码级,指令级,平台级,和硬件级。 业务级表示很多优化可以在业务讨论中被剪枝或者改进,例如业务真的需要用3个月的数据来做分析吗?还是2个月就够了?这需要产品经理,技术经理的经验,不在话下。 算法级主要集中在复杂度上,一个好的复杂度算法,哪怕实现的在拙劣可能都要远远好于一个优化到极致的差方法。往往大公司考试喜欢涉及这些方面。原创 2011-03-28 09:23:00 · 10570 阅读 · 33 评论 -
linux编程的108种奇淫巧计-16(如何达到内存最大带宽,复杂指令)
内存的使用可以说对程序员来说极其重要,特别在大规模数据处理中,如何达到内存带宽的极限是程序员追求的目标。 从本节开始,通过一系列的例子,来进行探讨。本系列全部采用汇编语言,使用的例子只有一个就是内存拷贝,这个最容易理解,最容易举例的例子。 本节给出的代码是baseline,也就是最差的方法,将来的方法都比这个要强的多,包括了精简指令,内存的预取,MMX寄存器,块复制等多项技术原创 2011-03-08 15:13:00 · 13175 阅读 · 16 评论 -
linux编程的108种奇淫巧计-12(存储计算)续
接上篇:linux编程的108种奇淫巧计-12(存储计算) 关于购票问题其实是一个组合数学的问题,有通解可以直接求出。 我们假定X轴为手持50元的人,Y轴为手持100元的人,那么一个正确的解等价于从(0,0)到(n,n)的格路问题,每次只能走一格,要么X加1,要么Y加1,如下所示的一条红线为一个8个人的解,即{50,50,100,100,50,50,100,100},原创 2010-12-10 11:39:00 · 9142 阅读 · 18 评论 -
PForDelta索引压缩算法的实现
前日一个朋友给我发来了一个索引压缩算法,写得非常漂亮而且简洁,压缩比和解压性能方面大大超过目前已知的一些字节对齐的算法和Pfordelta这样的非字节对齐的算法,让人叹为观止,这是我看到的最好的压缩算法,他将会以论文的形式发表,相信必将震惊世界,我之前也写了很多Pfordelta的博客,大家对这个算法的具体实现很好奇,有几个难点,一个是bit pack和unpack,一个是关于exception的原创 2010-11-30 17:23:00 · 9310 阅读 · 15 评论 -
linux编程的108种奇淫巧计-7(再答gangban_lau)
再答gangban_lau:http://blog.csdn.net/gangban_lau/archive/2010/11/10/6000977.aspx 博客确实不是很好的讨论平台。 对于是否原子性这个问题,我们在水木体系结构版曾讨论过这个话题,参见yifanw的发言,“在所有mordern archiecture上,对齐的machine word读写肯定是at原创 2010-11-10 19:43:00 · 19487 阅读 · 41 评论 -
linux编程的108种奇淫巧计-7(Lock-free实验)
从该博客开始,会有一些小系列预计有4-5篇博文来介绍,锁的应用和实践,我们常常听到spin lock,wait-free,lock-free,这到底是怎么回事,我们能不能自己实现一个spin lock,原理是什么?这个小系列就讨论这个内容。 首先我们来看两个基本操作compare_and_swap和fetch_and_add,基本上lock-free的操作都会依赖这两个基本的原原创 2010-11-07 13:38:00 · 10010 阅读 · 25 评论 -
linux 奇淫巧计 Manual FIle Locking
类似fputs这样的标准文件IO函数均为线程安全,即函数内部会加锁解锁,但如果是大量文件读写,可以采用flockfile函数来进行统一加锁减锁,而内部采用线程不安全的文件IO。 例如 fputs("XXX",stream); fputs("YYY",stream); fputs("ZZZ",stream); 可以改写为 flockfi原创 2012-01-02 23:16:04 · 3191 阅读 · 0 评论 -
linux 奇淫巧计 Userspace I/O scheduling for multi-file operations
在数量众多的文件读写时,例如一个目录下有400万个图片文件,需要将这400万个图片文件打包,如果这400万个文件读写顺序不对,将会到这磁头来回seek,即便单文件顺序,但由于每个文件较小,因此顺序的机会有限,大部分呈现随机读的状态。 linux内核的IO scheduling 是针对单个文件的,有四种调度方式,但缺乏对大量文件的调度,因此有必要在用户空间进行IO调度。 简单来原创 2012-01-02 22:51:33 · 3899 阅读 · 1 评论 -
linux编程的108种奇淫巧计-15(减少复制)
计算机的存储结构是层次性的,从快到慢,代价从高到低,容量从小到大,寄存器,L1 cache,L2 cache,直到磁盘,甚至比磁盘更慢速的磁带机,因此在程序运行时,不可避免的会有复制,这一点很重要,从优化的角度看,很多时候都是为了减少复制的代价,比如如果已知磁盘的读写是顺序的,这样采用DIRECTIO是较好的,直接读到用户内存上,而不需要先读到内核内存上,然后再复制到用户内存,这个例子我打算在未来原创 2011-01-18 15:39:00 · 7311 阅读 · 7 评论 -
linux编程的108种奇淫巧计系列被翻译成日文版了
在google上搜索“linuxプログラミングの108種類”可以看到一些被翻译的博客,例如:http://bbs.flatworld.jp/node/1209原创 2010-11-23 08:09:00 · 2260 阅读 · 3 评论 -
linux编程的108种奇淫巧计-15(减少复制)[续]
接上文:linux编程的108种奇淫巧计-15(减少复制)原创 2011-01-20 14:49:00 · 2987 阅读 · 0 评论 -
linux编程的108种奇淫巧计-11(乱序)
linux编程的108种奇淫巧计-11(乱序)原创 2010-12-08 16:33:00 · 3575 阅读 · 2 评论 -
linux编程的108种奇淫巧计-1(FALSE SHARING)
我打算开个长篇系列博客,预计108篇吧,但愿能在1-2年内完成。原创 2010-10-20 13:22:00 · 9835 阅读 · 29 评论 -
linux编程的108种奇淫巧计-2(RDTSC)
通常我们需要对程序运行的准确时间进行测量,但多线程,多核环境下,这变得很困难,我们有没有一种比较通用简单的方法来做到这一点呢?这些方法都存在哪些问题,如何改进可以抵消这些误差呢?原创 2010-10-21 12:42:00 · 7455 阅读 · 14 评论 -
linux编程的108种奇淫巧计-3(magic 2)
在我们编码的时候,编译器生成什么样的代码,往往我们是不清楚的,但一旦清楚了以后,我们就能利用这种性质来做一些优化,当然这种优化可能是有限的,但在累积的效应下,这些优化会显得很大,比如每天省1毛钱,省一辈子,也是一笔不小的开销。 我们来用一段简单的代码来说明这个问题,下面这段代码可能太平平无奇了,其中结构体test_1是3个字节,而test_2是4个字节,为了让test_2凑够2的倍数,特别加了一个padding字段。 因此我们得到这样一个结论: 1)在结构体大小的原创 2010-10-25 16:40:00 · 4004 阅读 · 2 评论 -
linux编程的108种奇淫巧计-4(编译展开)
今天继续介绍第四种常见技巧,编译展开,代码如下: 我们知道对于循环编译器会自动进行展开的,但是如何展开,这完全不可控,如果自行展开,代码会显得臃肿难看,因此本为介绍了一种常见的方法进行这种代码展开,可以写到任意层次,我这里只写到了DO16。原创 2010-10-28 10:18:00 · 33084 阅读 · 46 评论 -
linux编程的108种奇淫巧计-1(FALSE SHARING)【续】
该文有很多网友回复,比较集中的看法是CPU字节对齐,巧合的是有一个朋友用这个代码做了测试,发现对齐和不对齐的代码执行的速度是一样的,原因是他的笔记本安装的linux操作系统,而笔记本是单核的,所以就出现了这个状况,如果和CPU字节对齐,在单核的情况下怎么会速度一样呢?另外如果是CPU字节对齐,把线程去掉,替换成两个函数依次执行,也应该有效率的差异,再说CPU字节对齐也不该在64字节上对齐,哪有这么牛叉的CPU寻址呢?原创 2010-10-26 12:40:00 · 11922 阅读 · 10 评论 -
linux编程的108种奇淫巧计-4(编译展开)(续)
编译展开的这篇博客被CSDN推了首页http://blog.csdn.net/pennyliang/archive/2010/10/28/5971059.aspx,有些读者反映有些太难,考虑到有些地方没有讲得太清楚,本文一并进行深入讨论。原创 2010-10-30 09:09:00 · 4064 阅读 · 11 评论 -
*nux编程的108种奇淫巧计-5(rbp寄存器)
昨天在家浏览了纽约大学的一个课件,找到一个例子,很有趣,我稍微修改了一下,支持32位和64位环境:如下。 以后该系列采用这样的模式,首篇只贴代码,续篇进行解释和分析,期间希望读者朋友能自己做实验。原创 2010-11-01 09:58:00 · 4435 阅读 · 5 评论 -
*nux编程的108种奇淫巧计-6(shellcode)
shellcode已经接近病毒的范畴了,但本文不打算让大家学习病毒,只是通过一个简单的例子,告诉大家shellcode是怎么来的。原创 2010-11-04 12:03:00 · 2521 阅读 · 12 评论 -
关于linux编程的奇淫巧计系列的FAQ
自从发布Linux编程的奇淫巧计系列以后,很多读者给我写来邮件,这里我一并作答。1)你写的内容有多少是实践中可以用到的?还是只是花里胡哨的东西?答:我负责的告诉你,大部分都是工程实践中用到的,否则我哪能想到这么些个花招,大部分都是我在工作实践和知名开源代码中看来得,如果有长期看开源代码的朋友应该能体会到。我只是精简了以后,方便大家做实验,和进一步的思考研究。2)我不在linux环境下开发,看这个有用吗?答:很遗憾,这个系列是linux环境下的,windows等其他环境可以参考,代码有些可能不能直接编译,我本原创 2010-11-09 13:14:00 · 2482 阅读 · 16 评论 -
linux编程的108种奇淫巧计-8(嵌入汇编的另一种写法)
可能大家厌倦了传统的在C,C++中嵌入代码的痛苦,%要写两遍,而且一大堆规范,嵌套起来看得很不爽,好,下面让大家看另一种纯正的嵌入,大家可能会问,太“淫”了吧,毫无价值啊,要知道如果你想要做一些乱序的话,先写一遍函数,然后Objdump例如我们先写了这个add函数,然后用下面提到的这种方法,控制好计算顺序,你懂的,再多写就废话了。原创 2010-11-09 18:21:00 · 3489 阅读 · 5 评论 -
linux编程的108种奇淫巧计-7(Lock-free实验)【答网友问】
接上次博客:http://blog.csdn.net/pennyliang/archive/2010/11/07/5993138.aspx原创 2010-11-10 13:17:00 · 5427 阅读 · 11 评论 -
linux编程的108种奇淫巧计-2(RDTSC)【续】
有时候我们希望在x86平台下获得更加高的精度。如果我们想准确的知道一段程序,一个函数的执行时间,可以连续执行2次rdtsc,之间没有一行代码,来计算这两段指令执行过程会有的cycle数,不同机器可能都会有不同,和机器的性能有关系,但和负载基本没关系,也就是多进程,多线程情况下,连续两个rdtsc之间不会插入很多cycle,这一点大家可以做实验来验证。 start = rdtsc(); end = rdtsc();在获得这个数据后,我们对一段代码的执行时间就可以做一个更加精原创 2010-11-11 16:43:00 · 3874 阅读 · 8 评论 -
memset这个事情 再多说两句
memset这个事情 再多说两句原创 2011-01-18 22:39:00 · 3672 阅读 · 0 评论 -
linux编程的108种奇淫巧计-9(Lock-free之二)
接上回: linux编程的108种奇淫巧计-7(Lock-free实验) 本节增加test_and_set的原语和一个spinlock比较完整的实现(参照nginx spin lock),主要的变化在于插入了__asm__ ("pause")指令,且插入次数是尝试锁的次数的2次幂,有助于在减少重试次数,通过这一变化可以对比看出CPU100%占用的问题得到了缓解。test_and原创 2010-11-19 11:09:00 · 5374 阅读 · 0 评论