В нынешнем виде принятый и наиболее одобренный ответ ( все еще ) неверен для отрицательных чисел. Если бы ответчик нашел время, чтобы проверить его и выяснить,что он разбит на отрицательные числа, он, скорее всего, потратил бы больше времени, чем машина, просто используя snprintf
, то есть
int count_digits(int arg) {
return snprintf(NULL, 0, "%d", arg) - (arg < 0);
}
Мы больше не в 1980-х;прекратить кодировать, как будто мы.Я - фанат C-стандарта, и мой любимый ответ, данный здесь, был ответ Дао Фенга ... но даже это не вошло в , почему это самый эффективный ответ на данный момент;в этом ответе я намерен показать, что его ответ можно улучшить, рассмотрев следующее:
- Производительность программирования важнее, чем эффективность кода, , поскольку она почти наверняка будет стоить дорожевремя на написание и тестирование новых функций должным образом, чем на несколько микросекунд времени выполнения.
- Повторное использование тех же стандартных функций библиотеки, которые другие программы обычно используют (вероятно), сохраняет эти стандартные библиотеки в кэше ЦП. Пропуск кеша (например, когда ваш код должен быть скопирован из ОЗУ в ЦП) может стоить до 50 инструкций ЦП, не говоря уже о том, что другой код может закончиться тем, что из-за еще одного пропуска кеша
snprintf
вернетсяв любом случае в кэш. - Отмена требований к хранилищу может привести к дополнительной оптимизации.
Ниже описывается микрооптимизация, которая препятствует вашейпроизводительность. Из-за недостатка информации, которую вы указали в своем ответе, нобOdy, который отвечает на вопрос в его нынешнем виде, может предоставить любое доказательство, не делая предположений о:
- Когда мы оптимизируем, нам нужно найти наиболее существенное узкое место в полном решении (проблема, которую вашПрограмма предназначена для решения) .Здесь есть две возможности: A) Вы хотите вычислить количество байтов для выделения, чтобы сохранить строку, содержащую эти цифры;Б) Вы просто хотите посчитать количество цифр или что-то еще для ударов.Подробнее об этом позже.На данный момент важно понять, что вы, вероятно, говорите о части решения , и эта часть может быть не самым существенным узким местом .
- Компилятор, который вы 'При использовании ОС, которую вы используете, и машины, которую вы используете (включая скорость ОЗУ, поскольку некоторые из нас вносят потенциальные ошибки в кеше, на которые больше влияет медленная память, чем быстрая память), могут возникнуть самые серьезные проблемы.Некоторые компиляторы отличаются от других и оптимизируют некоторые фрагменты кода для некоторых операционных систем, процессоров и т. Д. Лучше, чем другие.
Вы можете избежать микрооптимизации, измеряя узкие места, то есть профилируя ( «бенчмаркинг» ) каждого из этих решений в вашей системе , при условии, что они даже решают ваши проблемы должным образом.Если решение не решает проблему, это не решение, поэтому его не следует рассматривать ... Если все сделано правильно, это должно устранить микрооптимизацию.Некоторые компиляторы даже обеспечивают интеллектуальную оптимизацию по профилю , которая обычно экономит 20-30% за счет реорганизации ветвей и объектов для обеспечения кеширования и делает это автоматически .
I 'Мы уже рассмотрели счетные цифры, которые, я думаю, наверняка отвечают на ваш вопрос, но есть случаи, когда вы могли бы думать , вам нужно считать цифры, когда вы не , и способностьСнять накладные расходы на подсчет цифр может быть очень желательной оптимизацией, как в человеко-часах , так и в машинных часах.
Например, если вы хотите вычислить количество байтов, выделяемых для хранения строки, содержащей эти цифры, вы не должны использовать какое-либо время выполнения, поскольку макрос препроцессора может использоваться для вычисления максимального количества цифр (илисимволы, включая знак), а также любые драгоценные байты временного хранилища, которые вы пытаетесь сохранить, будут значительно превосходить по численности байты машинного кода, добавленные в логику, что для меня кажется чрезмерной ценой.Для программиста также полезно использовать макрос препроцессора;один и тот же макрос можно использовать для любого целочисленного типа. См. мой ответ на этот вопрос для решения этой проблемы ;в конце концов, нет смысла повторяться ...