【问题标题】:Code in for-loops vs if-else statementsfor 循环与 if-else 语句中的代码
【发布时间】:2016-09-24 19:28:02
【问题描述】:

我试图解决这个问题:https://leetcode.com/problems/longest-substring-without-repeating-characters/

以下代码在 44 毫秒内通过了所有测试。

    for (int i = 0; i < s.length(); i++){
        if (!mp.containsKey(s.charAt(i))){
            mp.put(s.charAt(i), i);
            //max = Math.max(max, i-first+1);
        }
        else {
            if (mp.get(s.charAt(i))+1>=first){
                first = mp.get(s.charAt(i))+1;
            }
            mp.put(s.charAt(i), i);
            //max = Math.max(max, i-first+1);
        }
        max = Math.max(max, i-first+1);
    }

但以下代码仅在 20 毫秒内通过了所有测试。

    for (int i = 0; i < s.length(); i++){
        if (!mp.containsKey(s.charAt(i))){
            mp.put(s.charAt(i), i);
            max = Math.max(max, i-first+1);
        }
        else {
            if (mp.get(s.charAt(i))+1>=first){
                first = mp.get(s.charAt(i))+1;
            }
            mp.put(s.charAt(i), i);
            max = Math.max(max, i-first+1);
        }
    }

为什么会有如此显着的差异?最大值在两个样本中仅更改一次,但在 if-else 语句中更改它比在 for 循环结束时更改它更有效。这是一个例外还是我们应该在编码时遵循这个标准?

【问题讨论】:

  • 很难准确预测这种转换对机器代码的影响。也许它最终以不同的方式组织跳跃?可以转储汇编代码吗?
  • 这是您放置代码的网站的时间吗?也许是他们的翻译延迟?您应该在具有本地 vm 和性能框架的本地系统上检查这一点
  • 这两个程序的执行方式不太可能不同...您观察到的情况可能与您提交代码时服务器的繁忙程度有关。您应该在受控环境中对其进行测试。
  • 是的,可能是这样,我会尽快在受控环境中进行测试。
  • 我尝试使用两种不同方法执行相同字符串所花费的时间进行测试(我尝试了一些非常长的字符串)但无法获得任何有意义的结果

标签: java algorithm performance time


【解决方案1】:

关于简化(不是早期优化,见最大值!)一个得到

for (int i = 0; i < s.length(); i++) {
    char ch = s.charAt(i);
    Integer n = mp.get(ch):
    if (n != null) {
        first = Math.max(first, n + 1);
    }
    mp.put(ch, i);
    max = Math.max(max, i - first + 1);
}

注意原始版本中价值 i 的双重看跌。 如果将第一个 Math.max 替换为 if,代码可能会更快。

很难对 w.r.t 发表声明。为了加快这两个原始版本的速度,也许热点编译器看到了冗余。或者其他。

很高兴看到一个 java 8 版本,使用 mp.putIfAbsent 或类似的,但这可能会使它变慢。

【讨论】:

  • @Hulk 谢谢,first(与自己最大化)它应该是。已更正。难以阅读。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-10-28
相关资源
最近更新 更多