通过分析,我发现这里的sprintf需要很长时间。是否有一个性能更好的替代方案仍然可以处理y/m/d h/m/s字段中的前导零?

SYSTEMTIME sysTime;
GetLocalTime( &sysTime );
char buf[80];
for (int i = 0; i < 100000; i++)
{

    sprintf(buf, "%4d-%02d-%02d %02d:%02d:%02d",
        sysTime.wYear, sysTime.wMonth, sysTime.wDay,
        sysTime.wHour, sysTime.wMinute, sysTime.wSecond);

}

注意:OP在注释中解释说这是一个简化的示例。 “实际”循环包含使用来自数据库的不同时间值的其他代码。分析已将sprintf()定位为违规者。

最佳答案

如果您正在编写自己的函数来执行此工作,则字符串值0 .. 61的查找表将避免对除年份以外的所有内容进行任何算术运算。

编辑:请注意,要应对leap秒(并匹配 strftime() ),您应该能够打印60和61的秒值。

char LeadingZeroIntegerValues[62][] = { "00", "01", "02", ... "59", "60", "61" };

另外, strftime() 呢?我不知道性能如何比较(很可能只是调用sprintf()),但是值得一看(它可以自己进行上述查找)。

关于c++ - 我如何改善/替换sprintf(据我认为这是性能热点)?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/271971/

10-11 20:50