'Fastest way to convert numeric chars to int
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', wherenumis acharvalue.
Which of these two approaches is the fastest and most efficient?
Solution 1:[1]
The two versions are not equivalent:
- The
Character.getNumericalValue(...)methods work for a variety of characters that represent digits or numbers, and it will return-1or-2in cases where the character doesn't represent a non-negative integer. - The
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
The
num - '0'version will be faster. This is clear from looking at the source code forgetNumericalValue(...).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.
Solution 2:[2]
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 ints. 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.
Sources
This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.
Source: Stack Overflow
| Solution | Source |
|---|---|
| Solution 1 | |
| Solution 2 |
