标准库 vs Windows API 速度
Standard Library vs Windows API Speed
我的问题是如果我想从我的程序中获得最大速度,我是否应该使用 Windows API,我可以在其中使用标准库函数.
我假设每次通话的答案都不一致;具体来说,我很好奇 stat() vs dwFileAttributes,如果我想弄清楚一个文件是否是一个目录(假设 file_name 是一个包含文件完整路径的字符串):
WIN32_FIND_DATA fileData;
HANDLE hSearch;
hSearch = FindFirstFile(TEXT(file_name), &fileData);
int isDir = fileData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY
对比
struct stat info;
stat(file_name, &info);
int isDir = S_ISDIR(info.st_mode);
如果有人知道,或者可以详细说明这些库之间的速度差异(如果有的话),我将不胜感激。
不是关于速度的答案,而是@The Corn Inspector,MSVC CRT 代码是开源的。如果您查看旧版本(在 .net 和常见的 UCRT 之前),并查看 stat() 函数,它确实是相同 OS 调用的包装器。
int __cdecl _tstat (
REG1 const _TSCHAR *name,
REG2 struct _stat *buf
)
{ // stuff omitted for clarity
_TSCHAR * path;
_TSCHAR pathbuf[ _MAX_PATH ];
int drive; /* A: = 1, B: = 2, etc. */
HANDLE findhandle;
WIN32_FIND_DATA findbuf;
/* Call Find Match File */
findhandle = FindFirstFile((_TSCHAR *)name, &findbuf);
当然还有映射结构等的额外代码,貌似也做了一些时间转换:
SYSTEMTIME SystemTime;
FILETIME LocalFTime;
if ( !FileTimeToLocalFileTime( &findbuf.ftLastWriteTime,
&LocalFTime ) ||
!FileTimeToSystemTime( &LocalFTime, &SystemTime ) )
{
所以从理论上讲,它可能会更慢,但可能微不足道,以至于在一个完整、复杂的程序的上下文中没有实际区别。如果您调用 stat() 一百万次,并且担心毫秒数,谁知道呢。剖析它。
我的问题是如果我想从我的程序中获得最大速度,我是否应该使用 Windows API,我可以在其中使用标准库函数.
我假设每次通话的答案都不一致;具体来说,我很好奇 stat() vs dwFileAttributes,如果我想弄清楚一个文件是否是一个目录(假设 file_name 是一个包含文件完整路径的字符串):
WIN32_FIND_DATA fileData;
HANDLE hSearch;
hSearch = FindFirstFile(TEXT(file_name), &fileData);
int isDir = fileData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY
对比
struct stat info;
stat(file_name, &info);
int isDir = S_ISDIR(info.st_mode);
如果有人知道,或者可以详细说明这些库之间的速度差异(如果有的话),我将不胜感激。
不是关于速度的答案,而是@The Corn Inspector,MSVC CRT 代码是开源的。如果您查看旧版本(在 .net 和常见的 UCRT 之前),并查看 stat() 函数,它确实是相同 OS 调用的包装器。
int __cdecl _tstat (
REG1 const _TSCHAR *name,
REG2 struct _stat *buf
)
{ // stuff omitted for clarity
_TSCHAR * path;
_TSCHAR pathbuf[ _MAX_PATH ];
int drive; /* A: = 1, B: = 2, etc. */
HANDLE findhandle;
WIN32_FIND_DATA findbuf;
/* Call Find Match File */
findhandle = FindFirstFile((_TSCHAR *)name, &findbuf);
当然还有映射结构等的额外代码,貌似也做了一些时间转换:
SYSTEMTIME SystemTime;
FILETIME LocalFTime;
if ( !FileTimeToLocalFileTime( &findbuf.ftLastWriteTime,
&LocalFTime ) ||
!FileTimeToSystemTime( &LocalFTime, &SystemTime ) )
{
所以从理论上讲,它可能会更慢,但可能微不足道,以至于在一个完整、复杂的程序的上下文中没有实际区别。如果您调用 stat() 一百万次,并且担心毫秒数,谁知道呢。剖析它。