96

Do the unused imports and unused objects in Java code create any performance impact?

Suppose an object is initialized and never used, what happens? And what is the cost of unused imports?

5

6 Answers 6

87

Its a very common question.

Like most performance questions the best approach is to write the clearest and simplest code you can as this improves the maintainability of the code and helps ensure it performs reasonably well even after it is changed. (Clever/Obtuse/Needlessly Verbose code can run fast to start with but as it is changed by mere mortals it can get much slower)

Unused imports have a trivial impact on the compiler, but there are no imports in the byte code or at runtime.

Unused objects can be optimised away, but its best to avoid these as they almost always cause some performance impact, but more importantly make reading and maintaining your code more difficult.

Sign up to request clarification or add additional context in comments.

3 Comments

We can also mention a few additional CPU ticks in the compilation process. More code - more time it needs to optimize and compile
Thanks for the answer! Do you have a source for this info that I can reference? (other than this answer...)
@EduardoBezerra you can see from the byte cide specification that imports are not used so they can have an effect at runtime.
33

Unused imports have no performance impact at runtime. It is purely a namespace mechanism. Nonetheless, you should always import only what you need for readability and avoid namespace collisions which are a nuisance.

Apart from code readability and hence maintainability of code, there may be faster compilation of java code (however, unnoticeable) by tidying up imports, but runtime performance is not impacted, since byte code generated is not impacted by untidy imports. Byte code generated remains the same.

6 Comments

Please provide reference for unused imports have no performance impact
To be more precise, there is no performance impact at RUNTIME. However, depending on the number of imports, COMPILATION may be slower however unnoticeable.
Why unnoticeable? Surely that depends on how many compilations you're doing? For example - we have a CI build server that is continually compiling multiple projects - therefore even the smallest optimization should increase compile performance slightly, right?
If something takes a day longer than usual, you'll notice it... assuming it's something that would normally take less than a few days. What if it normally took a year? You're not going to notice it because it is just noise at that magnitude. There are more rewarding things to focus on than a 0.274% performance increase. If you really need that little of an increase, throw better hardware at it or improve the compiler, you'll get far more out of that than going after pocket change.
@SantiBailors "one whole day" out of what? That day is spent by the computer, not you. A computer can't fix bugs (unless programmed to?), otherwise you wouldn't be needed. A change that gains 1/1000 inside a 1000 iteration loop is still just a 1/1000 gain, I don't see your point. If someone wants to pay you for such a small gain, that's great for you, otherwise it's a waste of time.
|
9

While impact in compilation is minimal, the impact in deployment can be bad. I've just come across an unused import that required a separate library which became a maven dependency. A further transitive dependency problem was fortunately not found, but the .war file was thicker for no reason. Add to that a superfluous jar in the webapp classloader.

Comments

1

Though unused imports in Java file do not create any harm, it unnecessarily increases the length and size of the Java source file.

Comments

0

Yes it impact a bit on performance, if we are referring unused import statement in our java class. The Java compiler will check for references mentioned into the import statement and at minute level it impact on the performance of the your class.

Thanks

Comments

0

I think this being a common question is a consequence of the inherent problem of any programming language.

Syntax DOES NOT allow for a precise interpretation of what the machine is doing.

Any system is composed of 2 sides: the "real" and the "blueprint".

And it is extremely common to code in function of the "abstract"/"blueprint".

import Database;
class MyPojo {

   int intField;

   public static class Manager {

      final MyPojo instance;

      public Manager(Database db) {
         instance = db.getMyPojo();
      }

   }

}

This will allow to easily find any MyPojo related functionality. So I don't know how academia defines a distinction between both but, anything "real", involves memory allocation, reference/pointer manipulation, race conditions... etc...

These two perspectives of a system are completely different, yet the two of them are expressed in the same syntactical 2-dimensional plane... Words.

And it is not fair to either of them, a blueprint in architecture requires 2 dimensions, but the real must be handled on site.

The same way it becomes increasingly difficult to handle complex systems with just a 2 dimensional syntax, that even if IDE's try to help us with hyperlinks, it becomes an issue that could be handled easily in a 3 dimensional plane.

I believe the problem relies in how the language evolved from a pure OOP paradigm to a functional reactive one, where immutability now allows the defining of "nuclear" datatypes... Maybe all we always needed were arrays[]...

Comments

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.