Tag Archives: Loop Recognition in C++/Java/Go/Scala

招聘程序员、《北京沉没》和Go语言性能

  先转发一篇招聘,我的朋友在做云计算方面的创业,招Flex/Erlang/Python程序员。工作地点在北京,有兴趣的人可以点进去看一看

  5、6月BLOG更新频率明显变慢了,有人问我是不是开始玩微博了,还有人问是不是在准备跳槽。都不是,最近公私事都有些忙,懈怠了,不好意思。另外随着年龄变老,似乎越来越倾向更长篇幅的写作,零碎的想法大多懒得动手敲(记得科学松鼠会上翻译过一篇报道,研究人员发现年龄和写作博客的长度成正比,没搜索到链接)。还是该放松点儿,有长则长,可短就短。只要写出来,总会有价值。

  前两天北京下大雨内涝。豆瓣上马上出现了一篇与此有关的小说《北京沉没》,得到众多推荐,大家都在殷切等待小说的后续情节。

  关于编程语言的性能向来是个大水坑,有诸多争论。前不久,Google公司的Robert Hundt刚刚发表了一篇论文 Loop Recognition in C++/Java/Go/Scala.,,发布了一个简明而紧凑的Performance Benchmarks,分别对C++, Go, Java, Scala四种语言进行性能比较。测试包使用的loop finding算法实现中不涉及任何高级语言特性,只使用了各语言的基础设施:基本容器类、循环和选择、内存分配机制等。文中的主要结论是在32位系统下C++程序最快,常规条件下Java语言运行时间是C++程序的12.6倍,Go语言为7倍;相同的语言条件,不同实现效果差距很大,例如:C++语言如果采用一般教科书知识的“学生式”实现,会比有经验工程师精心优化后的结果慢8倍以上。而Java语言的主要瓶颈在于其内存回收机制,如果采用SPEC优化,则速度起码提高3倍,如果在64位系统下,性能比32位系统提高超过1倍。更多细节,大家可以直接看论文。

  论文对Google自己人发明的Go语言并没有太推崇,认为其性能还比不上C++,开发难度又高于Java。于是Go语言的团队来劲了,刚在官方BLOG上指出,Go语言版本的算法还有很大的优化余地。他们使用了Go开发包里提供的性能测试工具对代码进行了改善,运行速度提高了10倍以上,而申请的内存降低了6倍。

  这篇论文在其他语言社群内也掀起不少讨论。编程语言的性能比较往往涉及到很多因素(编程者的经验和风格,比较题目与不同语言的特性之间的契合等)。对于实际工程而言,选择编程语言的着眼点应该是现有资源和经验,并考虑混合编程。我个人在pFind项目的经验是,保守些,尽量利用团队内多数人熟悉的技术。如果项目负责人只顾着添经验追时髦,把手头的正事当作尝试新技术的小白鼠,十有八九要坏事。