Для динамического доступа к первой цифре целого числа более эффективно использование String или Division? - PullRequest
0 голосов
/ 06 ноября 2018

Есть два метода, о которых я читал, делить на 10 раз (или немного эффективнее, делить так, чтобы минимизировать операции деления), т.е.

int getFirstDigit(unsigned int num) {
    if (num >= 100000000)
        num /= 100000000;
    if (num >= 10000)
        num /= 10000;
    if (num >= 100)
        num /= 100;
    if (num >= 10)
        num /= 10;

    return num;
}

Кредит: Как эффективно извлечь первую десятичную цифру числа

С беззнаковым int это будет делить самое большее в 3 раза, сокращая операции деления, которые, насколько я знаю, самые дорогие операции сборки. Мой вопрос: как это сравнить со следующей строковой операцией:

int getFirstDigit(unsigned int num) {
    return (to_string(num))[0] - '0';
}

Он преобразуется в строку, получает символ и смещается на 48, чтобы получить чистое число, которое символ будет представлять. Я знаю, что строки связаны с огромным количеством накладных расходов, и я немного осмотрелся, но не смог найти конкретного ответа, сравнивая их.

Запоздалая мысль: я увидел журнал на странице, которую я зачислил ранее, и, полагаю, я мог бы взять базу логарифмов 10 числа, собрать результат в полях, чтобы увидеть, с каким порядком 10 он связан снизу, и использовать это число как показатель степени 10, где они делят число, на которое я смотрю, сводя его к операции логарифмирования, операции питания и операции деления. Если это даже уменьшит это. Но опять же, я понятия не имею, относительное время выполнения.

Извините, я действительно видел много похожих вопросов, но ни один из тех, которые я чувствовал, не ответил на мой конкретный вопрос об относительном времени выполнения, основанном на эффективности на уровне сборки. Моя интуиция говорит мне, что деление намного лучше, чем строка, но я не уверен, потому что строка - это просто непрерывные значения ascii в памяти.

1 Ответ

0 голосов
/ 06 ноября 2018

Короткий ответ : никто не знает, пока вы не профилируете (тест) свой код!

Более длинный ответ : деление по модулю + должно выполняться быстрее, чем в любой версии, связанной со строковым диалогом, но есть исключения: при отсутствии какой-либо встроенной аппаратной поддержки любая реализация itoa / to_string должна выполнять те же относительно дорогие по модулю и делению, которые вы уже выполняете по необходимости (при преобразовании из одной базы в другую) в дополнение к выделению строк, поэтому выполнение только операций по модулю и делению должно быть быстрее.

Это зависит от вашей платформы - если вы используете Java или C #, то ваша среда выполнения (JVM и CLR соответственно) реализует операцию ToString внутри, используя сильно оптимизированный код, специфичный для платформы, который, вероятно, будет быстрее, чем выполнение арифметика самостоятельно, хотя их версия включает в себя распределение строк.

...