首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Java优化问题

Java优化问题
EN

Stack Overflow用户
提问于 2011-01-29 20:19:59
回答 6查看 406关注 0票数 1

当我查看我的代码时,出现了很多问题。我想知道人们对一些代码片段的看法。对于每一个,我都在想什么是更优化的,什么是更好的实践或更干净的。最有可能的是,任何可能的优化都是纳秒级别的,我只是想知道理论上。:)

1)第一个是需要报告错误的频繁调用的例程。现在它看起来像这样

代码语言:javascript
复制
if(success)
 //Stuff
else
 reportInternalError();

将其更改为

代码语言:javascript
复制
if(success) {
 //Stuff
 return;
}
reportInternalError();

2)reportInternalError()应该只在第一次发生错误时报告错误,而且它可能会被频繁调用。目前是这样的

代码语言:javascript
复制
if(!reported) {
 //Report error
 reported = true;
}

我在考虑改成

代码语言:javascript
复制
if(reported)
 return;
//Report error
reported = true;

3)最后一个是关于重复代码的。我使用了两次完全相同的代码,并且我正在尝试找出一种更好的方式来编写它。

代码语言:javascript
复制
try {
 //Stuff
} catch(){
}

while(loop) {
 try {
     //Same Stuff
 } catch(){
     loop = false;
 }
}

对比

代码语言:javascript
复制
first = true;
do {
 try {
     //Stuff
 } catch() {
     if(!first)
         loop = false;
 }
 first = false;
} while(loop);

谢谢!

EN

回答 6

Stack Overflow用户

回答已采纳

发布于 2011-01-29 20:54:38

我更看重可读性和可维护性,而不是微优化。从微优化中获得的收益实际上是微不足道的(考虑到当今编译器、JIT和处理器的复杂性,微优化的收益通常为零)。

我的选择:

1)我尝试将正常情况放在主代码路径上,而将异常情况放在分支中:

代码语言:javascript
复制
if (! success) {
    reportInternalError();
}

// Stuff

2)我赞成最初的方法。另一种方式假设方法总是只想要return,但是如果它将来需要做更多的事情呢?我不想让这些额外的东西进入分支:

代码语言:javascript
复制
if (! reported) {
    // Report error
    reported = true;
}
// extra stuff to do

3)重构后的版本对我来说似乎更容易维护。我对用一个简单的break替换targetExceptionWasThrown持观望态度

代码语言:javascript
复制
boolean isFirstIteraton = true;
boolean targetExceptionWasThrown = false;
do {
    try {
        //Stuff
    } catch() {
        if (! isFirstIteraton) {
            targetExceptionWasThrown = true;
        }
    }
    isFirstIteraton = false;
} while (! targetExceptionWasThrown);
票数 2
EN

Stack Overflow用户

发布于 2011-01-29 20:25:37

不必为那事担心了。在这个时代,计算机能力比智力要便宜得多,所以为了可读性而优化你的代码,而不是为了在这里或那里获得几微秒。

此外,JVM的JIT编译器很可能会为您执行这些优化。即使没有,它也已经变得如此复杂,以至于看起来像是性能提升的修改实际上可能会减慢你的程序速度。Josh Bloch去年在Devoxx上就这一主题做了一个出色的presentation演讲。

票数 4
EN

Stack Overflow用户

发布于 2011-01-29 20:28:32

关于#3,exception将为你“退出”循环,只需将try-catch放在循环之外即可。

代码语言:javascript
复制
try {
 //Stuff
} catch(){
}

 try {
   while(true) {
     //Same Stuff
   }
 } catch(){
 }

但是由于您有一些重复,所以在第二个示例中使用break可能更好(而不是使用loop var)。

代码语言:javascript
复制
first = true;
while (true) {
 try {
     //Stuff
 } catch() {
     if(!first)
         break;
 }
 first = false;
};

否则,您可以为//Stuff创建一个单独的方法。它将保留第一个示例的清晰度,但删除重复项。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4836814

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档