温度。变量或方法调用?字面或等效变量?

时间:2011-08-08 03:28:06

标签: java

 private static final Group[] toGroups (String string)
    {
        int     partialGroupSize = string.length() % GROUP_SIZE;
        boolean hasPartialGroup  = partialGroupSize != 0;
        int     nGroupOffset     = hasPartialGroup ? 1 : 0;
        int     nGroup           = string.length() / GROUP_SIZE + nGroupOffset;
        Group[] groups           = new Group[nGroup];
        for (int i = 0; i < nGroup; i++) {
            boolean isFirstGroup = i == 0;
            int beginIndex = isFirstGroup ? i :
                             GROUP_SIZE * (i - nGroupOffset) + partialGroupSize;
            int   endIndex = isFirstGroup && hasPartialGroup ?
                             beginIndex + partialGroupSize :
                             beginIndex + GROUP_SIZE;
            groups[i] = new Group(Integer.parseInt(string.substring(beginIndex,
                                                                      endIndex)));
        }
        return groups;
    }

我的第一个问题是我发现了不同的讨论,但我仍然不知道该怎么做 方法toGroups仅在程序中调用一次,因此.length()仅在程序中的string toGroups上调用两次。因此,在性能和可读性方面,我应该将string.length()替换为length int length = string.length();吗? Id est:

int     length           = string.length();
int     partialGroupSize = length % GROUP_SIZE;
boolean hasPartialGroup  = partialGroupSize != 0;
int     nGroupOffset     = hasPartialGroup ? 1 : 0;
int     nGroup           = length / GROUP_SIZE + nGroupOffset;

我的第二个问题是:在for循环内,假设beginIndex条件分配的谓词isFirstGrouptruei必须是0;我应该用文字beginIndex替换0条件的结果吗? Id est:

int beginIndex = isFirstGroup ? 0 :
                 GROUP_SIZE * (i - nGroupOffset) + partialGroupSize;

我的理由是因为beginIndex的结果总是0,使用等价的i迭代器会在结果的常量/变量中产生歧义。

2 个答案:

答案 0 :(得分:3)

  

所以关于性能和可读性......

可读性是编写良好的程序比性能更重要的属性。实际上,可读性仅次于正确性(IMO)。

性能通常是一个小问题。在重要的情况下,大规模算法效率比“微观”问题更为关键,例如您是否将String.length()等快速方法称为一次或两次。

(的确,JIT编译器很有可能会发现它可以安全地“提升”String.length()调出循环。即使它不能,下一代JIT也是如此编译器可能能够进行这种优化。)

通常,最好将这样的微优化保留给JIT编译器,并将精力集中在更重要的事情上。只有在您的代码中有明显证据(例如来自分析)时才进行微优化。

  

此外,有什么我应该做的,我没有做,或者我做了什么,我不应该做,风格或其他?

不要将所有声明/作业声明排成一行:

  • 这是浪费时间。
  • 它不会使您的代码更具可读性。 (如果我正在读你的代码,我不关心它的艺术品质......)
  • 它违反了所有主流编码标准。

答案 1 :(得分:0)

  • 从风格上讲,在讨论代码时(特别是在这里)使用主流术语可能会有所帮助,只是为了让事情更容易理解。除非你在谈论逻辑编程,否则你通常不会听到人们谈论“结果”或“谓词”;更常见的是你会听到“参数”或“参数”。

  • 我会更多地使用括号 - 你可以让自己进入一些令人讨厌的情况,运算符优先级试图链接逻辑语句。顺便说一下,三元是好的,但阅读时往往很痛苦。

  • 如果您刚刚开始,请将评论作为您最好的朋友。稍后,你会想避免过度评论,但过度评论总比没有评论好。你没有在这里,很难说出你想要完成的是什么。我会在你的三元组附近发表评论来解释你为什么要做你正在做的事情。对于这段特殊的代码来说,这可能并不重要,但是在生产环境中,如果你留下了错综复杂的代码,那么必须维护代码的人就会想要绞尽脑汁。

  • 就您的实际代码而言......为变量分配长度不会以任何戏剧性的方式影响您的表现,尤其是因为这是您的早期。更多地关注逻辑和语法,而不是关于性能的挑剔;你可以随时担心。

祝你好运!