为什么在尝试测量函数返回所需的时间时,我的运行时编号是错误的?
Why are my runtime numbers wrong when trying to measure how long a function takes to return?
我有 30 个排序整数向量,向量的大小范围从 20到 230。我正在尝试测量二叉搜索需要多长时间才能在每个值中找到一个值,但是随着向量变大,报告的时间会加快。时间实际上并不需要更长的时间,报告是错误的。
这是我的代码:
int main() {
const unsigned int maxPower = 30; // 2^maxPower
long long n = 1 << maxPower; // n = 2^i
for (int i = 0; i <= maxPower; ++i) {
std::vector<long long> haystack = getVector(i); // returns a sorted vector of size i
long long needle = haystack.size()/2 + 1;
clock_t t1 = clock(); // start timer
binary_search(haystack, needle);
clock_t t2 = clock(); // end timer
clock_t dt = t2 - t1;
double clocks_per_rep = ((double)dt)/n;
double seconds = clocks_per_rep/CLOCKS_PER_SEC;
std::cout << seconds << std::endl;
}
return 0;
}
我也尝试过使用high_resolution_clock
,但除了 0 之外,我甚至无法显示任何内容。
原来的问题已经解决了,但现在我有一个新的问题:我的时间几乎没有任何变化,即使有些时间比其他时间长得多。这是我的新代码和输出:
int main() {
const unsigned int maxPower = 30; // 2^maxPower
long long n = 1 << maxPower; // n = 2^i
for (int i = 0; i <= maxPower; ++i) {
std::vector<long long> haystack = getVector(i); // returns a sorted vector of size i
long long needle = haystack.size()/2 + 1;
clock_t t1 = clock(); // start timer
ternary_search(haystack, needle);
clock_t t2 = clock(); // end timer
clock_t dt = t2 - t1;
double seconds = (double)dt/CLOCKS_PER_SEC;
std::cout << seconds << std::endl;
}
return 0;
}
1e-06
1e-06
1e-06
0
1e-06
1e-06
0
0
1e-06
0
0
1e-06
0
0
0
0
1e-06
1e-06
1e-06
4e-06
3e-06
3e-06
1e-06
2e-06
3e-06
3e-06
3e-06
2e-06
3e-06
3e-06
3e-06
假设搜索没有偏见,dt
应该是O(log(N))
。计算时
double clocks_per_rep = ((double)dt)/n;
clock_per_rep
O(log(N)/N)
.随着N
的上升,值下降是有道理的。
省略除法对我来说是有道理的n
.
clock_t dt = t2 - t1;
double seconds = (double(dt))/CLOCKS_PER_SEC;
二叉搜索采用最坏情况 O(log N(。在您的情况下,这意味着 1 到 30 次比较。最好的情况是第一次比较已经正确并直接返回。
您正在尝试测量进行 1-30 次比较所需的时间,因此基本上根本没有时间。我有点惊讶你得到的除了 0 和 1e-06 之外的任何东西。这似乎是你时钟的准确性。您的 CPU 时钟速度可能快 1000 倍以上。
您应该执行一个循环来执行许多搜索,然后对每个搜索进行平均以获得更好的准确性。您也只是在测试查找一个特定值。您是否精心构建了最坏的选择?如果不是,为什么不搜索向量中的每个值一次?
我的建议是使用 3 循环:
N = 1
Outer loop: loop until the time difference between start and finish is >1s.
N = 2 * N
start clock
Middle loop: repeat N times
Inner loop: search for every value in the vector once
end clock here
关于为什么每次输出需要指数级增长的最佳猜测是getVector(i)
需要那个时间。你必须初始化整个向量,每次传递它的大小是原来的两倍。所以这是意料之中的。但它可能可以进行大量优化。您可能正在增长向量,而不是使用正确的大小初始化它。
相关文章:
- 有没有一种方法可以测量c++程序的运行时内存使用情况
- 通过switch和static_cast访问多态对象的运行时类型
- 值到类型的运行时映射
- 可视化C++:发布模式的运行时库作为'Multi-threaded Debug DLL'
- 元组的运行时索引
- C++中 std::map 的运行时复杂度是多少?
- 为什么在尝试测量函数返回所需的时间时,我的运行时编号是错误的?
- 此print_star函数的运行时复杂度是多少?
- Leetcode 540 上的运行时错误.排序数组中的单个元素
- 运行我的代码时出现分段错误(核心转储)问题
- 我的代码上的运行时错误 sigsegv
- arm_data在第二次运行我的程序时中止失败,然后
- 当我运行我的程序时,即使"user"输入数字||C++ 绘画作业
- 我的LCS实现的运行时计算
- 每当我尝试在codelite中运行我的项目时,任何更改我'We让人觉得被忽视了
- 我应该安装哪种类型的 c++ 运行时可再发行组件包
- 当我尝试在 Ubuntu bash 中运行我的程序时,出现此错误:" /usr/lib/x86_64-linux-gnu/libstdc++.so.6: version `GLIBCXX_3.4.21
- 我所有变量的运行时检查失败 #2 错误
- 我如何以编程方式确定我的c++运行时库在哪里
- UVA 在线法官返回我无法重现的运行时错误