Как насчет кеширования результатов? Разве это не возможно? Учитывая, что этот конкретный вызов sprintf () выполняется слишком часто в вашем коде, я предполагаю, что между большинством этих последовательных вызовов год, месяц и день не меняются.
Таким образом, мы можем реализовать что-то вроде следующего. Объявите старую и текущую структуру SYSTEMTIME:
SYSTEMTIME sysTime, oldSysTime;
Кроме того, объявите отдельные части для хранения даты и времени:
char datePart[80];
char timePart[80];
В первый раз вам нужно будет заполнить как sysTime, oldSysTime, так и datePart и timePart. Но последующие sprintf () могут быть сделаны довольно быстро, как указано ниже:
sprintf (timePart, "%02d:%02d:%02d", sysTime.wHour, sysTime.wMinute, sysTime.wSecond);
if (oldSysTime.wYear == sysTime.wYear &&
oldSysTime.wMonth == sysTime.wMonth &&
oldSysTime.wDay == sysTime.wDay)
{
// we can reuse the date part
strcpy (buff, datePart);
strcat (buff, timePart);
}
else {
// we need to regenerate the date part as well
sprintf (datePart, "%4d-%02d-%02d", sysTime.wYear, sysTime.wMonth, sysTime.wDay);
strcpy (buff, datePart);
strcat (buff, timePart);
}
memcpy (&oldSysTime, &sysTime, sizeof (SYSTEMTIME));
Приведенный выше код имеет некоторую избыточность, облегчающую понимание кода. Вы можете легко учесть. Вы можете еще больше ускориться, если знаете, что даже часы и минуты не изменятся быстрее, чем ваш призыв к рутине.