小编Ben*_*ter的帖子

为什么这个GoLang解决方案比同等的Java解决方案更快?

最近在工作中,我们正在讨论IBM提出的以下测验问题https://www.research.ibm.com/haifa/ponderthis/challenges/May2015.html

经过一段时间的努力,一位同事和我达成了两个解决方案,一个在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,两者都运行在2013年末带有2.6GHz i5 CPU的视网膜Macbook Pro上的macOS Sierra 10.12.3上.

为什么Go程序比Java程序快5倍,因为大多数基准测试表明Java应该在同一个运行时?它只是一个循环中的基本数学,所以看起来它们应该在大约相同的时间运行.我可以理解JVM启动时间的第二个左右,但这似乎是关闭的.

两个程序都使用几乎相同的循环.对于每个起始金额,创建并迭代所有可能的游戏结果排列.看来,对于主循环中的任意数量的循环操作,Go在Java周围运行环.

我知道这是一个"微观"基准测试,但我想知道为什么Go代码大大优于Java代码.Go for simple循环/数学是否更有效,因此更快?它是否能够展开循环(虽然这似乎不太可能产生如此巨大的差异)?

如果不是,您应该如何构建Java程序以从简单的循环和数学运算中获得最佳性能?

编辑 - 感谢Dolda2000我修改了Java版本.它现在与GoLang版本大致相同.事实上,问题在于游戏的创建导致Java版本必须模拟更多游戏以确定游戏是否足够长.随着变化,它现在运行大约6秒钟,并恢复了我对Java的信心.

更新 - 这是一篇扩展的文章,更详细地讨论了这个问题的背景.

java performance go

39
推荐指数
1
解决办法
3572
查看次数

Java如何删除已设置IMMUTABLE位的文件

在Java 8项目上工作,我从外部源复制文件.在其中一个源中,使用不可变位标志设置文件.

OSX中,这是这样设置的

sudo chflags schg /path/to/file
Run Code Online (Sandbox Code Playgroud)

Linux中

chattr +i /path/to/file
Run Code Online (Sandbox Code Playgroud)

我现在需要删除我复制的文件.我一直在使用Apache Commons IO来删除这样的目录,

FileUtils.deleteDirectory(new File("/path/here"));
Run Code Online (Sandbox Code Playgroud)

然而,这崩溃了java.io.IOException exception.

是否有任何跨平台方式删除这些文件?正在运行的进程是文件的所有者.

java

30
推荐指数
2
解决办法
1699
查看次数

使用 Go 通过自定义 io.Reader 确定性生成 RSA 私钥

由于可能最好不回答的原因,我需要生成无限的 RSA 公钥/私钥。请注意,这没有用于任何高度安全的事情,所以请不要告诉我不要这样做,是的,我知道它并不理想。我所说的“无限”是指我需要未知数量的它们,例如数十亿到数万亿,并且在使用之前创建它们是不可能的。

由于这会消耗无限的空间并需要无限的时间来生成,因此我需要在运行时执行此操作。

但是,对于给定的输入,我还需要具有相同的密钥对。这意味着我需要根据输入确定性地重新创建 RSA 密钥。

我正在使用 Go,通常您使用以下命令创建密钥,

k, err := rsa.GenerateKey(rand.Reader, 2048)
Run Code Online (Sandbox Code Playgroud)

当然,问题是rand.Readercrypto/rand,因此没有办法播种它。

我认为可以提供我自己的阅读器实现来实现我的目标。我查看了源代码GenerateKey并注意到它正在寻找素数,因此我实现了自己的阅读器,这样我就可以控制返回的“随机”素数,从而允许我在需要时生成相同的密钥,

type Reader struct {
    data   []byte
    sum    int
    primes []int
}

func NewReader(toRead string) *Reader {
    primes := sieveOfEratosthenes(10_000_000)
    return &Reader{[]byte(toRead), 0, primes}
}

func (r *Reader) Read(p []byte) (n int, err error) {
    r.sum = r.sum + 1

    if r.sum >= 100_000 {
        return r.primes[rand.Intn(len(r.primes))], io.EOF
    }

    return r.primes[rand.Intn(len(r.primes))], nil
}

func sieveOfEratosthenes(N int) (primes []int) { …
Run Code Online (Sandbox Code Playgroud)

rsa go

1
推荐指数
1
解决办法
901
查看次数

标签 统计

go ×2

java ×2

performance ×1

rsa ×1