【ortools源码系列11】 time_limit h头文件功能和源码分析

2023-12-17

【ortools源码系列】 time_limit h头文件功能和源码分析

TimeLimit 功能

TimeLimit 类是一个简单的时间限制工具,用于在同一线程中强制执行已过时间限制和确定性时间限制。它可以根据实际运行时间、确定性时间和指令计数来控制程序的运行。该类的主要功能包括:

  • 构造函数:可以设置wall time、确定性时间和指令计数限制。
  • LimitReached()方法:检查是否达到了时间限制,如果超过了限制则返回true。
  • GetTimeLeft()方法:返回剩余的时间限制。
  • AdvanceDeterministicTime()方法:提前确定性时间。
  • RegisterExternalBooleanAsLimit()方法:注册一个外部布尔值,当该布尔值为true时,LimitReached()方法将返回true。
  • DebugString()方法:以人类可读的形式返回有关时间限制对象的信息。

SharedTimeLimit 类是对 TimeLimit 类的封装,使其线程安全,并添加了Stop()方法来停止计时。它还可以更新本地时间限制和获取剩余时间。

NestedTimeLimit 类是基于 TimeLimit 类的嵌套时间限制工具,用于对算法中的特定部分设置更严格的时间限制。它接受一个基本的时间限制对象和一个特定部分的时间限制,并创建一个新的时间限制对象,该对象将在整体时间限制或特定部分的时间限制到期时终止。

总之, TimeLimit 类及其相关类提供了一组工具来控制程序的运行时间,并可以根据实际运行时间、确定性时间和指令计数来设置时间限制。这对于需要对算法的不同部分设置不同时间限制的情况非常有用。

TimeLimit 源码

#ifndef OR_TOOLS_UTIL_TIME_LIMIT_H_
#define OR_TOOLS_UTIL_TIME_LIMIT_H_

#include <algorithm>
#include <atomic>
#include <cstdlib>
#include <limits>
#include <memory>
#include <string>
#include <vector>

#include "absl/base/port.h"
#include "absl/container/flat_hash_map.h"
#include "absl/memory/memory.h"
#include "absl/synchronization/mutex.h"
#include "absl/time/clock.h"
#include "ortools/base/commandlineflags.h"
#include "ortools/base/logging.h"
#include "ortools/base/macros.h"
#include "ortools/base/timer.h"
#include "ortools/util/running_stat.h"
#ifdef HAS_PERF_SUBSYSTEM
#include "exegesis/exegesis/itineraries/perf_subsystem.h"
#endif  // HAS_PERF_SUBSYSTEM

// 启用更改TimeLimit类的行为,使用-b usertime而不是walltime。这对于基准测试非常有用。
ABSL_DECLARE_FLAG(bool, time_limit_use_usertime);

// 在TimeLimit类中添加支持测量执行的指令数。
ABSL_DECLARE_FLAG(bool, time_limit_use_instruction_count);

namespace operations_research {
   

// TimeLimit类是一个简单的类,用于在同一线程中强制执行已过时间限制和确定性时间限制。
// 其思想是尽可能频繁地调用LimitReached()方法,直到它返回false。然后程序应该尽快终止。
//
// 确定性限制用于确保可再现性。因此,必须手动使用AdvanceDeterministicTime()方法来提前确定性时间。
//
// 指令计数器用于跟踪执行的CPU指令数。它使用性能监控单元(PMU)计数器来跟踪指令计数。
//
// 该调用本身很快,只需CycleClock::Now()加上几个简单的指令,除非设置了time_limit_use_instruction_count标志。
//
// 限制非常保守:当current_time + max(T, ε) >= limit_time时,返回true(即达到限制),
// 其中ε是一个小常数(参见TimeLimit::kSafetyBufferSeconds),T是最后kHistorySize次调用LimitReached()之间的最大测量时间间隔(以便我们只考虑“最近”的历史记录)。
// 这样做是为了使实际超过时间限制的概率很小,而不会太早终止。
//
// 可以在更精细的级别上记录确定性时间限制:AdvanceDeterministicTime方法接受一个可选的字符串参数:计数器的名称。
// 在调试模式下,TimeLimit对象还会分别计算每个命名计数器的经过时间,并且可以使用这些值来从操作数计算确定性持续时间的系数。
// 计数器的值可以使用TimeLimit::DebugString()方法打印出来。由于在优化模式下不存在这些计数器,因此没有API直接访问计数器的值。
//
// 确定性时间的基本步骤是:
// 1. 在调试模式下运行代码,以收集确定性时间计数器的值。除非在优化模式下算法不同,否则在调试模式下的确定性计数器的值将与优化模式下的值相同。
// 2. 在优化模式下运行代码,以测量整个基准测试的实际(CPU)时间。
// 3. 根据实际时间和确定性计数器的值确定确定性时间的系数,例如通过解决方程
//    C_1*c_1 + C_2*c_2 + ... + C_N*c_N + Err = T
//    其中C_1是计数器c_1的未知系数,Err是随机测量误差,T是测得的实际时间。可以使用最小二乘法等方法解决该方程。
//
// 注意,在优化模式下,出于性能原因,禁用了计数器,并且调用AdvanceDeterministicTime(duration, counter_name)等效于调用AdvanceDeterministicTime(duration)。
class TimeLimit {
   
 public:
  static const double kSafetyBufferSeconds;
  static const int kHistorySize;

  explicit TimeLimit(
      double limit_in_seconds,
      double deterministic_limit = std::numeric_limits<double>::infinity(),
      double instruction_limit = std::numeric_limits<double>::infinity());

  TimeLimit() : TimeLimit(std::
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

【ortools源码系列11】 time_limit h头文件功能和源码分析 的相关文章

  • 在Windows上通过cmake-gui及VS2019来 编译OpenCV-4.5.3源码

    文章目录 下载OpenCV 4 5 3源码 下载opencv contrib 4 5 3源码 打开cmake gui 选择生成器 通过 Visual Studio 2019 打开构建好的 sln工程文件 执行编译操作 执行安装操作
  • 屏幕超时休眠-Android13

    屏幕超时休眠 Android13 1 设置界面 1 2 属性值 1 2 1 默认值 1 2 2 最小值限制 1 3 属性值疑问 Settings System SCREEN OFF TIMEOUT 2 超时灭屏
  • OSG中几何体的绘制(一)

    本章主要介绍一些几何体的绘制方法 绘制几何体在场景中是非常常见的 也是最基本的 在很多应用程序中可以看到相当复杂的场景 但不管场景有多复杂 它们都是由少数几个基本的图形元素构建而成的 只要想想达芬奇那些伟大的作品也是由铅笔和画刷所完成的 读

随机推荐

  • xtcocotools 安装 mmcv

    目录 xtcocotools 2023测试成功 mmcv安装方法 xtcocotools 2023测试成功 pip install xtcocotools mmcv安装方法 pip install U openmim mim install
  • 星纵物联2024届秋招/校招内推信息/内推码

    公司名称 星纵物联 内推码 ESVMA3 内推来源 内推鸭小程序 官方招聘网站 厦门星纵物联招聘官网
  • yyy888

    8
  • MyBatis中的MapperScan的作用是干什么的?

    MapperScan 是 MyBatis Plus 提供的注解 它的作用是扫描指定包下的所有接口 将其注册成 MyBatis 的 Mapper 在 MyBatis Plus 中 它是用于替代原生 MyBatis 中 XML 配置文件中的
  • HarmonyOS(十四)——状态管理之@State装饰器(组件内状态)

    前言 在 初识状态管理 我们了解了状态管理的基本概念 以及管理组件拥有的状态有哪几种装饰器 今天我们就来认识一下第一种装饰器 State装饰器 组件内状态 概述 State装饰的变量 或称为状态变量 一旦变量拥有了状态属性 就和自定义组件的
  • LeetCode经典150题Golang版.121. 买卖股票的最佳时机

    题目 121 买卖股票的最佳时机 给定一个数组 prices 它的第 i 个元素 prices i 表示一支给定股票第 i 天的价格 你只能选择 某一天 买入这只股票 并选择在 未来的某一个不同的日子 卖出该股票 设计一个算法来计算你所能获
  • Node.js 工作线程与子进程:应该使用哪一个

    Node js 工作线程与子进程 应该使用哪一个 并行处理在计算密集型应用程序中起着至关重要的作用 例如 考虑一个确定给定数字是否为素数的应用程序 如果我们熟悉素数 我们就会知道必须从 1 遍历到该数的平方根才能确定它是否是素数 而这通常非
  • 优质全套Spring全套教程

    hello 我是小索奇 这里把Spring全套笔记分享出来哈 便于大家查看 一起加油 Spring 1 Spring简介 1 1 Spring概述 官网地址 Spring Home Spring 是最受欢迎的企业级 Java 应用程序开发框
  • 学习区分dB、dBm、dBuV、dBi

    dB 对于分贝的概念 很多朋友最早接触这个概念 是用 分贝 评估声音的大小 声音的大小用分贝 dB 表示 是一种对数单位 用来描述声音的强度或功率比例 如果P是我们需要测试的声压级或声功率级 P0是参考值 通常取为标准听觉阈限的声压级 X
  • 最强Pose模型RTMO开源 | 基于YOLO架构再设计,9MB+9ms性能完爆YOLO-Pose

    实时多人在图像中的姿态估计面临着在速度和精度之间实现平衡的重大挑战 尽管两阶段的上下文方法在图像中人数增加时会减慢速度 但现有的单阶段方法往往无法同时实现高精度和实时性能 本文介绍了RTMO 这是一个单阶段姿态估计框架 通过在YOLO架构中
  • 腾讯技术工程总结-主流消息队列你了解哪些?

    文章参考 腾讯技术工程 关于消息队列的知识总结 主流消息队列你了解哪些 消息队列的发展历程 2003 年至今有很多优秀的消息队列诞生 如 kafka 阿里自研的 rocketmq 以及后起之秀 pulsar 消息队列在刚出现所需要解决的问题
  • 时序预测 | Python实现CNN-LSTM电力需求预测

    时序预测 Python实现CNN LSTM电力需求预测 目录 时序预测 Python实现CNN LSTM电力需求预测 预测效果 基本描述 程序设计 参考资料
  • 优质全套SpringMVC教程

    三 SpringMVC 在SSM整合中 MyBatis担任的角色是持久层框架 它能帮我们访问数据库 操作数据库 Spring能利用它的两大核心IOC AOP整合框架 1 SpringMVC简介 1 1 什么是MVC MVC 是一种软件架构的
  • MySQL数据库 DML

    目录 DML概述 添加数据 修改数据 删除数据 DML概述 DML英文全称是Data Manipulation Language 数据操作语言 用来对数据库中表的数据记录进行增 删 改操作 添加数据 工NSERT 修改数据 UPDATE 删
  • 【毕设项目】视频人像背景替换器-抠出视频中人像到动态背景中去

    描述 环境 简而言之 使用人体语义分割实现抠图替换动态背景 首先毫无疑问就是环境配置 附上链接 开始使用 飞桨 源于产业实践的开源深度学习平台 paddlepaddle org cn https www paddlepaddle org c
  • 第二百一十回

    文章目录 1 概念介绍 2 实现方法 2 1 整体思路 2 2 具体步骤 3 代码与效果 3 1 示例代码 3 2 运行效果 4 内容总结
  • MySQL数据库 DCL

    目录 DCL概述 管理用户 权限控制 DCL概述 DCL英文全称是 Data Control Language 数据控制语言 用来管理数据库用户 控制数据库的访 问权限 管理用户 1 查询用户 select from mysql user
  • 【算法刷题】每日打卡——动态规划(1)

    背包问题 例题一 有 N件物品和一个容量是 V 的背包 每件物品只能使用一次 第 i件物品的体积是 vi 价值是 wi 求解将哪些物品装入背包 可使这些物品的总体积不超过背包容量 且总价值最大 输出最大价值 输入格式 第一行两个整数 N V
  • 机器学习 高维数据可视化:t-SNE 降维算法

    作者简介 人工智能专业本科在读 喜欢计算机与编程 写博客记录自己的学习历程 个人主页 小嗷犬的个人主页 个人网站 小嗷犬的技术小站 个人信条 为天地立心 为生民立命 为往圣继绝学 为万世开太平 本文目录 t SNE 简介 sklearn 中
  • 【ortools源码系列11】 time_limit h头文件功能和源码分析

    ortools源码系列 time limit h头文件功能和源码分析 文章目录 ortools源码系列 time limit h头文件功能和源码分析 TimeLimit 功能 TimeLimit 源码 SharedTimeLimit 功能