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

标签 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) {
  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;
}

并用 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("%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;
}

cmd.exe:
.\main.exe
10000000
776086
10000000
blah

电源 shell :
.\main.exe
10000000
763109
10000000
blah

我不确定如何解释这些差异。

最佳答案

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

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

检查这个以更好地理解为什么您的代码无法正常工作:
https://en.wikipedia.org/wiki/Scheduling_(computing)

希望我有所帮助

关于c++ - cmd.exe 与 Powershell 中 C++ 程序的不同执行时间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62092157/

相关文章:

c++ - 为什么我不能在我的程序中声明一个字符串 : "string is undeclared identifier"

c++ - 为什么析构函数被调用两次?

c++ - 奇怪的 GCC 行为

windows - 在 Windows 中同步读取 stdin

C++ 确定声音是否播放完毕

windows - 自动将文件从 Linux 机器复制到 Windows 机器

c++ - 如何获得最小的 SDL 程序以在 visual studio 2008 express 中编译和链接?

c++ - 运行时错误反转字符串

尝试读取 Process 的输出消息时 Java 代码卡住

windows - bash:在 MobaXterm 中运行 gradle 时找不到小程序