为什么在尝试测量函数返回所需的时间时,我的运行时编号是错误的?

Why are my runtime numbers wrong when trying to measure how long a function takes to return?

本文关键字:我的 运行时 编号 错误 时间 为什么 测量 函数 返回      更新时间:2023-10-16

我有 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_repO(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)需要那个时间。你必须初始化整个向量,每次传递它的大小是原来的两倍。所以这是意料之中的。但它可能可以进行大量优化。您可能正在增长向量,而不是使用正确的大小初始化它。