为什么GoLang解决scheme比同等的Java解决scheme更快?

最近在工作中,我们玩弄了IBM提出的以下测验问题https://www.research.ibm.com/haifa/ponderthis/challenges/May2015.html 经过一番努力,一位同事和我已经到了两个解决scheme,一个在GoLang https://gist.github.com/walesey/e2427c28a859c4f7bc920c9af2858492#file-main-go-L57 ,另一个在Java https:// gist。 github.com/boyter/42df7f203c0932e37980f7974c017ec5#file-puzzle-java-L63与在Java中的playGames和GoLang中的游戏(都在上面链接)中的性能关键方法。 Go程序几乎是Java的一个文本副本,但其运行时间约为6秒,而Java程序约为26秒(在本地机器上)。 Go程序的速度大约快了5倍,在其他一些机器上也复制了类似的数字。 Go程序是使用1.7.5版本和Java 1.8.0_65版本在MacOS Sierra 10.12.3上运行的,后者在2013年末的视网膜MacBook Pro上搭配2.6GHz i5 CPU。 为什么Go程序比Java程序快5倍,当大多数基准testing都表明Java应该运行在同一个运行时? 这只是一个循环中的基本math,所以它似乎应该在同一时间运行。 对于JVM的启动时间,我可以理解大概一秒左右,但是这似乎没有关系。 两个程序几乎都使用相同的循环。 游戏结果的所有可能的排列被创build并迭代每个开始的金额。 看起来,对于围绕Java运行的Go循环中的任何循环操作而言,似乎都是如此。 我知道这是一个“微观”基准testing,但是我想知道为什么Go代码大大优于Java代码。 只是简单的循环/math是更有效的,因此更快? 它能否展开循环(虽然这似乎不太可能产生如此巨大的差异)? 如果不是,你应该如何构build一个Java程序来获得最简单的循环和math运算的性能? 编辑 – 感谢Dolda2000我已经修改了Java版本。 现在和GoLang版本的速度差不多。 事实上,问题在于游戏的创build导致Java版本必须模拟更多游戏来确定游戏是否足够长。 随着这些变化,现在运行了大约6秒钟,并恢复了我对Java的信心。 更新 – 这是一个扩展的文章 ,进一步详细讨论了这个问题的背景。

我应该在一个真正的项目上使用Mono吗?

有没有人使用Mono,一个大型或中型项目的开源.NET实现? 我想知道它是否适合现实世界的生产环境。 它稳定,快速,兼容,…足够使用? 将项目移植到Mono运行时需要花费很多精力,还是真的兼容到只运行已经编写的Microsoft运行时代码?

Ruby语法

我在找BNF格式的Ruby语法。 有没有正式版本?

示例数据库练习

我想玩更大的数据库来testing我对SQL的知识。 有一个巨大的.sql在那里,我可以用来玩SQL查询?

Java系统属性的范围

在Java中,我们使用System.setProperty()方法来设置一些系统属性。 根据这篇文章 ,使用系统属性是有点棘手。 System.setProperty()可能是一个邪恶的电话。 这是100%的线程敌对 它包含超全局variables 当这些variables在运行时神秘地改变时,debugging是非常困难的。 我的问题如下。 系统属性的范围如何? 它们是特定于每个虚拟机,还是具有“超级全局性质”,在每个虚拟机实例上共享同一组属性? 我猜想选项1 是否有任何工具可用于监视运行时更改以检测系统属性中的更改。 (只是为了方便问题检测)

用Nant构build.NET 4项目

如何才能构build面向.NET 4.0 Framework的项目?

Controller在Spring MVC中的生命周期

Spring MVC中Controller的生命周期是什么? 控制器何时创build,何时销毁? 它在多个线程之间共享吗? 可以同时使用多个请求。

在PHP中的HTML编码

什么是PHP中的HTML编码最简单的方法?

MethodImplOptions.Synchronized是做什么的?

MethodImplOptions.Synchronized是做什么的? 是下面的代码 [MethodImpl(MethodImplOptions.Synchronized)] public void Method() { MethodImpl(); } 相当于 public void Method() { lock(this) { MethodImpl(); } }

UIKeyboardFrameBeginUserInfoKey&UIKeyboardFrameEndUserInfoKey

在“pipe理键盘” 文档中 : UIKeyboardFrameBeginUserInfoKey包含CGRect的NSValue对象的关键字,用于标识屏幕坐标中键盘的起始帧 。 由于界面方向的改变,这些坐标不考虑应用于窗口内容的任何旋转因子。 因此,在使用它之前,可能需要将矩形转换为窗口坐标(使用convertRect:fromWindow:方法)或查看坐标(使用convertRect:fromView:方法)。 UIKeyboardFrameEndUserInfoKey包含CGRect的NSValue对象的关键字,用于标识屏幕坐标中键盘的结束帧 。 由于界面方向的改变,这些坐标不考虑应用于窗口内容的任何旋转因子。 因此,在使用它之前,可能需要将矩形转换为窗口坐标(使用convertRect:fromWindow:方法)或查看坐标(使用convertRect:fromView:方法)。 start frame和end frame的含义是什么? 他们有什么区别?