c++ - 测量 C++ 中数据排序的性能

标签 c++

所以,我们的类(class)得到了这段代码来编译和运行,看看对于不同大小的输入 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 库来测量时间,但是当我尝试这样做时,我遇到了更复杂的错误。这至少可以编译和运行,但每次都是错误

最佳答案

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

例如,在 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 时间戳非常高,而您期望的秒数差异相对较小。

你应该去掉 double s 并坚持使用 time_t输入 time(NULL)给你。不要忘记更新您的 printf来自 %lff 的格式字符串至 something else .

此外,最好拼写为 time(nullptr)现在,或者您可以使用 <chrono> 中的现代 C++ 功能.

关于c++ - 测量 C++ 中数据排序的性能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54814101/

相关文章:

c++ - 为什么要使用 const 进行隐式转换?

c++ - CHtmlEditCtrl::PrintDocument() - 靠近页面底部的行间距错误?

php - 嵌入式 If/Elses 与序列化 And (&&) 语句?

c++ - 从内存创建着色器时出错

c++ - 双重乘法给出四舍五入的结果

c++ - 如何将对象名称保存为字符串

c++ - 如何获取和设置编辑框的 'read-only' 属性?

c++ - 有没有办法优化这个功能?

c++ - 链接错误 "LogonUser"编译C++程序?

C++ AMP 嵌套循环