cmd.exe与Powershell中C++程序的不同执行时间



我正在对这个相当简单的程序进行基准测试:

#include <Windows.h>
#include <stdio.h>
void dotp(float *array1, float *array2, float *dest, size_t N) {
for (size_t i = 0; i < N; ++i) {
dest[i] += array1[i] * array2[i];
}
}
float *newArray(int N) {
float *x = new float[N];
for (size_t i = 0; i < N; ++i) {
x[i] = i;
}
return x;
}
int main(int argc, const char *argv[])
{
SetPriorityClass(GetCurrentProcess(), REALTIME_PRIORITY_CLASS);
LARGE_INTEGER StartingTime, EndingTime, ElapsedMicroseconds;
LARGE_INTEGER Frequency;
size_t LOOPS = 10 * 1000 * 1000;
int N =  1024;
float* x = newArray(N);
float* y = newArray(N);
float* z = newArray(N);
QueryPerformanceFrequency(&Frequency); 
QueryPerformanceCounter(&StartingTime);
for (size_t i = 0; i < LOOPS; ++i) {
dotp(x, y, z, N);
}
QueryPerformanceCounter(&EndingTime);
ElapsedMicroseconds.QuadPart = EndingTime.QuadPart - StartingTime.QuadPart;
ElapsedMicroseconds.QuadPart *= 1000000;
ElapsedMicroseconds.QuadPart /= Frequency.QuadPart;
printf("%lldrn", Frequency.QuadPart);
QueryPerformanceFrequency(&Frequency); 
printf("%lldrn", ElapsedMicroseconds.QuadPart);
printf("%lldrn", Frequency.QuadPart);
return 0;
}

并与cl.exe /arch:AVX2 /O2 main.cpp一起编译.

在cmd.exe中运行时,运行大约需要1秒钟(我运行了很多次,没有区别(:

.main.exe
10000000
1023448
10000000

但是,在Powershell中运行时,它的速度要快得多(并且无论我的操作系统中发生什么,并且在多次运行中始终如一

(:
.main.exe
10000000
620746
10000000

使用一些简单的 shell 命令来证实性能计数器所说的内容:

cmd /v:on /c "echo !time! & .main.exe & echo !time!
11:59:11.38
10000000
1004120
10000000
11:59:12.39
Measure-Command {.main.exe}

Days              : 0
Hours             : 0
Minutes           : 0
Seconds           : 0
Milliseconds      : 630
Ticks             : 6308918
TotalDays         : 7.30198842592593E-06
TotalHours        : 0.000175247722222222
TotalMinutes      : 0.0105148633333333
TotalSeconds      : 0.6308918
TotalMilliseconds : 630.8918

我在分析的代码之前和之后打印了性能计数器频率,以防万一发生变化,并且还设置了进程的优先级类以防万一 cmd.exe Powershell 以不同的方式处理它。没有区别。

最重要的是,一旦包含iostream并使用它来打印其他内容,cmd.exe和Powershell就会给出等效的结果(cmd.exe的速度增加,Powershell的速度降低(。

#include <Windows.h>
#include <stdio.h>
#include <iostream>
void dotp(float *array1, float *array2, float *dest, size_t N) {
for (size_t i = 0; i < N; ++i) {
dest[i] += array1[i] * array2[i];
}
}
float *newArray(int N) {
float *x = new float[N];
for (size_t i = 0; i < N; ++i) {
x[i] = i;
}
return x;
}
int main(int argc, const char *argv[])
{
SetPriorityClass(GetCurrentProcess(), REALTIME_PRIORITY_CLASS);
LARGE_INTEGER StartingTime, EndingTime, ElapsedMicroseconds;
LARGE_INTEGER Frequency;
size_t LOOPS = 10 * 1000 * 1000;
int N =  1024;
float* x = newArray(N);
float* y = newArray(N);
float* z = newArray(N);
QueryPerformanceFrequency(&Frequency); 
QueryPerformanceCounter(&StartingTime);
for (size_t i = 0; i < LOOPS; ++i) {
dotp(x, y, z, N);
}
QueryPerformanceCounter(&EndingTime);
ElapsedMicroseconds.QuadPart = EndingTime.QuadPart - StartingTime.QuadPart;
ElapsedMicroseconds.QuadPart *= 1000000;
ElapsedMicroseconds.QuadPart /= Frequency.QuadPart;
printf("%lldrn", Frequency.QuadPart);
QueryPerformanceFrequency(&Frequency); 
printf("%lldrn", ElapsedMicroseconds.QuadPart);
printf("%lldrn", Frequency.QuadPart);
std::cout << "blah" << std::endl;
return 0;
}

CMD.exe:

.main.exe
10000000
776086
10000000
blah

Powershell:

.main.exe
10000000
763109
10000000
blah

我不知道如何解释这些差异。

对应用程序进行计时是一个非常复杂的交易。原因是您没有使用实时操作系统。

您的处理器停止执行您的应用程序以将上下文更改为另一个进程,因此您有实时的错觉。

检查这一点以更好地了解为什么您的代码无法正常工作: https://en.wikipedia.org/wiki/Scheduling_(计算(

希望我有帮助

最新更新