Java圈“网红”之一的Gunnar Morling(TwitterBlog)在新年假期期间搞了一个“One Billion Rows Challenge”(Twitter话题:#1BRC)的活动,规则是编写一个程序读取10亿条CSV格式数据,根据每行第一列作为”主键“的字串计算相同”主键“下的所有浮点数数据的最小、最大和平均值,限Java,但编译器和运行时不限。具体规则位于这个挑战的代码库:https://github.com/gunnarmorling/1brc/

作为一个大概已经可以算“老而不死”的语言,憎恨Java的人估计能填满马里亚纳海沟。所以这边厢Java圈玩的很高兴,那边厢也有很多其他语言来做一样的挑战,甚至还有直接用duckdb的。这期间各个语言和平台都是各玩各的,从来没人捅破那层纸说“还是我们xxx最快”,虽然我估计私下或者内心戏是这行的人也不在少数,人之常情。

结果今天就碰见有人这么干了。以免触霉头就不引用他的blog了,发个Twitter就得了:

https://twitter.com/buybackoff/status/1746186851172433975

即使推主口气不善,出于怕错过什么的心态,我还是点进去他的blog拜读了。结论是没看到什么新鲜的——咱平时也算对性能优化感兴趣所以文章还是看了不少,确实也让我把印象里有过的知识点串了起来,云上手了一次。这位老哥的口气真是让人哭笑不得,一副”我的令郎“、”你的犬子“的口气,从blog到tweet全都一个样,还提到自己对.NET核心库的贡献,好像Anders来了也要让他三分而他也会给Anders几分薄面,因为语言是人家设计的但是性能都是这老哥提升的。

Java圈性能优化的大牛人有的是,也轮不到我和这位老哥争论。我想说的只是Java的1BRC成绩如何关你屁事?你的C#实现再好又关我屁事?

这当然不是什么负气的话,只是立场。

如果早十年还有点可能,到现在为止,.NET和Java这种平台之争基本到了一种选一条路就要一直走到黑的地步了,完全不可能两边完全精通,否则很可能两边都做的不怎么样。任何一方除了表面上的语言以外都又会有数不清的框架、核心库甚至常用模式和习俗的差别。就用这次1BRC让大家最直观看到的矢量化带来的性能提升这一点上,Java的矢量计算API一直都是缺失状态,最近几年从JDK16到21一直在孵化,到现在JDK22也还是第七版孵化状态而已(JEP-460),而.NET上AVX相关的API从很早以前就有了。但是只要从API层面上比较过,就能明白Java为什么是Java而.NET又为什么是.NET。我完全理解有人觉得Java对OOP到了入魔的程度,或者说OOP是Java的一个“包袱”——就连我对Java一些偏向OOP设计的地方也不是太喜欢。无论解读如何,API层面上,喜欢、习惯Java这套的人自然会习惯,而偏好.NET的也可能至少可以算是实用主义。我也看到过资深C#程序员感慨.NET API的纵深程度,而Java可能永远不会给用户那么多的API,更别提有时候会牺牲一部分跨平台能力。有人可能会说Java的Unsafe类才是1BRC里大放异彩的东西,事实是即使是这样,Java也仍然没有一个unsafe关键字,就连指针pin也都是早年JNI还流行的时候就已经“玩剩下”的了,如果Java阵营能接受的话,现在的矢量计算API八成也不会是这个样子,而且可能十年前就做出来了。

Java圈现在这个样子也很独特,无法复制——别人也不屑于复制我们这个“老不死”,也可以说每个语言平台都很独特,技术选型的时候也不会因为一个语言一个API的优异就无视这个平台的缺点。对于.NET,我还是忌惮微软的控制力——想当年我可是资深“软饭”/软粉,微软出什么新技术我都会第一时间搞来尝试的。纳德拉治下还算柔顺,但总给我一种虎嗅蔷薇的感觉,什么时候需要“重拳出击”赚点业绩或者搞搞股价了,也许广大.NET程序员愿意与否都要参与打群架。更不要说历史上做大的中间件总会被微软抄走,最后最安全的选择就是直接做应用做项目,当微软的客户和给微软介绍新的客户。Java这边就自由多了。

最后觉得要“捡起来”的东西太多了。