Reputation: 311
From looking over here and other websites I know there are two common ways to convert a numeric char
value like '5'
to an int
value:
Using Character.getNumericValue()
Subtracting the number with the ASCII value for '0'
; i.e. int number = num - '0'
, where num
is a char
value.
Which of these two approaches is the fastest and most efficient?
Upvotes: 5
Views: 1685
Reputation: 718708
The two versions are not equivalent:
Character.getNumericalValue(...)
methods work for a variety of characters that represent digits or numbers, and it will return -1
or -2
in cases where the character doesn't represent a non-negative integer.num - '0'
approach only gives the correct answer for the codepoints that correspond to the ASCII characters '0'
through '9'
. For all other codepoints or codeunits, it gives a meaningless value.The num - '0'
version will be faster. This is clear from looking at the source code for getNumericalValue(...)
.
While the difference is significant in relative terms, it is very small in absolute terms.
I concur with the comments that say that this is most likely a premature optimization.
It is also an incorrect optimization in some contexts.
I use it a lot so was wondering if I was using the most efficient one.
This is definitely premature optimization :-)
The number of times you write a particular code sequence is unrelated to performance of the code sequence when is executed. A section of code is only worth optimizing if the time spent executing it makes a significant difference to your entire application.
Upvotes: 9
Reputation: 186668
Well, Character.getNumericValue()
takes Unicode, radix, case, culture into account:
'0' -> 0 // Same as number - '0'
'9' -> 9 // Same as number - '0'
'A' -> 10 // Hexadecimal 0xA == 10
'f' -> 15 // Hexadecimal 0xF == 15
'³' -> 3 // Unicode superscript 3
'⒇'-> 20 // Unicode enclosed alphanumeric 20
'۵' -> 5 // Persian digit 5
'*' -> -1 // Doesn't have any corresponding integer value
'⅚' -> -2 // Even if 5/6 fraction Unicode character is a number, it's not integer
while
number - '0'
is just a subtraction of two int
s. That's why Character.getNumericValue()
is inevitably slower (some nanoseconds, is it worth optimizing?). But, please, note, that in 'A', 'f', '³', '*'
etc. cases you are going to have wrong asnwers with number - '0'
code.
Upvotes: 6