当我查看我的代码时,出现了很多问题。我想知道人们对一些代码片段的看法。对于每一个,我都在想什么是更优化的,什么是更好的实践或更干净的。最有可能的是,任何可能的优化都是纳秒级别的,我只是想知道理论上。:)
1)第一个是需要报告错误的频繁调用的例程。现在它看起来像这样
if(success)
//Stuff
else
reportInternalError();将其更改为
if(success) {
//Stuff
return;
}
reportInternalError();2)reportInternalError()应该只在第一次发生错误时报告错误,而且它可能会被频繁调用。目前是这样的
if(!reported) {
//Report error
reported = true;
}我在考虑改成
if(reported)
return;
//Report error
reported = true;3)最后一个是关于重复代码的。我使用了两次完全相同的代码,并且我正在尝试找出一种更好的方式来编写它。
try {
//Stuff
} catch(){
}
while(loop) {
try {
//Same Stuff
} catch(){
loop = false;
}
}对比
first = true;
do {
try {
//Stuff
} catch() {
if(!first)
loop = false;
}
first = false;
} while(loop);谢谢!
发布于 2011-01-29 20:54:38
我更看重可读性和可维护性,而不是微优化。从微优化中获得的收益实际上是微不足道的(考虑到当今编译器、JIT和处理器的复杂性,微优化的收益通常为零)。
我的选择:
1)我尝试将正常情况放在主代码路径上,而将异常情况放在分支中:
if (! success) {
reportInternalError();
}
// Stuff2)我赞成最初的方法。另一种方式假设方法总是只想要return,但是如果它将来需要做更多的事情呢?我不想让这些额外的东西进入分支:
if (! reported) {
// Report error
reported = true;
}
// extra stuff to do3)重构后的版本对我来说似乎更容易维护。我对用一个简单的break替换targetExceptionWasThrown持观望态度
boolean isFirstIteraton = true;
boolean targetExceptionWasThrown = false;
do {
try {
//Stuff
} catch() {
if (! isFirstIteraton) {
targetExceptionWasThrown = true;
}
}
isFirstIteraton = false;
} while (! targetExceptionWasThrown);发布于 2011-01-29 20:25:37
不必为那事担心了。在这个时代,计算机能力比智力要便宜得多,所以为了可读性而优化你的代码,而不是为了在这里或那里获得几微秒。
此外,JVM的JIT编译器很可能会为您执行这些优化。即使没有,它也已经变得如此复杂,以至于看起来像是性能提升的修改实际上可能会减慢你的程序速度。Josh Bloch去年在Devoxx上就这一主题做了一个出色的presentation演讲。
发布于 2011-01-29 20:28:32
关于#3,exception将为你“退出”循环,只需将try-catch放在循环之外即可。
try {
//Stuff
} catch(){
}
try {
while(true) {
//Same Stuff
}
} catch(){
}但是由于您有一些重复,所以在第二个示例中使用break可能更好(而不是使用loop var)。
first = true;
while (true) {
try {
//Stuff
} catch() {
if(!first)
break;
}
first = false;
};否则,您可以为//Stuff创建一个单独的方法。它将保留第一个示例的清晰度,但删除重复项。
https://stackoverflow.com/questions/4836814
复制相似问题