当前位置: 首页 > wzjs >正文

哪家公司做网站结算好如何免费制作自己的网站

哪家公司做网站结算好,如何免费制作自己的网站,adsl做网站,网站做优化需要哪些后台信息文章目录 1. 什么是定时器2. 需要考虑的问题吧3. 接口设计4. 完整代码5. 性能优化 来自:腾讯百度C二面:手撕定时器_哔哩哔哩_bilibili 腾讯、网易、百度C: 手撕定时器 相关概念参考: C八股——函数对象、Lambda、bind、functi…

文章目录

    • 1. 什么是定时器
    • 2. 需要考虑的问题吧
    • 3. 接口设计
    • 4. 完整代码
    • 5. 性能优化

来自:腾讯百度C++二面:手撕定时器_哔哩哔哩_bilibili

腾讯、网易、百度C++

手撕定时器

相关概念参考

  • C++八股——函数对象、Lambda、bind、function_c++八股文-CSDN博客
  • C++八股——网络编程之IO多路复用-CSDN博客

1. 什么是定时器

定时器(Timer)是用来管理大量延时任务(异步执行,一般用回调函数)的模块,它会触发执行最近将要超时的任务。

2. 需要考虑的问题吧

  • 如何选择数据结构

    需要满足以下要求:

    • 触发时刻作为key,任务作为val
    • 能快速找到最近要超时的任务
    • 触发后要删除该任务且支持随时删除任务
    • 允许相同时刻触发任务

    一些框架中使用的数据结构是最小堆、红黑树和时间轮。

    这里我们可以使用STL中的multimap(基于红黑树)

  • 设计“任务”

    使用函数对象

  • 如何触发

    • 使用epoll_wait中的第四个参数 —— 超时参数
    • timerfd有三个接口,记忆难度较大,可以不考虑

3. 接口设计

  • 添加一个延时任务
  • 删除一个延时任务
  • 检测触发延时任务

4. 完整代码

timer.h

#include <sys/epoll.h>
#include <functional>
#include <chrono>
#include <map>
#include <memory>
#include <iostream>class Timer;
class TimerTask {friend class Timer;
public:using Callback = std::function<void(TimerTask* task)>;TimerTask(uint64_t addtime, uint64_t exectime, Callback func) {m_addtime = addtime;m_exectime = exectime;m_func = std::move(func);}uint64_t AddTime() const {return m_addtime;}uint64_t ExecTime() const {return m_exectime;}private:void run() {m_func(this);}uint64_t m_addtime;uint64_t m_exectime;Callback m_func;
};class Timer {using Millisecond = std::chrono::milliseconds;
public:static uint64_t GetTick() {// 获取系统启动到现在时刻经过的时间auto sc = std::chrono::time_point_cast<Millisecond>(std::chrono::steady_clock::now());auto temp = std::chrono::duration_cast<Millisecond>(sc.time_since_epoch());return temp.count();}// 添加定时器,std::shared_ptr<TimerTask> AddTimeout(uint64_t offset, TimerTask::Callback func) {uint64_t now = GetTick();uint64_t exectime = now + offset;auto task = std::make_shared<TimerTask>(now, exectime, std::move(func));if (m_timeouts.empty() || exectime >= m_timeouts.crbegin()->first) {auto ele = m_timeouts.emplace_hint(m_timeouts.end(), exectime, task);return ele->second;}auto ele = m_timeouts.emplace(exectime, task);return ele->second;}// 删除定时器,由于存在多个同时触发的定时器,所以需要在满足触发时间的任务重寻找需要删除的定时器void DelTimeout(std::shared_ptr<TimerTask> task) {auto range = m_timeouts.equal_range(task->ExecTime());for (auto it = range.first; it != range.second;) {if (it->second == task) {it = m_timeouts.erase(it);} else {++it;}}}// 更新定时器void Update(uint64_t now) {auto it = m_timeouts.begin();while (it != m_timeouts.end() && it->first <= now) {it->second->run();// delete it->second;it = m_timeouts.erase(it);}}// 获取最近的超时时间int WaitTime() {auto it = m_timeouts.begin();if (it == m_timeouts.end()) {return -1;}int diss = it->first - GetTick();return diss > 0 ? diss : 0;}private:std::multimap<uint64_t, std::shared_ptr<TimerTask>> m_timeouts;
};

example.cpp

#include "timer.h"using namespace std;int main() {int epfd = epoll_create(1);unique_ptr<Timer> timer = make_unique<Timer>();int i = 0;timer->AddTimeout(1000, [&](TimerTask* task) {cout << Timer::GetTick() << " addtime:" << task->AddTime() << " revoked times:" << ++i << endl;});timer->AddTimeout(2000, [&](TimerTask* task) {cout << Timer::GetTick() << " addtime:" << task->AddTime() << " revoked times:" << ++i << endl;});timer->AddTimeout(3000, [&](TimerTask* task) {cout << Timer::GetTick() << " addtime:" << task->AddTime() << " revoked times:" << ++i << endl;});auto task = timer->AddTimeout(2100, [&](TimerTask* task) {cout << Timer::GetTick() << " addtime:" << task->AddTime() << " revoked times:" << ++i << endl;});timer->DelTimeout(task);cout << "now time:" << Timer::GetTick() << endl;epoll_event ev[64] = {};while(true) {cout << "waittime:" << timer->WaitTime() << endl;int n = epoll_wait(epfd, ev, 64, timer->WaitTime());time_t now = Timer::GetTick();for (int i = 0; i < n; i++) {/**/}timer->Update(now);}return 0;
}

5. 性能优化

  • 针对 不同功能或不同对象 设置定时器

  • 针对多线程进行优化:一个时间线程一个定时器 或者 单独时间轮线程

  • 针对有规律的定时任务(有大量相同时间间隔的延时任务)

    采用emplace_hint接口,如timer.h中的52 - 55

    emplace_hint函数可以在指定的迭代器后面插入元素,它可以提高插入效率,因为它减少了元素的移动和复制操作。通过提供插入位置的提示,emplace_hint 可以尽可能地减少容器的重新分配和元素的移动,特别是在有序容器中插入元素时,这种优化尤为明显。

http://www.dtcms.com/wzjs/291759.html

相关文章:

  • 手机怎么创网站免费下载网站设计的毕业论文
  • 体检营销型网站营销网站案例
  • 网站的建设部署与发布人力资源培训机构
  • 打不开网站怎么办html模板网站
  • 那个网站上找工程造价私活做长春seo代理
  • 如何设置企业网站跨境电商培训机构哪个靠谱
  • 在什么网站能帮人做ppt微信营销推广
  • 阿里云服务器可以做下载类网站吗东莞关键字排名优化
  • 青羊区建设局网站百度广告买下的订单在哪里找
  • 广告建设网站建设整合营销沟通
  • 网站开发卖东西快速排名生客seo
  • 政府门户网站建设背景百度新闻排行榜
  • 单页网站怎么做外链优秀的营销策划案例
  • 网站设计联系方式杭州seo网络推广
  • 长春互联网推广武汉seo
  • 什么游戏不用登录直接玩seo规则
  • 万家建设有限公司网站营销战略有哪些内容
  • 有哪些网站用java做的20个排版漂亮的网页设计
  • 怎么根据别人的网站做自己的网站360网站排名优化
  • 做企业平台的网站有哪些凡科网免费建站官网
  • php做网站的分站百度公司的企业文化
  • 用ps怎么做网站导航条常州网站建设优化
  • 广州英铭网站建设惠州seo公司
  • 西安网约车租赁公司哪家好sem优化技巧
  • 在西部数码上再备案一个网站ftp网络营销软文范例300字
  • 社保个人网页登录网络优化的流程
  • 什么做网站做个多少钱啊市场调研的基本流程
  • wordpress两个网站同步站长工具seo综合查询网
  • wordpress接入微信支付网站推广的优化
  • 网站建设对客户的影响百度平台订单查询