Hello World
Spiga

你的字典里有多少元素?

2014-07-12 23:42 by 老赵, 6519 visits
摘要:“字典”或者说“哈希表”大家都会用,这真是一个好东西,只要创建了之后就可以不断的丢东西进去,添加删除都是O(1)操作,那叫一个快字了得。不过这里我要再次引用Alan Perlis的名言:“Lisp programmers know the value of everything but the cost of nothing.”,目的是想提醒做事“不要忘记背后的代价”。那么它的代价是什么呢?这里的代价主要是其内存开销。 阅读全文

逆泛型执行器

2014-05-28 23:25 by 老赵, 3860 visits
摘要:话说微信公众账号上的第一期有奖征答活动发布至今已有两周时间,不过参与人数寥寥,是太难,还是奖品不够吸引人?大家要多参与,我们才能长期互动嘛。现在我就对第一期的题目“逆泛型执行器”进行简单讲解吧,其实这题很简单,以后类似难度的题目可能会放在“快速问答”环节中。话说第一期的快速问答还在进行之中,大家加油。 阅读全文

.NET程序性能的基本要领

2014-05-14 22:18 by 老赵, 7032 visits
摘要:说起Roslyn大家肯定都已经有所耳闻了,这是下一代C#和VB.NET的编译器实现。Roslyn使用纯托管代码开发,但性能超过之前使用C++编写的原生实现。Bill Chiles是Roslyn的PM(程序经理,Program Manager),他最近写了一篇文章叫做《Essential Performance Facts and .NET Framework Tips》,其中总结了几条经验。 阅读全文

在香港生活的初步感受

2013-09-02 10:23 by 老赵, 32328 visits
摘要:好久没有更新博客了,主要是生活产生了一些变化。我这人比较没出息,生活稳定的时候,不论是工作和学习都会有条不紊,但一旦有所动荡,则就会心神不宁,啥事都做不进去,效率也一落千丈,比如Coursera上的基本课程也拉下了。相信不少同学都知道我当年去IBM深圳的主要原因之一,就是看重这是个和JPMC的合作项目,两年后有机会可以去香港。现在已经在香港租好了房子,离完全布置好还有一段距离,先记录一下最近在香港生活的一些感受吧。 阅读全文

比较下中国大陆和香港之间的个税差异

2013-07-06 11:40 by 老赵, 27662 visits
摘要:一直听说中国大陆个税税率之高,但一直没有跟哪儿作过比较。最近听说香港的税率很低,因此也想具体比较一下到底会差多少。单从数字上看,两者简直天差地远。例如,同样是累进税率,大陆从月入8K开始的部分就要缴纳20%的税率,超过38.5K则是30%,而香港最高也就只有17%。当然,比如香港租房之贵也遥遥领先于大陆一线城市,但房租亦可作为征税前的减免。正因为如此复杂,我们还是需要进行详细的计算才能有直观的概念,这里我就来尝试一下。这里以一对夫妻为例,但只计算其中一人的薪资,以传说中阿里P8级别的上限:月入5w人民币(年入60w),即月入6.25w港币(年入75w)为标准。当然,这只是对我比较有参考意义的数字,您也可以根据自己的标准来重新计算。 阅读全文

抓取InfoQ内容的calibre脚本

2013-06-30 23:11 by 老赵, 6154 visits
摘要:两个礼拜前我公开了一个抓取今年MSDN Magazine内容的calibre脚本,这次则是针对InfoQ的。最近用Kindle Paperwhite看书一发不可收拾,自然想要更好地利用这个设备。InfoQ是一个难得的高质量站点,可惜它的RSS只输出摘要,甚至只有前十条内容,让人感到十分不方便。但这显然难不住calibre这个电子书管理神器和伟大的程序员,于是我这段时间又断断续续地编写了InfoQ站点内容的抓取脚本,各个方面细节感觉修饰地都还算不错,特此公布。至于这个脚本该怎么用,就请自行看下calibre的帮助吧。 阅读全文

使用calibre抓取2013年的MSDN Magazine

2013-06-18 23:11 by 老赵, 5390 visits
摘要:前段时间入手Kindle Paperwhite,这已经是我第三个Kindle设备了。想当年我花了四五千块钱,在亚马逊美国站上跟着老美预定,可谓是全世界第一批Kindle DX(大屏幕的那款阅读器)用户,不过用着用着后来还是去玩平板了。这次Kindle Paperwhite出了国行设备,才849元,顿觉实在是太便宜了,立即下单,第二天就拿到了这台设备。有了设备自然要用,除了官方书店里买的书以外,第三方的内容自然也必不可少,毕竟目前国内的Kindle电子书还太少(尤其是计算机方面的),还好之前也从国外买了不少mobi电子书,可以直接看。更重要的是,我发现可以使用calibre这个电子书管理神器来抓取网络上的内容,生成一本电子期刊,甚至可以利用亚马逊提供的邮箱推送服务来传送到Kindle设备上。第一个尝试的目标便是MSDN Magazine。 阅读全文

防止装箱落实到底,只做一半也是失败

2013-04-10 22:21 by 老赵, 6794 visits
摘要:.NET提供struct类型,正确使用可以减少对象数量,从而降低GC压力,提高性能。不过有时候我会发现,某些同学有这方面的意识,但是有时候一疏忽一偷懒,就没有得到相应的效果了。这里举一个真实的例子:假设我们要将一对int作为字典的键,用于映射到某些数据,那么你会怎么做?当然我们可以直接使用Tuple<int, int>,但这样就可能产生大量的对象。于是我们打算使用自定义的值类型,但简单这么做其实并不一定能满足我们的要求。 阅读全文

为什么我不喜欢Go语言式的接口(即Structural Typing)

2013-04-10 18:37 by 老赵, 7991 visits
摘要:所谓Go语言式的接口,就是不用显示声明类型T实现了接口I,只要类型T的公开方法完全满足接口I的要求,就可以把类型T的对象用在需要接口I的地方。这种做法的学名叫做Structural Typing,有人也把它看作是一种静态的Duck Typing。除了Go的接口以外,类似的东西也有比如Scala里的Traits等等。有人觉得这个特性很好,但我个人并不喜欢这种做法,所以在这里谈谈它的缺点。当然这跟动态语言静态语言的讨论类似,不能简单粗暴的下一个“好”或“不好”的结论。 阅读全文

为什么我认为goroutine和channel是把别的平台上类库的功能内置在语言里

2013-04-09 13:52 by 老赵, 5774 visits
摘要:这几天看了《Go语言编程》这本书,感觉一般,具体可见发表在图灵社区里的书评。书评里面我提到“Go语言的goroutine和channel其实是把别的语言/平台上类库的功能内置到语言里”,这句话当然单单这么说出来是没什么价值的,于是我也就趁热把它说得再详细一些。我的看法简而言之是:由goroutine和channel所带来的主要编程范式、设计思路等等,其实基本都可以在其他一些平台中配合特定的类库来实现。 阅读全文

如何在不装箱的前提下调用“显式”实现的接口方法?(答案)

2013-04-07 13:51 by 老赵, 2421 visits
摘要:其实已经有不少同学抓住了关键,那就是使用泛型,不过有些同学提出Dispose<T>(T obj) where T : IDisposable这样的做法。我们没有进行类型转化,只是让运行时可以“认识到”类型T实现了IDisposable接口,这自然可以在不装箱的情况下调用其成员。可惜的是,这种做法的“意识”到位了,却是错误的,原因在于忽视了值类型传参的特点:复制所有内容。换句话说,这个辅助方法内部所使用的obj其实是一个副本,而不是原来的参数对象。假如被调用的成员会修改自身状态——尽管这对于值类型来说是一种极差的设计——这便会产生问题,所以正确的方法应该使用ref关键字来修饰参数。 阅读全文

如何在不装箱的前提下调用“显式实现”的接口方法?

2013-03-24 21:45 by 老赵, 2324 visits
摘要:上篇文章谈了针对一个struct对象使用using语句的时候是否会装箱的问题,结论是“不会”。尽管using语句是针对IDisposable接口的,但我们在调用的时候其实已经明确了目标方法,因此根本不需要装箱(或查找虚函数表)了。后来有同学在微博上提出,这点在《CLR via C#》这本书里提到过,于是我去翻了翻,表示这跟前一篇谈的内容其实并没有太多联系。不过这也引出了一个问题,假如一个struct类型显式实现了一个接口,您有什么办法在C#里调用这个接口方法呢?当然,调用时不能在堆上产生任何对象。 阅读全文

针对struct对象使用using关键字是否会引起装箱?

2013-03-22 00:06 by 老赵, 2854 visits
摘要:说起来这是个很简单的问题,我以前肯定可以给出确切地答复,但是前几天想到这点的时候突然楞住了。把这个问题发到微博上去之后,很多人说是“会”,但要么是猜的,或是给出的原因明显不靠谱。最后我只能自己简单研究一下了,最后得到的结果是“不会”装箱。请注意,这个问题是指,对于一个实现了IDisposable接口的值类型对象使用using语句,而不是将它直接复制给一个IDisposable引用——后者显然是会装箱的,会对性能产生一定负面影响。 阅读全文

串与绳(1):.NET与Java里的String类型

2013-03-12 23:29 by 老赵, 5634 visits
摘要:话说“字符串”是我们平时最常用的数据类型之一,它表示一个字符序列。在大部分的语言中,字符串还是一个不可变(Immutable)的数据类型。“不可变”意味着要改变则只能生成新的字符串,无论是连接两个字符串,获取或是替换字符串的一部分,这对于内存和CPU都是不可避免的开销。在一般情况下,只要使用合理这些开销都不会构成大问题。不过对于某些类型的应用,例如我前段时间在工作中涉及到的编辑器(IDE那种),就会带来较多麻烦,于是便用到了一个名为Rope的数据结构。Rope其实是一种很简单,很符合直觉的树状数据结构,也常用于表达一个字符序列,不过更适合需要大量修改的场景。不过,我们还是先来回顾一下.NET与Java中的String类型吧。 阅读全文

Everpage:将Evernote的笔记展现在页面上

2013-03-07 01:00 by 老赵, 6737 visits
摘要:我这人尤其强调阅读体验,无论是作为文章的读者还是作者。假如遇到一篇格式糟糕的文章,我会完全没有耐心读完它。因此对于阅读工具的展现格式也是各种挑剔,例如字不能太小,内容不能太宽或太窄,段落间距必须大过行间距等等,例如OS X上著名的RSS阅读器Reeder无法自定义样式,我甚至钻进其App内部修改其CSS文件。Evernote也是一样,无论是其网页版还是客户端,其阅读体验在我看来都比较糟糕,于是我在愤而花了差不多半天的时间打造了Everpage这个小玩意儿。简单来说,就是把一篇Evernote笔记显示在页面上。 阅读全文

真是O(1)吗?想清楚了没?

2013-01-18 11:21 by 老赵, 7264 visits
摘要:话说写程序的时候我们会用到各种数据结构,但十有八九不会由我们自己从头写起,都会直接拿来用。于是很多人就会记住,譬如HashMap或Dictionary的存取是O(1)的操作,二分查找什么的则是O(log(N))。不过,我们在实践中直接把这些类拿来用的时候,最好也留个心眼,知道这些类内部到底做了些什么,为什么它们能够达到O(1)之类的时间复杂度。我们在了解“理论”的同时也需要注意实践上的细节,例如,其实在实践中O(log(N))其实也是个不比O(1)大多少的时间复杂度,此时可能也需要考虑下“常数”会对性能造成多大影响。 阅读全文

一个最基本的HashedLinkedList

2013-01-07 23:52 by 老赵, 2505 visits
摘要:Tmc的初衷是补充一些常用的数据结构,例如对null作为字典键的支持,以及带有一个额外Remove方法的HashDictionary。但是,其实我创建Tmc项目的“初衷”却是HashedLinkedList。.NET BCL中已经有一个LinkedList,这是一个双向链表。说起来,我之前在面试中经常会提出一系列数据结构的基础问题,其中便包含LinkedList,我会问各个操作的时间复杂度,以及如何改进它们。例如,如何将它的Remove操作优化成O(1)的时间复杂度?最容易想到的做法便是使用一个字典来记录元素到特定LinkedListNode的映射关系。这种模式实在过于常见,所以便有了个特别的名称,叫做HashedLinkedList。 阅读全文

阅读.NET源代码那些事

2013-01-06 16:32 by 老赵, 10252 visits
摘要:谁都知道.NET(的大部分组件)是不开源的,但是我不止在一个场合不止一次地强调过,“不开源”不代表你没法看代码,不代表你没法知道里面发生了什么。这里我不是在说.NET Reflector或是ILSpy这类反编译工具,当然它们在平时开发中也起到了很大的作用,不过很多时候更直接的方式便是阅读代码本身,尤其是当你像我一样时不时要“抄”点代码的时候。由于最近我在Tmc中“大张旗鼓”地使用.NET中BCL的代码,因此也再次强调一下这部分经验。 阅读全文

NullableKey:解决Dictionary中键不能为null的问题

2012-12-29 02:26 by 老赵, 3021 visits
摘要:众所周知,.NET中Dictionary的键不能为null,否则会抛出NullReferenceException,这在某些时候会显的很麻烦。与此相对的是Java中的HashMap支持以null为键,则方便许多。尽管null的确不是个好东西,但它既然已经存在,既然给我们造成了麻烦,我们就要想办法去解决它。实现一个自己的字典类自然可行,但要精心实现一个高效的字典并不是件容易的事情,例如BCL中的Dictionary.cs就有超过2000行代码。此外另一个容易想到的方法便是实现IDictionary接口,将大部分实现委托给现成的Dictionary类来完成。不过,这相比我在这里要提出的方法还是显得太复杂了。 阅读全文

不同泛型参数区分的独立类型

2012-12-03 23:11 by 老赵, 2945 visits
摘要:相对于的Java的“类型擦除”来说,.NET中的泛型可谓是真正的泛型,这让我们可以有能力区分运行时所使用的不同的具体类型,大大增强了程序设计的性能和表现能力。谁会希望如Java一样,在找出符合条件的一万个int数值的时候,必须额外创建一万个Integer对象,导致堆上增加几百上千K的空间,还有一万个对象带来的GC压力?在运行过程中,.NET运行时会(在第一次使用时)为不同的值类型创建一份不同的代码,而让所有的引用类型共享同一份代码。不过无论执行的代码是否共享,不同具体类型参数的类型都是各自独立的,它们各有各的元数据,各有各的需方法表等等,因此它们的静态成员也是各自独立的。 阅读全文
1 2 3 4 5 6 7 8 9 ... 31 Next >
使用Live Messenger联系我