测量用C ++排序数据的性能

问题描述 投票:1回答:3

因此,我们的类被赋予了这个代码来编译和运行,并查看运行不同大小的输入N需要多长时间:

#include <iostream>
#include <fstream>
#include <iterator>
#include <vector>
#include <algorithm>
#include <iostream>
#include <stdio.h>

using namespace std;

int main(int argc, char *argv[]) {
  int N;
  sscanf(argv[1], "%d", &N);
  vector<double> data(N);
  for(unsigned int i=0; i<N; i++) {
    data[i] = rand()/(RAND_MAX+1.0);
  }
  sort(data.begin(), data.end());
  copy(data.begin(), data.end(), ostream_iterator<double>(cout,"\n"));
}

我们从未接受过C ++教授,也不希望知道这段代码是如何工作的。它们甚至为我们提供了编译和运行代码的命令。但是,他们没有提到我们究竟能够衡量该计划需要多长时间。我尝试过这种方法:

#include <iostream>
#include <fstream>
#include <iterator>
#include <vector>
#include <algorithm>
#include <iostream>
#include <stdio.h>
#include <time.h>

using namespace std;

int main(int argc, char *argv[]) {

  double start_time = time(NULL);

  int N;
  sscanf(argv[1], "%d", &N);
  vector<double> data(N);
  for(unsigned int i=0; i<N; i++) {
    data[i] = rand()/(RAND_MAX+1.0);
  }
  sort(data.begin(), data.end());
  copy(data.begin(), data.end(), ostream_iterator<double>(cout,"\n"));

  double end_time = time(NULL);
  printf("%lf seconds\n", end_time - start_time);

}

字面上只包括一个时间库,然后获取程序运行前后的当前时间,并在结束时打印差异。 我直接从这个网站复制的所有内容实际上是因为我们都不知道(或者显然需要知道)如何用C ++编写任何代码直到明年。

但是,输出始终是

0.000000 seconds

即使是数百万或数十亿的大小输入,我也可以看到处理需要几秒钟或几分钟。 我在这段代码中做错了什么?

我读过一些消息来源说使用Chrono库来测量时间,但是当我尝试时,我遇到了更复杂的错误。这至少可以编译和运行,但每次都是错误的。

c++
3个回答
4
投票

您可能希望使用环境的常用工具,而不是修改代码。

例如,在Linux中,time工具:

g++ theCode.cpp -o theProgram
time ./theProgram 10
time ./theProgram 100
time ./theProgram 1000
time ./theProgram 10000

time(NULL)没有返回double;它返回一个time_t。您已将两个时间戳都转换为double,并可能导致自己出现精度问题,因为UNIX时间戳非常高,并且您所期望的秒数差异相对较小。

你应该摆脱doubles并坚持使用time_t给你的time(NULL)类型。不要忘记将printf格式字符串从%lff更新为something else

此外,现在更好地拼写time(nullptr),或者你可以使用<chrono>中的现代C ++功能。


1
投票

这很可能是因为经过的时间不到一秒钟。 time()的分辨率以秒为单位。

以下是如何切换使用chrono库以纳秒为单位进行测量:

#include <iostream>
#include <fstream>
#include <iterator>
#include <vector>
#include <algorithm>
#include <iostream>
#include <stdio.h>
#include <time.h>
#include <chrono>

using namespace std;
using namespace std::chrono;

int main(int argc, char *argv[]) {

  high_resolution_clock::time_point start_time = high_resolution_clock::now();

  int N;
  sscanf(argv[1], "%d", &N);
  vector<double> data(N);
  for(unsigned int i=0; i<N; i++) {
    data[i] = rand()/(RAND_MAX+1.0);
  }
  sort(data.begin(), data.end());
  copy(data.begin(), data.end(), ostream_iterator<double>(cout,"\n"));

  high_resolution_clock::time_point end_time = high_resolution_clock::now();
  printf("%lf nanoseconds\n", duration_cast< nanoseconds >( end_time - start_time ).count() );

}

0
投票

时间函数返回第二个计数(整数计数,而不是浮点数)。似乎该算法运行时间不够长,最终执行时间不到一秒。使执行时间可测量的最简单方法是引入一个外部循环,如下所示:

for (int n=0; n<NumLoops; n++)
{
    // your logic
}

将NumLoops调整为大数(开始低位并增加),直到执行时间可能为30秒或更长。然后除以NumLoops测量的总时间。

请注意,这不是一种高精度方法。它不测量实际的线程执行时间(这是另一个主题),并假设内部逻辑的执行时间远远超过外部循环引入的开销(这似乎就是这种情况)。

© www.soinside.com 2019 - 2024. All rights reserved.