所以,我们的类(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/