gpt4 book ai didi

c++ - "stat"函数更新慢?

转载 作者:行者123 更新时间:2023-11-28 06:09:39 24 4
gpt4 key购买 nike

代码片段:

void CMyLogger::Log(
LogLevel level, LPCTSTR file, INT line, LPCTSTR func, LPCTSTR format, ...)
{
time_t tCurrentLogTime;
time(&tCurrentLogTime);

tm tmCurrentLogTime;
localtime_s(&tmCurrentLogTime, &tCurrentLogTime);

// Check the date is changed
if (m_tmCurrentLogTime.tm_year == tmCurrentLogTime.tm_year
&& m_tmCurrentLogTime.tm_mon == tmCurrentLogTime.tm_mon
&& m_tmCurrentLogTime.tm_mday == tmCurrentLogTime.tm_mday)
{
// Check the log file size has exceeded the maximum size
struct _stat st;
_tstat(m_szCurrentLogFile, &st);
if (st.st_size > m_nMaxLogSize)
{
m_nCurrentLogIndex++;

GetCurrentLogFile();

CLogger::ClearOutputStreams();

// Add logger
AddOutputStream(new std::tofstream(m_szCurrentLogFile), true, LogLevel::Info);
}
}

// The date is changed
else
{
// Get current log time
memcpy(&m_tmCurrentLogTime, &tmCurrentLogTime, sizeof(tmCurrentLogTime));

m_nCurrentLogIndex = 0;

DeleteOldFiles();
GetCurrentLogFile();

CLogger::ClearOutputStreams();

// Add logger
AddOutputStream(new std::tofstream(m_szCurrentLogFile), true, LogLevel::Info);
}


// Log
va_list args;
va_start(args, format);
int length = _vsctprintf(format, args ) + 1;
TCHAR* text = new TCHAR[length];
_vstprintf_s(text, length, format, args);
va_end(args);

CLogger::Log(level, file, line, func, text);

delete [] text;
}

以上是日志程序的代码片段。如果日志文件超过 1 MB,则创建新的日志文件。 (xxx_000.log => xxx_001.log ...) 我写了下面的代码来测试当日志文件超过 1 MB 时是否创建新的日志文件:

#ifdef UNICODE
#define LOG(level, format, ...) CEagleLogger::GetInstance()->Log(level, __FILEW__, __LINE__, __FUNCTIONW__, format, __VA_ARGS__);
#else
#define LOG(level, format, ...) CEagleLogger::GetInstance()->Log(level, __FILE__, __LINE__, __FUNCTION__, format, __VA_ARGS__);
#endif

// ...

while (1)
LOG(LogLevel::Info, _T("================================================================================"));

但是,日志文件并不是每 1 MB 创建一次。日志文件大小在写入日志之前通过 stat 函数进行检查。当实际日志文件大小超过 1 MB 时,“统计”功能不会超过 1 MB。 “stat”功能更新慢?

The log size is different.

最佳答案

stat 是一个 POSIX 函数。 _tstat 是一个 Windows 函数,旨在帮助将 POSIX 代码移植到 Windows(但 _t 东西阻​​碍了以其他方式移植)。不要期望此类包装器具有最佳性能。

特别是,stat 等同于 Windows 上的 FindFirstFile,Visual Studio 中包含的 CRT 代码证实了这一点:_stat< 中的第一个系统调用FindFirstFileEx(FindExInfoStandard ... FindExSearchNameMatch)。 .它为您提供目录条目的许多属性,包括目录中的文件大小。对于正在写入的文件,该信息已过时。 GetFileSize has the correct size

(请注意,_stat 也做了相当多的工作来获取您甚至不想要的各种属性。这在 UNIX 上非常便宜,但在 Windows 上文件访问权限必须模拟东西。也不快。)

关于c++ - "stat"函数更新慢?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31529450/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com