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

C++ C+的不同执行时间+;cmd.exe与Powershell中的程序,c++,windows,C++,Windows,我对这个相当简单的项目进行了基准测试: #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) {

我对这个相当简单的项目进行了基准测试:

#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("%lld\r\n", Frequency.QuadPart);
  QueryPerformanceFrequency(&Frequency); 
  printf("%lld\r\n", ElapsedMicroseconds.QuadPart);
  printf("%lld\r\n", Frequency.QuadPart);

  return 0;
}
但是,在Powershell中运行它时,无论我的操作系统中发生了什么,它的速度都会大大加快(并且在多次运行中始终保持):

使用一些简单的shell命令可以证实性能计数器的说法:

cmd /v:on /c "echo !time! & .\main.exe & echo !time!
11:59:11.38
10000000
1004120
10000000
11:59:12.39
我在分析代码之前和之后打印了性能计数器频率,以防发生更改,并且还设置了进程的优先级级别,以防cmd.exe和Powershell对其进行不同的处理。没有区别

除此之外,一旦包含iostream并使用它打印其他内容,cmd.exe和Powershell就会给出相同的结果(cmd.exe的速度提高,Powershell的速度降低)

Powershell:

.\main.exe
10000000
763109
10000000
blah

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

为应用程序计时是一件非常复杂的事情。原因是你没有使用实时操作系统

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

选中此项可以更好地理解代码无法正常工作的原因:


希望我能帮上忙

我想不止这些。cmd.exe和Powershell之间的执行时间(几乎400毫秒)存在一致的差异,无论周围的操作系统环境是什么(打开应用程序,运行进程)。可能是一些背景,但我认为在测量时间时,您没有一个好的参数。你可以考虑的另一件事是进程优先级。检查两者是否具有相同的优先级,这可能是不同之处。我共享的代码已经设置了进程优先级。我的CPU是6核i5-9600K,以1%的CPU使用率闲置。400毫秒的CPU时间是永恒的,所以我不认为这仅仅是一个调度问题。我将进一步研究,运行您的代码,并检查我得到了什么!再见
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
#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("%lld\r\n", Frequency.QuadPart);
  QueryPerformanceFrequency(&Frequency); 
  printf("%lld\r\n", ElapsedMicroseconds.QuadPart);
  printf("%lld\r\n", Frequency.QuadPart);
  std::cout << "blah" << std::endl;

  return 0;
}
.\main.exe
10000000
776086
10000000
blah
.\main.exe
10000000
763109
10000000
blah