【发布时间】:2018-12-16 01:44:58
【问题描述】:
我已经为使用动态编程找出最长公共子序列的方法创建了一个基准:
@Benchmark
def longestCommonSubsequenceDP(): String = {
val s1 = "Pellentesque lacinia"
val s2 = "Mauris purus massa"
val up = 1
val left = 2
val charMatched = 3
val s1Length = s1.length()
val s2Length = s2.length()
val lcsLengths = Array.fill[Int](s1Length + 1, s2Length + 1)(0)
for (i <- 0 until s1Length) {
for (j <- 0 until s2Length) {
if (s1.charAt(i) == s2.charAt(j)) {
lcsLengths(i + 1)(j + 1) = lcsLengths(i)(j) + 1
} else {
if (lcsLengths(i)(j + 1) >= lcsLengths(i + 1)(j)) {
lcsLengths(i + 1)(j + 1) = lcsLengths(i)(j + 1)
} else {
lcsLengths(i + 1)(j + 1) = lcsLengths(i + 1)(j)
}
}
}
}
val subSeq = new StringBuilder()
var s1Pos = s1Length
var s2Pos = s2Length
do {
if (lcsLengths(s1Pos)(s2Pos) == lcsLengths(s1Pos -1)(s2Pos)) {
s1Pos -= 1
} else if (lcsLengths(s1Pos)(s2Pos) == lcsLengths(s1Pos)(s2Pos - 1)) {
s2Pos -= 1
} else {
assert(s1.charAt(s1Pos - 1) == s2.charAt(s2Pos - 1))
subSeq += s1.charAt(s1Pos - 1)
s1Pos -= 1
s2Pos -= 1
}
} while (s1Pos > 0 && s2Pos > 0)
subSeq.toString.reverse
}
并使用以下配置运行它jmh:run -i 10 -wi 10 -f1 -t1
并得到以下结果:
GraalVM EE 1.0.0-rc10
[info] Benchmark Mode Cnt Score Error Units
[info] LCS.longestCommonSubsequenceDP thrpt 25 91.411 ± 4.355 ops/ms
GraalVM CE 1.0.0-rc10
[info] Benchmark Mode Cnt Score Error Units
[info] LCS.longestCommonSubsequenceDP thrpt 25 26.741 ± 0.408 ops/ms
OpenJDK 1.8.0_192
[info] Benchmark Mode Cnt Score Error Units
[info] LCS.longestCommonSubsequenceDP thrpt 25 45.216 ± 1.956 ops/ms
我还做了另一个测试,我创建了一个包含数千个对象的列表,对其执行了一些过滤和排序,thrpt 在 GraalVM CE 上是最小的。
为什么会有这种差异?
【问题讨论】:
-
你能澄清你的问题吗?您是在问为什么两者之间存在任何性能差异?或者您是在问 EE 的哪些技术改进使其更快?前者的答案很简单:根据网站的说法,付费版本更快。无法给出后者的答案,因为付费版本是专有的。
-
@JörgWMittag,是的,我知道 EE 不是开源的。问题更像是为什么 GraalVM CE 的性能不如 OpenJDK?我问这个是因为 GraalVM 被宣传为更好。
-
这个基准测试表明在 GraalVM 上实现了最高性能,这与“GraalVM 被宣传为更好”的消息非常一致,不是吗?
-
我希望这两个版本的性能都比 OpenJDK 更好,但我明白你的意思 - 一项测试没有显示整体性能