时间测量在C++中不起作用
Time measurement not working in C++
我正在尝试对线性排序等简单算法进行运行时测量。问题是,无论我做什么,时间测量都无法按预期工作。无论我使用什么问题大小,我都能获得相同的搜索时间。我和其他试图帮助我的人都同样感到困惑。
我有一个线性排序函数,看起来像这样:
// Search the N first elements of 'data'.
int linearSearch(vector<int> &data, int number, const int N) {
if (N < 1 || N > data.size()) return 0;
for (int i=0;i<N;i++) {
if (data[i] == number) return 1;
}
return 0;
}
我试着用C++11中的time_t和chrono进行时间测量,除了更多的小数外,没有任何运气。这就是我现在搜索时的样子。
vector<int> listOfNumbers = large list of numbers;
for (int i = 15000; i <= 5000000; i += 50000) {
const clock_t start = clock();
for (int a=0; a<NUMBERS_TO_SEARCH; a++) {
int randNum = rand() % INT_MAX;
linearSearch(listOfNumbers, randNum, i);
}
cout << float(clock() - start) / CLOCKS_PER_SEC << endl;
}
结果如何0.126,0.125,0.125,0.124,0.124,…(相同值?)
我已经在VC++、g++和不同的计算机上尝试过这些代码。
首先,我认为是我对搜索算法的实现出了问题。但是像上面这样的线性排序再简单不过了,它显然是O(N)。即使问题规模增加了这么多,时间怎么会一样?我不知道该怎么办。
编辑1:其他人可能会解释为什么会出现这种情况。但在更改后,它实际上在发布模式下工作:如果(data[i]==数字)
收件人:
if (data.at(i) == number)
我不知道为什么会出现这种情况,但在这种变化之后,线性搜索可以正确地测量时间。
执行时间不变的原因是编译器能够优化掉部分代码。
具体来看代码的这一部分:
for (int a=0; a<NUMBERS_TO_SEARCH; a++) {
int randNum = rand() % INT_MAX;
linearSearch(listOfNumbers, randNum, i);
}
当使用g++5.2和优化级别-O3
进行编译时,编译器可以完全优化掉对linearSearch()
的调用。这是因为无论是否调用该函数,代码的结果都是相同的。linearSearch
的返回值没有在任何地方使用,而且该函数似乎没有副作用。所以编译器可以删除它。
您可以交叉检查和修改内部循环,如下所示。执行时间不应该改变:
for (int a=0; a<NUMBERS_TO_SEARCH; a++) {
int randNum = rand() % INT_MAX;
// linearSearch(listOfNumbers, randNum, i);
}
循环中剩下的是对rand()
的调用,这似乎是您正在测量的。当将data[i] == number
更改为data.at(i) == number
时,对linearSearch
的调用不是没有副作用的,因为at(i)
可能会抛出超出范围的异常。因此,编译器并没有完全优化linearSearch
代码。然而,对于g++5.2,它仍然会内联它,而不会进行函数调用。
clock()正在测量CPU时间,也许您想要时间(NULL)?检查此问题
start
应该在for
循环之前。在您的情况下,每次迭代的start
是不同的,它在{ ... }
之间是恒定的。
const clock_t start = clock();
for (int i = 15000; i <= 5000000; i += 50000){
...
}
- 我的神经网络不起作用 [XOR 问题]
- 在C++程序中输入的文本文件将不起作用,除非文本被复制和粘贴
- C++映射:具有自定义类的运算符[]不起作用(总是返回0)
- C++为什么尽管我调用了void函数,它却不起作用
- 为什么在保护模式下继承升级不起作用
- 循环在计数器中不起作用
- 在其他文件中创建类时在 c++ 项目中不起作用
- Visual studio代码重构似乎不起作用(例如,重命名符号-f2)
- 为什么二进制搜索在我的测试中不起作用
- 我的代码中有错误吗?使用BGI图形的C++代码对我不起作用
- 为什么 const std::p air<K,V>& 在 std::map 上基于范围的 for 循环不起作用?
- 带有指定长度字符* 参数的 std::regex_search 在 VS2017 中不起作用?
- Bjarne Stroustrup Book - std_lib_facilities.h - 不起作用(未知类型名称)
- 为什么简单的算术减法在"if"条件下不起作用?
- 为什么Stroustup书中的has_f不起作用
- 你能检查一下为什么在这个代码中从链接列表中删除项目不起作用吗
- 嵌套While循环不起作用(C++问题)
- C++Matching Brackets 2解决方案不起作用
- 为什么这段代码不起作用,我该如何解决?
- 我正在开发服务器,ip作为参数传递不起作用