我不断听说在 Windows 中创建新进程非常昂贵。 但我找不到确切的数字 。 是否有周期的极点数? 2GHz 的双核心处理器上有多少毫秒?
我在Python写了一个测试程序,每个过程测量5米, 但我不知道其中有多少是Python的额外间接费用。 我猜不多。
我不断听说在 Windows 中创建新进程非常昂贵。 但我找不到确切的数字 。 是否有周期的极点数? 2GHz 的双核心处理器上有多少毫秒?
我在Python写了一个测试程序,每个过程测量5米, 但我不知道其中有多少是Python的额外间接费用。 我猜不多。
互换问题!
如前所述,管理费高居不下。 好奇的是,如果很快地写出一个小基准来获得一些拇指,那么线条和过程的创建需要多长时间,以及这些时间之间的关系。
#include <windows.h>
#include <stdio.h>
#include <conio.h>
#define MIN 0
#define AVG 1
#define MAX 2
DWORD WINAPI thread(LPVOID lpvData)
{
return (0);
}
int main()
{
BOOL result;
int iteration;
int i;
STARTUPINFO si;
PROCESS_INFORMATION pi;
DWORD tStart;
DWORD tEllapsed;
double tCall;
int spawnCount;
HANDLE hThread;
DWORD threadId;
double ratio;
double statCreateProcess[3];
double statCreateThread[3];
for (iteration = 0; iteration < 16; iteration++)
{
/*
** Measure creation time of process
*/
tEllapsed = 0;
spawnCount = 0;
for (i = 0; i < 100; i++)
{
ZeroMemory(&si, sizeof(si));
si.cb = sizeof(si);
ZeroMemory(&pi, sizeof(pi));
tStart = GetTickCount();
result = CreateProcess(NULL,
"cmd.exe",
NULL,
NULL,
FALSE,
NORMAL_PRIORITY_CLASS,
NULL,
NULL,
&si,
&pi);
if (result != FALSE)
{
tEllapsed += GetTickCount() - tStart;
spawnCount++;
// clean up...
TerminateProcess(pi.hProcess, 0);
CloseHandle(pi.hThread);
CloseHandle(pi.hProcess);
}
}
tCall = tEllapsed / (double)spawnCount;
printf("average creation time of process: %0.3fms
", tCall);
// track statistics...
if (iteration > 0)
{
if (statCreateProcess[MIN] > tCall)
statCreateProcess[MIN] = tCall;
statCreateProcess[AVG] += tCall;
if (statCreateProcess[MAX] < tCall)
statCreateProcess[MAX] = tCall;
}
else
{
statCreateProcess[MIN] = tCall;
statCreateProcess[AVG] = tCall;
statCreateProcess[MAX] = tCall;
}
/* measure creation time of thread */
spawnCount = 0;
tStart = GetTickCount();
for (i = 0; i < 5000; i++)
{
hThread = CreateThread(NULL,
0,
thread,
NULL,
0,
&threadId);
if (hThread != NULL)
{
spawnCount++;
// clean up...
CloseHandle(hThread);
}
}
tEllapsed = GetTickCount() - tStart;
tCall = tEllapsed / (double)spawnCount;
printf("average creation time of thread: %0.3fms
", tCall);
// track statistics...
if (iteration > 0)
{
if (statCreateThread[MIN] > tCall)
statCreateThread[MIN] = tCall;
statCreateThread[AVG] += tCall;
if (statCreateThread[MAX] < tCall)
statCreateThread[MAX] = tCall;
}
else
{
statCreateThread[MIN] = tCall;
statCreateThread[AVG] = tCall;
statCreateThread[MAX] = tCall;
}
} /* for (iteration = ...) */
statCreateProcess[AVG] /= iteration;
statCreateThread[AVG] /= iteration;
printf("
--- CreateProcess(..) ---
");
printf("minimum execution time ...: %0.3fms
", statCreateProcess[MIN]);
printf("average execution time ...: %0.3fms
", statCreateProcess[AVG]);
printf("maximum execution time ...: %0.3fms
", statCreateProcess[MAX]);
printf("
--- CreateThread(..) ---
");
printf("minimum execution time ...: %0.3fms
", statCreateThread[MIN]);
printf("average execution time ...: %0.3fms
", statCreateThread[AVG]);
printf("maximum execution time ...: %0.3fms
", statCreateThread[MAX]);
ratio = statCreateProcess[AVG] / statCreateThread[AVG];
printf("
ratio: %0.3f
", ratio);
getch();
return (0);
}
我在我的电脑(i5 3.2GHz; Windows 7)上做了几次运行,
--- CreateProcess(..) ---
minimum execution time ...: 11.860ms
average execution time ...: 12.756ms
maximum execution time ...: 14.980ms
--- CreateThread(..) ---
minimum execution time ...: 0.034ms
average execution time ...: 0.037ms
maximum execution time ...: 0.044ms
ratio: 342.565
正如预期的那样,CreateProcess(.)的变异性更大,因为涉及的系统电话更多,而被另一线条中断的可能性更大。 记住创建线条的时间甚至更短, 因为时间测量包括整个控制环( 否则 GetTickCount(.) ) 。
在运行 Windows XP(运行于上述同一台机器)的虚拟PC上进行的另一项测试产生了以下数值:
--- CreateProcess(..) ---
minimum execution time ...: 22.630ms
average execution time ...: 24.666ms
maximum execution time ...: 27.340ms
--- CreateThread(..) ---
minimum execution time ...: 0.076ms
average execution time ...: 0.086ms
maximum execution time ...: 0.100ms
ratio: 287.982
CreateProcess (.) 和 CreateTread (.) 的平均执行时间比相当接近 。
查看其他机器和Windows版本的值将会是互换的。 如果在不同的机器和Windows版本中,大约300的比值大致相同,我并不感到惊讶。
所以,让我们来总结: 创建进程(.) 比 Windows 上的 CreateTreadTread (.) 慢得多 。 但实际上, 我非常震惊它有多慢...
I am trying to find out the difference between difference service account types. I tumbled upon this question. The answer was because it has powerful access to local resources, and Network Service ...
Does anyone know how to programatically detect that a Windows server is part of a cluster? Further, is it possible to detect that the server is the active or passive node? [Edit] And detect it from ...
I ve read Get File Icon used by Shell and the other similar posts - and already use SHFileInfo to get the associated icon for any given extension, and that works great. However, Outlook uses ".msg" ...
How can I create an empty file at the DOS/Windows command-line? I tried: copy nul > file.txt But it always displays that a file was copied. Is there another method in the standard cmd? It should ...
I know about the GetLastInputInfo method but that would only give me the duration since last user input - keyboard or mouse. If a user input was last received 10 minutes ago, that wouldn t mean the ...
My application creates a thread and that runs in the background all the time. I can only terminate the thread manually, not from within the thread callback function. At the moment I am using ...
Yes, I know, the archive bit is evil. That being said, is there support for querying it with find , and modifying it with chmod ? My googling has turned up nothing......
I built a Java application that is delivered on USB sticks. To ensure compatibility, I ship an appropriate JVM on the sticks. I made an EXE that simply invokes this JVM with the application jar. Now ...