我在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匹配= Math.abs(pattern1.length-pattern2.length)*范围;”,性能得到了改善,使所花费的时间减少到仅200-300 ms。对部署服务器没有影响。
如果删除“ Math.abs”,性能会提高,平均时间为150毫秒。
我尝试用位操作替换Math.abs以得出绝对值。我发现〜160 ms开发服务器上的巨大性能改进。在部署服务器上,这会使情况变得更糟〜700毫秒。
我想在这里知道的是:
1.为什么在性能调整方面,开发服务器(Windows 7 / eclipse / JDK6)和部署服务器的行为有何不同?
2.是否有更好的匹配算法?
被困住了。任何帮助表示赞赏。
最佳答案
这是一个很好的问题。我能想到的一个问题是,部署后无法保证您运行的硬件。在不同的运行中,您可能会在速度更快/更低的服务器上运行。我怀疑测试得很好,您希望您的各种代码示例都在同一请求处理程序中运行,以便您知道它们在同一实例上运行。
关于java - App Engine Java:求和两个数组的差-如何提高性能?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/13393779/