I have an algorithm written in Java that I would like to make more efficient. A part that I think could be made more efficient is finding the smallest of 3 numbers. Currently I'm using the Math.min
method as below:
double smallest = Math.min(a, Math.min(b, c));
How efficient is this? Would it be more efficient to replace with if statements like below:
double smallest;
if (a <= b && a <= c) {
smallest = a;
} else if (b <= c && b <= a) {
smallest = b;
} else {
smallest = c;
}
Or if any other way is more efficient
I'm wondering if it is worth changing what I'm currently using?
Any speed increase would be greatly helpful
For those who find this topic much later:
If you have just three values to compare there is no significant difference. But if you have to find min of, say, thirty or sixty values, "min" could be easier for anyone to read in the code next year:
But if you think of speed, maybe better way would be to put values into list, and then find min of that:
Would you agree?
For pure characters-of-code efficiency, I can't find anything better than
No, it's seriously not worth changing. The sort of improvements you're going to get when fiddling with micro-optimisations like this will not be worth it. Even the method call cost will be removed if the
min
function is called enough.If you have a problem with your algorithm, your best bet is to look into macro-optimisations ("big picture" stuff like algorithm selection or tuning) - you'll generally get much better performance improvements there.
And your comment that removing
Math.pow
gave improvements may well be correct but that's because it's a relatively expensive operation.Math.min
will not even be close to that in terms of cost.can be improved to:
Math.min
uses a simple comparison to do its thing. The only advantage to not using Math.min is to save the extra function calls, but that is a negligible saving.If you have more than just three numbers, having a
minimum
method for any number ofdouble
s might be valuable and would look something like:For three numbers this is the functional equivalent of
Math.min(a, Math.min(b, c));
but you save one method invocation.It all looks ok, your code will be fine, unless you're doing this in a tight loop. I also would consider