通过向量 [i] 进行线性搜索会产生 0 毫秒响应,而向量.at(i) 会产生时间

2023-12-19

我必须补充一点:我调用线性搜索 15 000 次,每次迭代我查找的最低范围最多为 50 000 次。因此,这意味着第一次迭代有 15 000 * 50 000 次查找。这应该需要比 0ms 更长的时间。

我有这个基本的线性搜索:

bool linearSearch(std::vector<int>&primes, int number, int range) {

    for (int i = 0; i < range; i++) {
        if (primes[i] == number)
            return true;
    }
    return false;
}

我花时间使用:

void timeLinearSearch(std::vector<int>& primes) {
    clock_t start, stop;
    size_t NRND = 15000;    //  15000 primes per clock

    for (int N = 50000; N <= 500000; N += 50000)    // increase by 50k each iteration
    {
        for (int repeat = 0; repeat < 5; repeat++) {
            start = clock();
            for (int j = 0; j < NRND; j++) {
                linearSearch(primes, rand(), N);
            }
            stop = clock();
            std::cout << stop - start << ", " << N << std::endl;
        }

    }
}

这里的问题是花费的时间是0ms。向量“primes”大约包含 600 000 个元素,因此搜索保持在范围内。

在线性搜索中,如果我改变:

if(primes[i] == number)

to:

if(primes.at(i) == number)

然后我得到搜索时间> 0。

我将线性搜索与 primes.at(i) 和 std::find() 进行了比较:

for (int j = 0; j < NRND; j++) {
    std::find(primes.begin(), primes.begin() + N, rand());
}

这比我的 .at() 发现快大约 200 毫秒。

为什么我使用 std::vector[i] 进行的搜索给了我 0 毫秒的时间?


当编译器可以看到执行时linearSearch,当你使用时它可以完全优化它operator[],因为没有副作用。这就是为什么你看到零时间。

at(..)另一方面,它有一个副作用(当索引越界时抛出),因此编译器没有选择对其进行优化。

您可以修复基准以确保调用保持在适当的位置,例如,通过计算匹配数:

int count = 0;
for (int j = 0; j < NRND; j++) {
    count += linearSearch(primes, rand(), N);
}
std::cout << stop - start << ", " << N << " " << count << std::endl;
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

通过向量 [i] 进行线性搜索会产生 0 毫秒响应,而向量.at(i) 会产生时间 的相关文章

随机推荐

  • 仅将 jetty url-pattern 与根目录匹配

    我只想用密码保护 Jetty Web 应用程序的上下文路径上的根目录 我的上下文路径是 MyApp 所以我需要密码才能访问 http localhost 8080 MyApp 但不适用于 http localhost 8080 MyApp
  • 如何在 TestCafe 中等待元素消失?

    当我需要等待元素变得可见时 我可以简单地将选择器作为函数调用 如下所示 await element with visibilityCheck true 但我怎样才能等待一个元素消失呢 要等待元素消失 您可以使用我们内置的断言等待机制 请参见
  • 找到将小数转换为整数的公共乘数的算法

    我有一个可能最多有 8 位小数的数字数组 我需要找到可以将它们相乘的最小公共数 以便它们都是整数 我需要这个 以便所有原始数字都可以乘以相同的比例 并由仅处理整数的密封系统进行处理 然后我可以检索结果并将它们除以公共乘数以获得相对结果 目前
  • geom_text 在所有方面写入所有数据

    我将 ggplot 与facet grid 一起使用 我想在每个方面指示每个方面的观察数量 我遵循许多网站上提供的示例 但是当我让它写任何东西时 它会在所有四个图上将所有四个观察数字写在彼此之上 这里是 geom text 图层命令 geo
  • macOS SwiftUI 表超过 10 列?

    我尝试添加 Group 技巧以在 Table 视图中获取超过 10 个元素 但是无法编译 就像有超过 10 个元素没有组一样 var body some View Table viewModel tableArrayOfStructs so
  • Mysql 连接器花费 50% 的时间在 com.mysql.jdbc.util.ReadAheadInputStream.fill()

    我正在分析使用 Spring Hibernate 和 mysql java connector 的应用程序 VisualVM显示超过50 的CPU时间花费在com myql jdbc utils ReadAheadInputStream f
  • Android sqlite 多线程

    我正在编写一个 Android 应用程序 使用sqlite 有多种活动和一项服务 我从多个线程使用数据库 它完美地工作在Android 2 X 但是一旦我运行它Android 3 X它总是抛出这个错误并且Force Close 05 04
  • 将自定义方法集成到 LINQ to Entities 查询中

    我有一个自定义方法 可以对一组数据执行一些计算 private int GetPercentages int OriginalValue int TotalValue var newValue int Math Round decimal
  • 刷新Core Data数据库的正确方法

    我的应用程序经过设置 以便在首次使用时 它会从基于 Web 的 xml 源下载所需的数据 用户还可以选择通过设置定期刷新数据 当他们这样做时 我想删除现有数据库 然后通过我用于第一次加载的代码重新创建它 我读到 简单地删除数据库并不是执行此
  • Android 中的 MD5 哈希

    我有一个简单的 Android 客户端 需要与一个简单的 C HTTP 侦听器 对话 我想通过在 POST 请求中传递用户名 密码来提供基本级别的身份验证 MD5 哈希在 C 中是微不足道的 并且为我的需求提供了足够的安全性 但我似乎无法找
  • 从ggplot2中提取颜色信息?

    使用保存在名为的文件中的虚拟代码foo txt COG station1 station2 station3 station4 station5 COG000Z 0 019393497 0 183122497 0 089911227 0 2
  • 如何在 ASP.NET Core 中使用区域

    我如何使用Area在 ASP NET Core 中 我有一个需要管理部分的应用程序 该部分要求将其视图放置在该区域中 所有以以下开头的请求Admin 需要重定向到该区域 为了在 ASP NET Core 应用程序中包含区域 首先我们需要在S
  • Angular2升级到RC6,找不到traceur

    升级到后RC6 出现以下错误 zone js 101 GET http localhost traceur 404 Not Found zone js 484 Unhandled Promise rejection Error XHR er
  • 为什么我的正则表达式中存在多个捕获组会使我的应用程序崩溃?

    无论正则表达式是什么 gt 1 个捕获组都会导致此代码崩溃并出现以下错误 由于未捕获的异常 NSRangeException 而终止应用程序 原因 NSCFString substringWithRange 范围 9223372036854
  • 如何仅从 JdbcTemplate queryForList 返回 String 对象?

    默认情况下 queryForList 返回每个 for 作为Map
  • 索引越界错误

    我正在开发一个程序 将保存的小部件重新创建回边界面板 当我创建它们时 我还尝试将值放入 ArrayList 中 这样如果我想更新并保存打开的项目 我应该能够通过从 ArrayList 获取值来完成此操作 代码如下所示 for int i 0
  • MySQL 在一对多关系匹配多个条件的查询中遇到困难

    我有两张表 大致如下 products product attributes id name id product id attribute value 1 product 1 1 1 size big 2 product 2 2 1 co
  • iOS 定时器在后台运行

    我的应用程序需要定期调用一个方法 即使应用程序已置于后台 也应执行此调用 应用程序可以处于后台的时间是未定义的 应用程序可以从后台恢复到任何时间 我有一个类来管理计时器 protocol TimerDelegate
  • 更正所有出现的拼写错误单词

    有没有快速重复拼写更正的方法 例如 更改每次出现的teh to the使用后 set spell z 纠正第一次出现的情况 After making the first correction with z e g teh to the us
  • 通过向量 [i] 进行线性搜索会产生 0 毫秒响应,而向量.at(i) 会产生时间

    我必须补充一点 我调用线性搜索 15 000 次 每次迭代我查找的最低范围最多为 50 000 次 因此 这意味着第一次迭代有 15 000 50 000 次查找 这应该需要比 0ms 更长的时间 我有这个基本的线性搜索 bool line