Hello World
Spiga

归档:2010年01月

数组排序方法的性能比较(5):对象大小与排序性能

2010-01-29 00:09 by 老赵, 7038 visits
摘要:在我公开测试结果之后,有朋友也进行了其他测试。在测试中我使用的是int数组,经过分析之后我们了解到Array.Sort对于int数组有特殊的优化。于是,某些朋友使用了一些引用类型的数组进行排序,得到Array.Sort方法的性能落后于LINQ排序——虽然由于测试方式的问题,这个结果和结论都不太妥当。不过在讨论的过程中,我们都意识到了一个问题:在其他条件不变的情况下,引用类型的字段越多,Array.Sort方法所需时间就越久。这次我们就来讨论一下这个问题。 阅读全文

数组排序方法的性能比较(4):LINQ方式的Array排序

2010-01-28 00:06 by 老赵, 6998 visits
摘要:经过前两篇文章的分析,我们已经了解了Array.Sort与LINQ排序两种实现方式的差别:前者直接比较两个元素的大小,而后者先选出每个元素的“排序依据”再进行比较。因此,虽然后者需要相对较多的“周边工作”,但由于每次比较时都可以仅仅使用高效的基础类型(如int),因此从整体来看,两者的性能高低难以辨别。不过,既然我们已经了解LINQ排序“高效”的原因,又能否将其利用在数组排序上呢?程序是人写的,此类问题大都有肯定的答案。那么我们现在就来实现一下。 阅读全文

数组排序方法的性能比较(3):LINQ排序实现分析

2010-01-27 00:02 by 老赵, 10033 visits
摘要:上次我们分析了Array.Sort方法的实现方式,并了解到类库会为一些特例而使用高性能的排序方式——int数组便是这样一例,因此从测试结果上来看其性能特别高。不过从数据上看,即便是在普通的情况下,Array.Sort的性能也比LINQ排序要高。不过也有朋友从测试中得出的结论正好相反,这又是为什么呢?那么现在,我们再来分析一下LINQ排序的实现方式吧,希望这样可以了解到两者性能差别的秘密。 阅读全文

人肉反编译使用yield关键字的方法

2010-01-26 00:06 by 老赵, 9772 visits
摘要:我认为这是一个真命题:“没有用.NET Reflector反编译并阅读过代码的程序员不是专业的.NET程序员”。.NET Reflector强大的地方就在于可以把IL代码反编译成可读性颇高的高级语言代码,并且能够支持相当多的“模式”,根据这些模式它可以在一定程度上把某些语法糖给还原,甚至可以支持简单的Lambda表达式和LINQ。只可惜,.NET Reflector还是无法做到极致,某些情况下生成的代码还是无法还原到易于理解——yield关键字便是这样一个典型的情况。不过还行,对于不复杂的逻辑,我们可以通过人肉来“整理”个大概。 阅读全文

昨日搬至办公室的书籍

2010-01-25 12:00 by 老赵, 9952 visits
摘要:由于家里地方小,总有一部分书籍需要跟着我辗转至各公司。其中一些公司只能让我放抽屉(地方小)甚至地板上,而有一些公司就能让我把书都摞桌子上。昨天下午我特地来了一次办公室搬运书籍。灭霍霍,可真是一个体力活。 阅读全文

土人眼中的差距:That’s Why I Chose Yale

2010-01-24 22:10 by 老赵, 10622 visits
摘要:上周五中午我看了一个视频:That's Why I Chose Yale(我选择耶鲁大学的原因),是由耶鲁大学的学生自导自演自己拍摄、剪辑的短片。这部短片直接就把我看哭了——好吧,还差一点点,但是其中的震撼是难以描绘的,建议您一定要自己体会一下。震撼源于各方面的差距,同样是大学,同样是大学生,为什么差距就那么大呢?而且,这几乎已经是我无法去弥补的差距了,因此遗憾,因此震撼。 阅读全文

数组排序方法的性能比较(2):Array.Sort<T>实现分析

2010-01-22 00:06 by 老赵, 10245 visits
摘要:昨天我们比较了Array.Sort方法与LINQ排序的性能,知道了LINQ排序的性能以较大幅度落后于Array.Sort方法。而对于Array.Sort来说,性能最高的是其中使用Comparer.Default作为比较器的重载方法。在前文的末尾我们做出了推测:由于排序算法已经近乎一个标准了(快速排序),因此从算法角度来说,Array.Sort方法和LINQ排序上不应该有那么大的差距,因此造成两者性能差异的原因,应该是具体实现方式上的问题。 阅读全文

数组排序方法的性能比较(1):注意事项及试验

2010-01-21 00:11 by 老赵, 9353 visits
摘要:昨天有朋友写了一篇文章,其中比较了List的Sort方法与LINQ中排序方法的性能,而最终得到的结果是“LINQ排序方法性能高于List.Sort方法”。这个结果不禁让我很疑惑。因为List.Sort方法是改变容器内部元素的顺序,而LINQ排序后得到的是一个新的序列。假如两个排序方法的算法完全一致,LINQ排序也比对方多出元素复制的开销,为什么性能反而会高?如果LINQ排序的算法/实现更为优秀,那为什么.NET Fx不将List.Sort也一并优化一下呢?于是今天我也对这个问题进行了简单的试验。 阅读全文

今日入职盛大创新院

2010-01-19 19:07 by 老赵, 28261 visits
摘要:在去年年底的总结中,我谈到放弃所谓的创业,想要加入一家国内的大公司安心发展技术,正所谓“打怪升级”。不过,其实在写完文章不久之后(大约数个小时),我就收到了盛大创新院给我的offer。在家休息了整整两周时间后,今天我终于入职了,因此我现在终于有了个颇为响亮的头衔。好吧,当然这不是关键,当然这终究让我梦想中“搞研究”的心理小小地满足了一把。 阅读全文

浅谈代码的执行效率(4):汇编优化

2010-01-14 00:08 by 老赵, 10979 visits
摘要:终于谈到这个话题了,首先声明我不是汇编优化的高手,甚至于我知道的所有关于汇编优化的内容,仅仅来自于学校的课程、书本及当年做过的一些简单练习。换句话说,我了解的东西只能算是一些原则,甚至也有一些“陈旧”了——不过我想既然是一些原则性的东西,还是能够用它来做一定程度的判断。至少我认为,我在博客园里看到的许多关于“汇编优化”也好,“内嵌汇编”也罢的说法,经常是有些问题的。 阅读全文

京沪两地Scrum实战营(免费,上海1月23日,北京1月30日)

2010-01-13 18:26 by 老赵, 5591 visits
摘要:种种迹象表明,Scrum已经在很多公司得到实施。同时,不争的事实是很多开发人员和团队在实施过程中也遇到了各种各样的问题,包括对Scrum方法本身的认识、辅助实施工具的使用等等。有关Scrum应用和实施的各种问题也在InfoQ网站和其他网站上被广泛讨论和争论。等等这些,组成了我们要举办这次Scrum实战营的基础。我们希望通过这次活动帮助正在进行敏捷实施、Scrum实施的团队更加清晰地理解Scrum,并将其他人的有效经验借鉴到自己的团队中来。本次活动由InfoQ中文站、雅各布森软件(北京)有限公司、微软中国有限公司共同举办,我们期待您的参与! 阅读全文

浅谈代码的执行效率(3):缓存与局部性

2010-01-12 00:03 by 老赵, 11300 visits
摘要:在前两篇文章里,我们讨论了程序性能的两个方面,一是算法(广义的算法,即解决问题的方法),二是编译器。通过这两个方面,我想表达的意思是,一段程序的执行效率,是很难从表面现象得出结论的,至少从一些简单的层面,如代码的长度是几乎难以说明任何问题——因此一定要进行Profiling才能做到有效的优化。而现在,我们假设两段程序算法基本相同,编译器也只是进行简单的“翻译”,那么……我们能从“表面”看出性能高下吗? 阅读全文

按月统计博客园单个用户的发文数量

2010-01-11 00:07 by 老赵, 7471 visits
摘要:这几天在家闲着,便试着写一些小程序。之前有朋友问到“F#能不能写Web”,于是我也就打算这么一试。虽然我能肯定,用F#写Web应用程序不会是问题,不过倒真还没有做过这方面的尝试。我想,如果用F#写Web应用程序,那么它很重要的一点,应该是利用其在异步编程方面的强大特性。最后我决定,使用F#编写一个按月统计博客园单个用户发文数量的简单服务。尝试的结果是——还有些问题没有解决。不管怎么样,我先把其主体逻辑描述一下吧。 阅读全文

浅谈代码的执行效率(2):编译器的威力

2010-01-08 00:06 by 老赵, 11777 visits
摘要:在上一篇文章中,我主要表达了这样一个观点:影响程序效率的关键之一是算法,而算法的选择与优化,和是否多一个赋值少一个判断的关系不大。关于算法的选择,我谈到其理论上的复杂度,并不直接反映出效率。因为在实际运用时,数据的规模,形式等等都会涉及到算法的实际效用。一个时间复杂度低的算法并不代表任何情况下的效率都高。这是“实际”和“理论”的区别之一。现在我打算来谈一下另一个比较“实际”的东西:编译器对于程序效率的影响。 阅读全文

浅谈代码的执行效率(1):算法是关键

2010-01-07 17:14 by 老赵, 14451 visits
摘要:前一段时间在博客园里看到这样一篇文章,那位兄弟谈到程序效率的关键是“简短”。他说,“程序越简短,其可执行代码就越少,就越有效率”,而在编写程序的时候,“要尽量改进我们的算法,而改进算法中最重要的一条,就是减少语句”。这句话从表面上似乎正确,但我认为性能这问题不能用“简短”这种方式去思考,否则会进入一些误区。我整理了一下思路,希望可以从几个方面把详细谈一下这个问题。首先我想说的是:“简短”不是关键,“算法”更加重要。 阅读全文

AV不识爱卖克,便看三弟也枉然

2010-01-07 10:39 by 老赵, 7913 visits
摘要:阿凡达,已然无人不知无人不晓。江湖流传:“AV不识爱卖克,就看三弟也枉然”。此处AV自然指的就是Avatar,这句话意思是说,如果你没有看iMax的阿凡达,就算是看了3D版也等于没看过。因此,对于全国只有11块的iMax屏幕,大家自然就是疯抢了。而上海这边,只有位于人民广场的和平影都有这条件,试想全上海有这想法的人都涌到同一个地方,抢这个每日一千多(350 * 4场)人次的机会……是什么景象。 阅读全文

一次批量修改博客文章的经验(下):操作过程

2010-01-05 19:40 by 老赵, 5505 visits
摘要:上一篇文章中我们进行了一些预备工作,主要是了解了该如何使用MetaWeblog API读取和修改博客园的文章——包括同步和异步两种调用方式。此外,由于F#在异步调用方面的优势,我决定使用F#来完成批量修改文章任务。这个任务并不困难,但很“危险”,一旦出错可能之前的文章就无法恢复了。因此,我把这个任务拆成多个步骤,每个步骤都会将数据保存在硬盘上。由此,即便出错,还是有挽回的余地。 阅读全文

一次批量修改博客文章的经验(上):准备工作

2010-01-04 18:57 by 老赵, 6540 visits
摘要:这几天赋闲在家,除了看书和还债(如RSS订阅),终于把一直以来想做却拖着的事情完成了:批量去除博客文章段首的空格。这个过程并不难,只需要按部就班地去做就行了,一切资料都可以在互联网上搜索到。不过我还是打算记录一下,也是为了今后再做类似工作时有个参考,少走一些弯路。 阅读全文

F#中的XML序列化

2010-01-03 21:24 by 老赵, 6515 visits
摘要:这两天在用F#写一小段代码,需要把一些对象存到外部文件中去。这个功能很容易,因为.NET本身就内置了序列化功能。方便起见,我打算将这个对象序列化成XML而不是二进制数据流。这意味着我需要使用XmlSerializer而不是BinaryFormatter。这本应没有问题,但是在使用时候还是发生了一些小插曲。 阅读全文
1
使用Live Messenger联系我