2

我在 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;
}

关于开发服务器和应用引擎上的部署之间的此功能的性能,我面临着非常奇怪的问题,如下所示:

  1. 此函数在循环中调用,目的是寻找最佳匹配。
  2. 单次迭代的性能至关重要,因为有很多迭代。
  3. 如果我在这段代码中没有任何逻辑并直接返回任何整数,我的整个代码平均需要 100 毫秒才能完成。
  4. 上面的代码需要 200 - 600 毫秒之间的任何时间。
  5. 在开发服务器上,如果我替换“int match = (pattern1.length - pattern2.length) * range;” 通过“int match = Math.abs(pattern1.length - pattern2.length) * range;”,不知何故,性能提高了,仅将时间缩短到 200 - 300 ms。对部署服务器没有影响。
  6. 如果我删除“Math.abs”,性能会提高,使平均值达到 150 毫秒。
  7. 我尝试用位运算替换 Math.abs 以得出绝对值。我在开发服务器上看到了巨大的性能提升约 160 毫秒。在部署服务器上,它使事情变得更糟约 700 毫秒。

我想在这里了解的是: 1. 开发服务器(Windows 7/eclipse/JDK6)和部署服务器在性能调整方面的表现为何以及有何不同?2. 有没有更好的匹配算法?

我很难过。任何帮助表示赞赏。

4

1 回答 1

1

这是一个很好的问题。我能想到的一个问题是,一旦部署就无法保证您运行的硬件。在不同的运行中,您可能会在更快/更慢的服务器上运行。我怀疑要对其进行很好的测试,您会希望您的各种代码示例在同一个请求处理程序中运行,以便您知道它们在同一个实例上运行。

于 2012-11-15T16:23:38.600 回答