У меня есть класс таймера, который использует функцию запуска/остановки, и я использую внутренний вызов GetCurrentTimeAsUnixMillis()
, который возвращает UInt64.Создание таймера и попытка конвертировать UInt64 в допустимую строку времени
Моя цель состоит в том, чтобы создать строку в формате: HH:MM:SS:mmm
Наивный подход, который я думал, было:
auto start = GetCurrentTimeAsUnixMillis();
auto end = GetCurrentTimeAsUnixMillis();
auto value = end - start; //gets the difference between start and stop.
auto ms = 1;
auto s = ms*1000;
auto m = s*60;
auto h = m*60;
Utf8String out("");
out += value/h + ":";
value -= value/h;
out += value/m + ":";
value -= value/m;
out += value/s + ":";
value -= value/s;
out += value;
return out;
Я просто думаю, что это слишком много вычислений и поэтому неправильный ответ.
Предположим, что есть вызов библиотеки, который вы могли бы сделать вместо этого, считаете ли вы, что для вызова не нужно будет делать все те же математику? Вы должны сделать константы 'ms',' s' и т. Д., Они не будут меняться. Возможно, вам захочется подумать о том, как вы делаете форматирование, хотя, если вы хотите что-то вроде '01: 02: 03: 004'. Ваш код не добавляет начальные нули. –
Да и нет. Я знаю, что он назвал бы похожий код, но когда вы будете обращаться к библиотекам, особенно к тем, которые являются std, он будет оптимизирован и, возможно, будет разрешен с использованием битхифта или целочисленного деления. – Fallenreaper
Вы имеете в виду, что получаете неправильный результат, или что вы чувствуете, что есть более эффективный способ сделать это? В зависимости от того, что такое 'Utf8String', может быть, вы можете выделить достаточное пространство для размещения выходной строки? Если это невозможно, объявление локального буфера с использованием 'snprintf' для печати всех значений в нем, а затем создание« Utf8String »из буфера может быть более эффективным. – Praetorian