我试图弄清楚为什么Java的BigInteger乘法基准比使用从BigInteger.java源代码复制到我的项目中的实例要快3倍。使用jmh运行基准测试。下面是一个示例输出,注意加法的运行大致相同。
Benchmark Mode Cnt Score Error Units
BenchmarkTest.javaBigInteger_add thrpt 5 856062.338 � 34040.923 ops/s
BenchmarkTest.sourceBigInteger_add thrpt 5 842421.746 � 39630.112 ops/s
BenchmarkTest.javaBigInteger_multiply thrpt 5 525649.635 � 15271.083 ops/s
BenchmarkTest.sourceBigInteger_multiply thrpt 5 133944.766 � 1832.857 ops/s
一些,甚至可能是大多数JVM有许多内在函数,这些函数代替Java代码用于各种计算密集型操作。更多细节可以在这个问题的答案中找到。其中一个intrinics是multiplytolen
,专门处理biginteger
乘法。
在禁用该内在函数的使用之后,通过更改build.gradle
文件中的JMH
配置,如下所示:
jmh {
warmupIterations = 2
iterations = 5
fork = 1
jvmArgsPrepend = ['-XX:+UnlockDiagnosticVMOptions', '-XX:-UseMultiplyToLenIntrinsic']
}
我在x86-64体系结构上的OpenJDK 11(JDK 11.0.11,OpenJDK 64位服务器VM,11.0.11+8-JVMCI-21.1-B05
)上得到了以下乘法基准测试结果:
Benchmark Mode Cnt Score Error Units
BenchmarkTest.javaBigInteger thrpt 5 107476.070 ± 8059.020 ops/s
BenchmarkTest.sourceBigInteger thrpt 5 108011.737 ± 7105.221 ops/s
这几乎完全弥合了两种实现之间的差距。
可能还有其他配置选项起到的作用较小,但我认为总的来说,答案是,对于标准JDK类,存在各种编译器/运行时优化,而这些优化并不应用于自定义实现。
我决定要对一个特定的函数进行基准测试,所以我天真地编写了这样的代码: 一位同事指出,我应该将和变量声明为,以避免代码重新排序。例如,他建议优化器可以像这样有效地重新排序代码: 起初,我怀疑这种极端的重新排序是允许的,但经过一些研究和实验,我知道是允许的。 但volatile感觉不是正确的解决方案;volatile真的只是用于内存映射I/O吗? 然而,我添加了< code>volatile,发现不仅
问题内容: 我最近一直在研究基准测试,我一直对记录程序数据等感兴趣。我想知道我们是否可以在程序内部实现我们自己的内存使用代码并有效地实现自己的时间消耗代码。我知道如何检查代码运行所需的时间: 我还研究了健壮的Java基准测试,第1部分:问题,本教程非常全面。显示的负面影响。然后,本教程建议我们使用(使其更准确吗?)。 我还查看了确定Java中的内存使用情况以了解内存使用情况。该网站显示了如何实施。
我偶然发现了一些毫无意义的东西。我有这个Python代码,它做2个简单的for循环,只是测量执行时间。然而,我发现从一个函数调用完全相同的代码需要一半的时间。有人能解释一下为什么吗? 这里是输出:
我有一个cron作业方法,它根据用户的特色故事构建用户的故事提要,跟踪类别并跟踪用户。 最终提要按正确顺序添加到以下数据库表中: 用户提要表: Uid 方法如下,包含注释<代码: 对于30名用户,上述方法需要约35秒才能完成<问:我如何改进代码和性能?
我在R中查看cov的source_code,遇到了一段我不太理解的代码。 协方差的数学定义在这里。
问题内容: 我想找到更快的:结构与数组。因此,我编写了一个GO代码,在其中我将4个int值(1、2、3和4)写入一个结构的成员,然后写入一个长度为4的数组。我试图找出写入所需的时间。 案例1:首先,我将值写入结构,然后写入数组。在这里,我发现数组比结构要快。 情况2:其次,我将值写入数组,然后写入结构。在这里,我发现结构比数组要快。 为什么性能取决于我首先写的内容?我首先写的那个似乎慢一些。为