Самый быстрый способ конвертировать числовые символы в int - PullRequest
6 голосов
/ 19 сентября 2019

Просматривая здесь и другие сайты, я знаю, что есть два распространенных способа конвертировать числовое значение char, например '5', в значение int:

  1. Использование Character.getNumericValue()

  2. Вычитание числа со значением ASCII для '0';т.е. int number = num - '0', где num - это значение char.

Какой из этих двух подходов является самым быстрым и наиболее эффективным?

Ответы [ 2 ]

6 голосов
/ 19 сентября 2019
  1. Две версии не эквивалентны:

    • Методы Character.getNumericalValue(...) работают для различных символов, представляющих цифры или цифры, и возвращают -1 или-2 в случаях, когда символ не представляет неотрицательное целое число.
    • Подход num - '0' дает правильный ответ только для кодовых точек, которые соответствуют символам ASCII '0' до '9',Для всех других кодовых точек или кодовых единиц это дает бессмысленное значение.
  2. Версия num - '0' будет быстрее.Это видно по исходному коду для getNumericalValue(...).

  3. Хотя разница в относительном выражении значительна, в абсолютном выражении она очень мала.


Я согласен с комментариями, в которых говорится, что это, скорее всего, преждевременная оптимизация.

Это также неправильная оптимизация в некоторых контекстах.


Я часто ее использую, поэтому мне было интересно, если бы я использовал наиболее эффективную.

Это определенно преждевременная оптимизация: -)

Количество раз, когда вы пишете конкретную кодовую последовательность, не связано с количеством выполнений кодовой последовательности.Именно последнее определяет, стоит ли оптимизация усилий.

5 голосов
/ 19 сентября 2019

Ну, Character.getNumericValue() принимает Unicode , radix , case , culture :

 '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

, в то время как

number - '0'

- это только вычитание двух int с.Вот почему Character.getNumericValue() неизбежно медленнее (некоторые наносекунды, стоит ли оптимизировать?).Но, пожалуйста, обратите внимание, что в случаях 'A', 'f', '³', '*' и т. Д. У вас будет неправильный ответ с кодом number - '0'.

...