我在 App Engine java 中有一个函数,我在其中比较存储在 int 数组中的两个模式。
下面是代码:
public static int patternMatch(int [] pattern1, int [] pattern2, int range) {
int max = range * pattern1.length;
int match = (pattern1.length - pattern2.length) * range;
for(int i = 0; i < pattern2.length; i++) {
match += Math.abs(pattern1[i] - pattern2[i]);
}
return (max - match) * 100 / max;
}
关于开发服务器和应用引擎上的部署之间的此功能的性能,我面临着非常奇怪的问题,如下所示:
- 此函数在循环中调用,目的是寻找最佳匹配。
- 单次迭代的性能至关重要,因为有很多迭代。
- 如果我在这段代码中没有任何逻辑并直接返回任何整数,我的整个代码平均需要 100 毫秒才能完成。
- 上面的代码需要 200 - 600 毫秒之间的任何时间。
- 在开发服务器上,如果我替换“int match = (pattern1.length - pattern2.length) * range;” 通过“int match = Math.abs(pattern1.length - pattern2.length) * range;”,不知何故,性能提高了,仅将时间缩短到 200 - 300 ms。对部署服务器没有影响。
- 如果我删除“Math.abs”,性能会提高,使平均值达到 150 毫秒。
- 我尝试用位运算替换 Math.abs 以得出绝对值。我在开发服务器上看到了巨大的性能提升约 160 毫秒。在部署服务器上,它使事情变得更糟约 700 毫秒。
我想在这里了解的是: 1. 开发服务器(Windows 7/eclipse/JDK6)和部署服务器在性能调整方面的表现为何以及有何不同?2. 有没有更好的匹配算法?
我很难过。任何帮助表示赞赏。