jianwu's profile乱舞的弦~~~张牙舞爪的warningPhotosBlogLists Tools Help

jianwu zhang

Interests
舞~舞~舞~ 不乱怎么行~
安静 理性 但还是没有理由不乱舞
因为~打开了那只盒子 属于pandora的盒子 珍惜
Photo 1 of 47
Lists
No list items have been added yet.

乱舞的弦~~~张牙舞爪的warning

15 June

程序员创业失败主要原因

阿。。。从某条开始基本上全中。警醒下。
 
1)没有明确的生活目标。没有奋斗的中心目标或明确的努力主向,就没有成功的希望。 

2)没有非同寻常的雄心抱负。 
  如果对凡事漠不关心,不想在人生中求发展,不愿付出代价,那么这样的人也将成功无望。   
 
3)缺乏自律。 
  纪律来自自我控制,这意味着人必须控制所有的消极思想,只能先控制自己,才能控制环境。自制是人类面对的最艰巨任务,如果无法战胜自我,就会被自我征服。 

4)拖拉。 
  这是失败最普遍的原因之一,拖拉“老人”存在于每个人心中的阴暗角落,正是因为一直都在等待“适当时机”,才开始做那些值得做的事情,其实时机永远不会“适当”。   
 
5)缺乏毅力。 
  不管做什么,大部份人开始时都满怀信心,但却不能善始善终。大部份人一遇到失败就容易放弃。毅力是不可取代的。把毅力当座右铭奉行到底的人,发现失败会自行退下,失败是无法对抗毅力的。   
 
6)消极的个性。 
  因为消极的个性,而将别人拒于千里之外者,不会有成功的希望。成功来自力量的运用,而力量又来自与他人的合作,消极的个性无法促成合作。   

7)无法克制“不劳而获”的欲望。这种机体本能使很多人走向失败。   

8)缺乏果断的决策力。 
  成功的人士会果断决策,然后如果有必要,再慢慢改进。失败者往往花很长时间才能作出决策,但很快就需要修改,而且要频繁修改。犹豫和拖拉是一对双包胎,只要找到其中一个就一定能找到另一个,所以必须趁它们没有将你完全束缚在失败的车轮上,果断地把它们消灭。   
 
9)过度谨慎。 
  不主动抓住机会的人往往只能捡别人挑剩的机会,过度谨慎和不够谨慎都不可取,人生本来就充满偶然成分。   
 
 
 
 

10)迷信与偏见。 
  迷信是恐惧的一种形式,也是无知的表现,成功人士心胸宽广,无所畏惧。 
 
11)目标不专。“万事通,万事松”,要全心全意专注于一个主要目标。   
 
12)缺乏热情。 
  没有热情,一个人就没有说服力,而且热情有一种感染力,一个人如果拥有热情,并能适当控制热情,往往会受到人们的欢迎。   

13)偏执。心胸狭窄很难取得任何进步,偏执说明一个人不积极获取知识。   
 
14)蓄意不忠。 
  诚实是一种不可替代的品质,受无法控制的环境所迫,一个人可能一时不忠诚,也不会带来永久的破坏。但是,如果一个人蓄意不忠,则无药可救。他的得行为迟早会被发现,他负出的代价可能是失去信誉,甚至失去自由。   
 
15)自私和虚荣。这些品质问题好比亮起红灯,让人不敢靠近,是妨碍成功的致命因素。   
 
16)猜测而不思考。 
  多数人往往漫不经心或者过于懒惰,不愿费心获取用于准确思考的事实。他们喜欢根据猜测或仓促得出的“结论”了事。观念改变人生!选择决定未来!行动决定成败!
 
 
来吧,老规矩,加上一张无关图片结束文章。前天北京vs天津的一场比赛,球迷打出的横幅:
[没插件,饮恨吧mina] 

 

躲进小楼成一统之技术贴---release要比debug快么

 

读熊力先生的windows用户态程序高效排错的时候遇到这样一个问题:

 

------------------------------------------------------------------------------------------------------------

分别在debug/release模式下运行下面的代码比较效率,会发现debugrelease更快。你能找到原因吗?

 long nSize = 200;
char* pSource = (char *)malloc(nSize+1);
char* pDest = (char *)malloc(nSize+1);
memset(pSource, 'a', nSize);
pSource[nSize] = '\0';
DWORD dwStart = GetTickCount();
for(int i=0; i<5000000; i++)
{
strcpy(pDest, pSource);
}
DWORD dwEnd = GetTickCount();
printf("%d", dwEnd-dwStart);

 

------------------------------------------------------------------------------------------------------------

vc6调了一下果然如此,根据cpu性能的不同相同的代码debugrelease的性能差距竟然有34倍之多。决定把此问题搞清楚。

 

先拿出代码来吧:

----------------------------------------release部分代码-----------------------------------------------------

00401044 8B FB                mov         edi,ebx

00401046 83 C9 FF             or          ecx,0FFh        ;循环次数

00401049 33 C0                xor         eax,eax             ;搜索内容

0040104B F2 AE                repne scas  byte ptr [edi]            ;一直重复搜索到EDI字符串末尾的0

0040104D F7 D1                not         ecx  ;得到搜索次数,也就是字符串的完整长度

0040104F 2B F9                sub         edi,ecx             ;EDI后退到源字串头

00401051 8B C1                mov         eax,ecx

00401053 8B F7                mov         esi,edi                   ;ESI指向源字串地址

00401055 8B FD                mov         edi,ebp                   ;EBP指向目的字串地址(之前malloc结果)

00401057 C1 E9 02             shr         ecx,2                     ;双字mov 次数为长度除以2

0040105A F3 A5                rep movs    dword ptr [edi],dword ptr [esi] ;内存拷贝

0040105C 8B C8                mov         ecx,eax                   

0040105E 83 E1 03             and         ecx,3

00401061 4A                   dec         edx

00401062 F3 A4                rep movs    byte ptr [edi],byte ptr [esi] ;完成剩余内容的拷贝

00401064 75 DE                jne         main+44h (00401044)

----------------------------------------------------------------------------------------------

 

 

 

debug版本调用的从strcat.asm就能够直接看到了,但是注释中实现的strcpy太过简单,不能显示汇编代码的全貌阿,以下是代码:

-----------------------------------------------------------------------------------------------

mov     edi,[esp+8]         ; edi points to dest string



copy_start::
       mov     ecx,[esp+0ch]       ; ecx -> sorc string
       test    ecx,3               ; test if string is aligned on 32 bits
       je      short main_loop_entrance

src_misaligned:                     ; simple byte loop until string is aligned
       mov     dl,byte ptr [ecx]
       add     ecx,1
       test    dl,dl
       je      short byte_0
       mov     [edi],dl
       add     edi,1
       test    ecx,3
       jne     short src_misaligned
       jmp     short main_loop_entrance

main_loop:                          ; edx contains first dword of sorc string
       mov     [edi],edx           ; store one more dword
       add     edi,4               ; kick dest pointer
main_loop_entrance:
       mov     edx,7efefeffh
       mov     eax,dword ptr [ecx] ; read 4 bytes

       add     edx,eax                                  7e fe fe ff
       xor     eax,-1

       xor     eax,edx
       mov     edx,[ecx]           ; it's in cache now

       add     ecx,4               ; kick dest pointer
       test    eax,81010100h

       je      short main_loop
       ; found zero byte in the loop
; main_loop_end:
       test    dl,dl               ; is it byte 0
       je      short byte_0
       test    dh,dh               ; is it byte 1
       je      short byte_1
       test    edx,00ff0000h       ; is it byte 2
       je      short byte_2
       test    edx,0ff000000h      ; is it byte 3
       je      short byte_3
       jmp     short main_loop     ; taken if bits 24-30 are clear and bit
                                   ; 31 is set
byte_3:
       mov     [edi],edx
       mov     eax,[esp+8]         ; return in eax pointer to dest string
       pop     edi
       ret
byte_2:
       mov     [edi],dx
       mov     eax,[esp+8]         ; return in eax pointer to dest string
       mov     byte ptr [edi+2],0
       pop     edi
       ret
byte_1:
       mov     [edi],dx
       mov     eax,[esp+8]         ; return in eax pointer to dest string
       pop     edi
       ret
byte_0:
       mov     [edi],dl
       mov     eax,[esp+8]         ; return in eax pointer to dest string
       pop     edi
       ret

-----------------------------------------------------------------------------------------------

 

 

 

1.最直接(或许也是最正确的)反应,编译器做多余的事情了,就检查debugrelease模式下编译参数的区别。最终目标集中在了 /O2/Ot上,使用/O2效率低,使用/Ot效率高。查阅资料之后发现 /O2 /Ot的超集,在我单独添加/O2的优化选项时,效率仍然是比较高的,开始怀疑资料的准确性。此路暂时不通放弃。

 

2。接下来就开始怀疑release版本内存对齐造成效率低下,检查后win32平台malloc()内存地址必然对齐。pass

副产品对齐版的malloc/free函数如下:

/* align_size需要为2的倍数*/

void *aligned_malloc(size_t size, size_t align_size) {

 

char *ptr,*ptr2,*aligned_ptr;

int align_mask = align_size - 1;

 

ptr=(char *)malloc(size + align_size + sizeof(int));

if(ptr==NULL) return(NULL);

 

ptr2 = ptr + sizeof(int);

aligned_ptr = ptr2 + (align_size - ((size_t)ptr2 & align_mask));

 

 

ptr2 = aligned_ptr - sizeof(int);

*((int *)ptr2)=(int)(aligned_ptr - ptr);

 

return(aligned_ptr);

}

 

void aligned_free(void *ptr) {

 

int *ptr2=(int *)ptr - 1;

ptr -= *ptr2;

free(ptr);

}

3。怀疑编译器release版本经常进行的内联优化上。检查代码以及常识告诉我这样的优化只能让release版本效率更高而已。

 

4.开始修改代码,使用动态从msvcrtload strcpy,使用strncpy,自己实现注释版的strcpy

并强制inline,最终的结果都是相同,开始不得不关注进strcpy代码里了,debug版本的strcpy在效率上一定比release的效率高(一直不愿相信这个问题)。我们就只能再回过头来看上面的代码了。Release版本的代码算是比较常规的拷贝操作了,遍历获取字串长度,然后一个DWORD一个DWORD拷贝(很显然比单字节拷贝效率高),最后如果还有内容的话,就按照byte拷贝。下面是debug的,

a)       首先检查是否内存对齐,未能对齐的话先诸字节拷贝直至对齐。对win32平台我们直接pass因为内存分配好就是对齐的。

b)      进入main_loop_entrance就比较神奇了,看下面这段神奇的代码,判断字符串是否到了结尾的,如果对一个DWORD拆分成4byte分别判断,那4bytes一起拷贝节省下拉性能立刻浪费掉了,ms采取了一个非常聪明的办法

 

-----------------------------------------------------------------------------------------------------------------

mov     eax,dword ptr [ecx]     ; read 4 bytes
mov     edx,7efefeffh ;
就是
-0x81010101H
add     edx,eax ; eax - 1000 0001 0000 0001 0000 0001 0000 0001B
;
使用减法取反,如果为0000 0000就是NULL,那么取反的时候会向前一字节借位

xor     eax,-1 ;
直接取反,不借位

xor     eax,edx
add     ecx,4
test    eax,81010100h ; 1000 0001 0000 0001 0000 0001 0000 0000B
;
看看直接取反和减法取反,可能存在借位的那些位是否相同。相同则不存在借位,继续循环

;
否则就扫描到NULL了,字符串结束

 

简单的解释一下前三个字节我们可以这样判断,如果某字符减去0x1还要向前字节借位的话,那么该字符必然是’\0’,这样的话前一字节的最后一个bit必然会被借位。如此以是否向前一字节借位这一标准来判断该字节是否为’\0’.这样的方法适用于前三个字节,但是第四个字节怎么办?ms使用的方法是这样的以第四个字节的最高bit来判断,如果该字节为0,则在进行减法操作的时候,字节的最高位由于借位产生了1(不是纯0就不会借位到这个倒霉的最高bit身上),以此标准来判断该字节是否为0

效率的节约也就在于此,dword进行拷贝以及直接对dword进行判断以查找字符串末尾,这是debug版的strcpy超越release版的地方。计算机的世界,算法为王。

 

 

 

不知道诸位有注意到的这个地方没,如果这个倒霉的bit1其它bit0呢?他也可能会误把这种情况的跟’\0’混淆的,因为代码无法判断这个1使本来就有的还是被借位出现的(本质就是0xor0 = 1    1 xor!1 = 1两种情况无法判断),在进行进一步确认的时候就出了问题,不得已重新循环反而就损失了效率。当然这是一种极端的情况。可以填充数据为80xxxxxx来验证一下我们的怀疑。

 

针对这种方法如果我们想有所改进,单独的DWORD看来是希望不大了。可以结合cf寄存器来做下一步的工作。留一个note吧,以后思考。

整理下最近搞的wow外挂,release些经验来吧。。。。

 

 

30 May

时代周刊的一篇文章

 日前公布的联想2008—2009财年报告,披露了联想巨亏2.26亿美元。这是联想10年来的首次亏损。

  联想的亏损主要包括两大部分,一是营业性亏损,二是高达1.16亿美元的重组费用。如果说前者可以用全球经济不景气导致业绩下滑作遁词的话,那么后者可以说是联想高层一系列战略失误的累积效应。

  “三无”企业

  联想的巨亏是意料之中的事。

  2002年,杨元庆提出联想搞“三化”,即科技化、服务化和国际化。杨元庆的“三化”,核心是转型,把联想从制造企业转型成服务企业,也就是占据微笑曲线的两端—研发与服务,把利润越来越低的制造业务外包出去。这其实是IT乃至家电业顶级企业的宿命。

  IBM出售个人计算机业务,彻底完成了从制造业向服务业转型。而今天的惠普,实际上也不是门外汉理解的纯粹制造业企业,它早已不是简单卖PC和服务器,而是在卖解决方案了。今年早些时候,我了解到,广州供电局在用惠普的“容灾/业务连续系统”,这个方案是个包括硬件和软件的一揽子供电管理方案。据称,惠普的这个解决方案,已经在全球供电系统中占据了相当高的市场份额。表象是惠普在PC行业继续缠斗,一个后台事实是,惠普早就在发展它的新兴业务,走着当年IBM走过的路—高智能、高附加值的服务业正在成长,一旦服务收入占到总营收的50%以上,惠普可能就要考虑出售PC业务了。

  IT企业的宿命就是如此,做顶级品牌,最后必然是把业务延伸到微笑曲线的两端,把中间的制造业务外包给代工企业。

  从战略上说,杨元庆是对的,看到了这个IT宿命。但是,要完成这个转型,让大象起舞,需要文化支持,需要技术积累,需要战略统御。而联想恰恰是一个无文化、无战略、无技术的“三无”企业。

  国际市场受挫

  最要命的是,杨元庆的IT服务与郭为的神州数码业务全面冲突。

  柳传志解决这种业务冲突的手法简洁、雷厉风行:杨元庆旗下的研究院、IT服务业全部剥离,收购IBM的PC业务,回归硬件供应商、PC制造商身份。

  如果仅仅从国际市场开发角度说,收购IBM的PC业务是非常对路的。联想收购IBM的PC业务,并不是有什么值钱的实物资产,联想收购的实际上最重要的是一个国际化的经营平台,是一个全球市场渠道,还有一个享誉全球的thinkpad子品牌。问题仅仅在于,在IBM平台上销售联想产品,国际市场上的消费者是否认同,联想能不能用好这个平台?

  联想今天的困境在于,它不得不用国内市场攫取的利润去供养昂贵的原IBM平台。而国际市场的开发,倒过来威胁国内市场。国内消费者发现,原来民族企业在价格上是歧视自己的国民、自己的同胞的。

  近年来,联想电脑在技术、质量、价格和售后服务等等方面也经常受到国内消费者指责。

  国际市场受挫,需要国内市场提供更多的利润;而要国内市场产生更多利润,则可能引发更多的反弹。联想的供血机制似乎越来越脆弱。

  联想正在为自己打造新的造血机制,包括:参与家电下乡计划,贷款收购巴西PC企业,国内A股上市等等,可以预见,联想的每一个举措,都会成为舆论关注的热点话题。

  个人烙印严重

  毫无疑问,联想这家企业深深地打上了柳传志的个人印记,联想的企业性格与柳传志的个人性格非常一致。柳传志与牛根生类似的地方是,过分自信,把个人与企业的成功归因于自己的天赋与能力。柳传志、牛根生当然都是非常优秀的企业家,他们的优秀之处在于,他们成功地找到了在中国这个特色市场做大做强的真谛。但过犹不及,中国的成功之道不能复制到国门之外。

  比如,联想的重组费用与其他一次性支出,翻译成普通读者能看懂的语言,实质主要就是指裁员成本。4年前联想的“结构性裁员”也就是数千万元人民币打发了事。而此次国际性裁员,却产生一亿多美元裁员成本。

  任何产业都逃不出这一产业规律:一个产业越是成熟,它的利润率就越低。PC产业更是如此。当攒机简单到接插件加螺丝刀之后,一个已经没有技术门槛、资本门槛、渠道门槛的行业,凭什么保持高额利润?

  联想的未来是什么,有什么好的解决之道,我不想多说。但可以预测一下它的股价。现在,它在香港股市的价格是每股3.09港元,我预测,2009年内,它将进入“仙股”行列。

 

 

-----------------end----------------------

联想买到的原来ibm的pc销售平台,本身就是一个巨大的无底洞,再加上这些年thinkpad在世界很多地方都是每况愈下,维持这个平台的消耗只能来自中国大陆地区的销售。而大陆区推出的产品价格越来越高 质量却越来越烂。
说白了联想除了拿到ibm的pc平台,还是那个无文化,无技术,无战略的三无公司。pc产业的利润只能越来越低,因为产业越来越成熟,而联想希望抓住研发和服务两个大头的梦想,遥不可及。 pc业还没有完全触底,联想必然继续亏损。

07 February

新年快乐 之一:工作学习篇--待价而沽

告别了传说中的本命年,本着不信邪的宗旨未着一丝红色磕磕碰碰的度过了这一年。回顾过去的一年是从没头没脑到牢骚满天工作的一年,是从得过且过回到得过且过生活的一年,是从纯情大学生到准投机者的一年,是结束一种生活方式到开始一种新生活方式的一年,总结为各种的一年。
 
若是做下流水帐记录倒不如将年终总结鼓捣上来,没甚价值,记录下所得吧。从之前积极工作优秀青年到如今见活就闪的老油条,此间leimin老师功不可没,没有他整日催促isc服务器的维护,倒不会使小生转型这么快,再加上徐core的整日财务处事宜,建设银行项目包揽作者到搬运工工作,科委项目的大小巨细,lenovo不放假的恐吓等等~~这些线索都指向了真相:哥累了,哥们不干了。话说哥们干好了也就那可怜的几百块钱,干坏了也是那几百块;干好了老板收益跟lenovo关系++,干坏了我挨批。跟同宿舍诸君比较,小菜薪金是某2.x倍,昕是某1.5倍每周4天工作制~~好吧其实就是我最低最累。仔细想想真不够聪明,于是,顿悟了---我走后管他洪水滔天。
至于所得,无非是所谓的增强了专业技能,但是在这种项目驱动环境下,真正学到的是其他技术工人一两个月乃至半年也能学会的东西,核心竞争力没有半点提升。嗯,厚着脸皮忽悠人的实力有很大提高。实验室的诸君也都非CS出身,这一年除了身体状况有所下降,恐怕,项目所得是少之又少了。唯一欣慰的是趁工作不忙的时候拿下了DB2的某证,以及SCJP的机会。来年干掉它。
主动有目的学习自己需要的东西才是有意义的,术业要有专攻,学的太多太杂决然不是一个好的趋势,老子曰:以有涯随无涯,殆矣。
list下今年开发涉及的领域,看明年会忘记多少:j2se,j2ee,XML,c under linux,c under windows,c++ under wince.由衷称赞一下自己竟然被这么多玩意玩弄过。
ASM,OS kernel,Security~~再见。理想粉碎,当年的半吊子Hacker转眼被泡制成了蹩脚程序员等待为害某些不开眼的企业,感谢professor XU & Doctor ZHANG & 北京科委&LENOVO。不过国内业界实在没有什么开眼的企业,大都因人成事的龙套角色,创造和制造之间的差别不是一星半点。
 
到了展望明天的时候了:一个理想做爱做的事,也许会混上个doctor的头衔,但是实在不希望是在ISC-BUPT。
冷,起驾御舒床,装模作样读明史,俺还是个文人捏。
 
预告下明天的节目
生活家庭篇--动心忍性,曾益所不能
08 October

泪流满面

写下这个题目,估计是会被鄙视矫情的。豁出去无视之,本来是在熬夜写那恶心人的设计,没有感觉,在没动手写代码之前,实在不敢说自己写的这些东西的合理性和可行性。
这个十一,应该说是过的相当开心的。因为小兔前来骚扰,带她满北京城乱转,感觉是相当温馨的。期间没怎么说正事,我们之间这点事情可能大都在回避吧,因为都对未来不是很确定,就业~的确是件折磨人的事情。跟她商量了一下她考博的事情,确实,如果真的可以到北京读的话一切倒容易解决了,但是,事实可能这么顺利么?的确是我即将要做的最没把握的事情了,对她来讲也是在同时进行两场赌博,她本可以毕业就找一工作,安安稳稳的生活下去的,我这样可能会害了她吧。她离开之后的那天下午,一直在想这个问题。
现在的心境还是跟ls这些已经工作的心境不一样的,称之为未经社会磨练的幼稚吧。自我膨胀依然,听了ls的“选一个好媳妇少奋斗十年”颇有些不服气,的确,那样的选择会给自己带来很大好处,但是本人本质上还是想体现一下大男子主义,给人保护的,想找一个可供保护的对象满足一下自己可耻的虚荣心,所以准备投身于“选一个好老公少奋斗n年”理论的验证中,这也许是新的奋斗动力了吧。
 
I JUST CAN'T WAIT TO BE KING
 
25 July

0!=null

建设银行的事情在死灰复燃之后终于又要被某些物事浇灭了。10w总收入落在手里的大约有500吧,刘楠跟笋师兄说的好,我们是来锻炼的。也真是好一个锻炼的~~ 又想发牢骚却发现之前的牢骚已经不少了,还好还好,让上来写space已经说明是比较解脱了,再长舌反而显得没度量,工作的事情就此打住。
其实勾搭我写点东西的是今天跟我的某著名粉丝zyu同学的对话,一段缠绵悱恻匪夷所思的对话,导致我又要重新审视下自己的所作所为,失落了~现在还玩之前的老游戏似乎有些过时,游戏的对象也少了当时的肆无忌惮,不可否认的已经过了那般年龄,下一步,等待一枝花的年龄吧
-----------------经过一系列的扯淡聊天,想说的已经不知道是什么了,来口酸橙汁,祭奠我曾经的光辉岁月
好好的在某人爪牙庇护下可耻的度过豆腐渣时期等待焕发第二春吧
29 May

痴念

都什么时候了 还会梦到她,内容已然不记得了,失落还在~
梦里不知身是客,一晌贪欢
 
是为记