通过分析,我发现这里的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/