从双斜率,野人除法看性能优化

人呐,天生对线性的推崇,却在内心又对线性的不爱。一开始人们总是从最简单的线性过程入手,但最终都难免因为不满足而进入指数过程。

看一个 Linux kernel 老式 O(1) 调度器的时间片计算函数的演化:
在这里插入图片描述

早期的 O(1) 是一个连续线性函数,但不出所料最终还是变成了双斜率。

很明显,最终用双斜率分段函数替代线性函数,放大了动态范围,意思是,优先级越高,优势感越强。注意,这里体现了规模效应,基于当前的基础优先级,与当前基础优先级成比例增加时间片,而不仅仅基于优先级绝对值。

如果更平滑一点,做成多斜率分段函数,这就是指数函数了。这里道出了本质,指数函数就是多斜率分段线性函数的平滑拟合版本,这也是微积分导数的逆版本。这个本质意味着,熵减过程的最优化版本都是基于规模而不是基于绝对值的。这决定了最快的查找算法复杂度上限就是指数过程指数求解的 logn 级别。

双斜率是一个最朴素的从线性过程到指数过程的迭代过程。

为啥会这样?每个人深有体会,如果你在跑步,跑着跑着就快了,就多了,抽烟喝酒也一样,最终不可收拾。

最简单的例子就是二分法,对应 TCP 等传输协议典型的实例就是慢启动,BIC 等。此外,还有一个更加典型的例子,即不用除法的快速除法。

有点懵是吧,这一切有什么关联?不用除法如何做除法?除法只是后人总结出来的 “算法”,即一系列步骤,而不是本质。不用九九乘法表,不列竖式算除法,如何算,我们从原始人分割食物说起。参见早期我写的一篇文章 野人如何做除法。

常规做法就是不同用被除数减去除数,扔掉最后的余数或者继续分余数,但显然这样效率太低,能不能加速呢?这就涉及到了规模效应,类似慢启动,“若仍然可行,则行为加倍”,来看野人除法,下面的算法来自我上面引用的文章:

#!/Users/zhaoya/myenv/bin/python3def div1(a, divisor, depth):res = 1if depth > 6 or a == 0:return 0while divisor <= a:res += 1a -= divisorreturn res - 1 + div1(a*10, divisor, depth + 1)/10
就像跑步,跑着跑着就快了,野人祖先们不可能满足于上面低效的步骤,“若仍然可行,则行为加倍”,这是指数的指导意义,总有野人希望让那个 while 循环更快些,于是:
#!/Users/zhaoya/myenv/bin/python3def div2(a, divisor, depth):res = 1if depth > 6:return 0elif a < divisor:return div2(a*10, divisor, depth + 1)/10b = divisorwhile 2*b <= a:res = 2*resb = 2*breturn res + div2(a - b, divisor, depth)

如果你的知识储备足够,仔细看这两个算法的迭代过程,会发现什么,这就是 Reno TCP 到 BIC TCP 的迭代过程,div1 属于遍历逼近除数,div2 属于二分逼近除数。

核心是什么,核心不是二分法,而是 “你希望在现有基础上做增量,跑起来就想更快,要有加速度”,“现有基础” 是本质,炒股赔了的也是因为这。上面的 div2,稍微改一下成为 div3,3 个放在一起看:

#!/Users/zhaoya/myenv/bin/python3cnt1, cnt2, cnt3 = 0, 0, 0
def div1(a, divisor, depth):global cnt1res = 1if depth > 5 or a == 0:return 0while divisor <= a:cnt1 += 1res += 1a -= divisorreturn res - 1 + div1(a*10, divisor, depth + 1)/10def div2(a, divisor, depth):global cnt2res = 1if depth > 6:return 0elif a < divisor:return div2(a*10, divisor, depth + 1)/10b = divisorwhile 2*b <= a:cnt2 += 1res = 2*resb = 2*breturn res + div2(a - b, divisor, depth)def div3(a, divisor, depth):global cnt3res = 1if depth > 6:return 0elif a < divisor:return div3(a*10, divisor, depth + 1)/10b = divisorwhile 5*b <= a:cnt3 += 1res = 5*resb = 5*breturn res + div3(a - b, divisor, depth)r1 = div1(10000, 13, 0)
r2 = div2(10000, 13, 0)
r3 = div3(10000, 13, 0)
print(r1, r2, r3, cnt1, cnt2, cnt3)

看一下结局:

(myenv) zhaoya@zhaoyadeMacBook-Pro pytest % ./3div.py
769.23076 769.230769 769.230769 787 28 13

结果一致,但 div2 和 div3 与 div1 相比,计算步骤少了很多,这就是优化。最终,当你深入探究二分,三分,五分有什么区别时,你会发现它们都是 log 函数,这就是 O(logn) 的由来。

回过头来看,慢启动,BIC TCP,Cubic TCP,双斜率,是不是就是一回事了?

浙江温州皮鞋湿,下雨进水不会胖。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/883582.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

vue 解决:npm ERR! code ERESOLVE 及 npm ERR! ERESOLVE could not resolve 的方案

1、问题描述&#xff1a; 其一、需求为&#xff1a; 想要安装项目所需依赖&#xff0c;成功运行 vue 项目&#xff0c;想要在浏览器中能成功访问项目地址 其二、问题描述为&#xff1a; 在 package.json 文件打开终端平台&#xff0c;通过执行 npm install 命令&#xff0c…

【MySQL】视图特性 用户管理

> 作者&#xff1a;დ旧言~ > 座右铭&#xff1a;松树千年终是朽&#xff0c;槿花一日自为荣。 > 目标&#xff1a;了解什么是视图&#xff0c;我们又该如何管理用户。 > 毒鸡汤&#xff1a;有些事情&#xff0c;总是不明白&#xff0c;所以我不会坚持。早安! >…

kafka 如何减少数据丢失?

大家好&#xff0c;我是锋哥。今天分享关于【kafka 如何减少数据丢失?】面试题&#xff1f;希望对大家有帮助&#xff1b; kafka 如何减少数据丢失? 1000道 互联网大厂Java工程师 精选面试题-Java资源分享网 Apache Kafka 是一个高吞吐量的分布式消息队列&#xff0c;广泛用…

前端对一个增删改查的思考

1、来源&#xff1a;dify dify/web/app/components/workflow/nodes/question-classifier/components/class-list.tsx at main langgenius/dify GitHub 2、代码流程&#xff1a; 3、思索问题&#xff1a; 1、为啥要用return形式&#xff0c;而不是value直接当函数&#xff1…

SQL进阶技巧:如何求组内排除当前行的移动平均值?

目录 0 需求描述 2 数据准备 3 问题分析 4 小结 0 需求描述 -- 按照 日期,省份,等级 分组 求分数的平均值;但是需要剔除当前行的数据 2 数据准备 create table avgtest as (select 2024-10-24 as cdate, 广东 as province,深圳 as city, 2 as level, 200 as scoreunio…

ssm005基于SSM框架的购物商城系统的开发与实现(论文+源码)_kaic

设计题目&#xff1a;购物商城系统的设计与实现 摘 要 网络技术和计算机技术发展至今&#xff0c;已经拥有了深厚的理论基础&#xff0c;并在现实中进行了充分运用&#xff0c;尤其是基于计算机运行的软件更是受到各界的关注。加上现在人们已经步入信息时代&#xff0c;所以对…

【MyBatis】| JavaWeb基础教程学习笔记(上)

01-MyBatis简介 什么是MyBatis? MyBatis是一款优秀的持久层框架&#xff0c;用于简化JDBC开发MyBatis本是Apache的一个开源项目iBatis&#xff0c;2010年这个项目由apache software foundation迁移到了google code&#xff0c;并且改名为MyBatis。2013年11月迁移到Github官网…

双11必买物品清单有哪些?双11推荐购买清单推荐分享

随着一年一度的“双十一”购物狂欢节的到来&#xff0c;各大电商平台纷纷推出了各种优惠活动和促销策略&#xff0c;让消费者在享受购物乐趣的同时也能获得实实在在的优惠。然而&#xff0c;面对琳琅满目的商品和纷繁复杂的促销活动&#xff0c;双11必买物品清单有哪些成为了一…

【AIGC】从CoT到BoT:AGI推理能力提升24%的技术变革如何驱动ChatGPT未来发展

博客主页&#xff1a; [小ᶻZ࿆] 本文专栏: AIGC | ChatGPT 文章目录 &#x1f4af;前言&#x1f4af;迈向AGI的新跨越&#x1f4af;BoT与CoT的技术对比技术原理差异推理性能提升应用范围和通用性从错误中学习的能力总结 &#x1f4af;BoT的工作流程和机制初始化过程生成推…

网上摄影工作室:Spring Boot框架的应用实例

2相关技术 2.1 MYSQL数据库 MySQL是一个真正的多用户、多线程SQL数据库服务器。 是基于SQL的客户/服务器模式的关系数据库管理系统&#xff0c;它的有点有有功能强大、使用简单、管理方便、安全可靠性高、运行速度快、多线程、跨平台性、完全网络化、稳定性等&#xff0c;非常…

Redis——缓存

目录 前言 一、缓存基本概念 1.概念 2.二八定律 二、使用 Redis 作为缓存 三、缓存的更新策略 1.定期生成 2.实时生成 四、Redis 内存淘汰机制 1.通用淘汰策略 &#xff08;1&#xff09;FIFO &#xff08;2&#xff09;LRU &#xff08;3&#xff09;LFU &#…

buildroot制作自己的软件包(可以理解为应用程序)

以helloworld为例记录使用步骤 一&#xff1a;书写自己的源程序以及Makefile helloworld.c #include <stdio.h>int main(int argc, char **argv) {printf("hello world\r\n");return 0; }Makefile all: helloworldhelloworld: helloworld.o$(CC) -o hellow…

模型训练识别手写数字(二)

模型训练识别手写数字&#xff08;一&#xff09;使用手写数字图像进行模型测试 一、生成手写数字图像 1. 导入所需库 import cv2 import numpy as np import oscv2用于计算机视觉操作。 numpy用于处理数组和图像数据。 os用于文件和目录操作。 2. 初始化画布 canvas np.z…

Kaggle竞赛——灾难推文分类(Disaster Tweets)

目录 1. 准备工作2. 资源导入3. 数据处理4. 绘制词云图5. 数据可视化5.1 词数和字符数可视化5.2 元特征可视化5.3 类别可视化 6. 词元分析6.1 一元语法统计6.2 多元语法统计 7. 命名实体识别8. 推文主题提取9. 构建模型9.1 数据划分与封装9.2 模型训练与验证 10. 模型评估11. 测…

SQL:Windows下MySQL的安装教程(超详细)

一.系统环境&#xff1a; 操作系统&#xff1a; Windows11&#xff1b; MySQL版本&#xff1a; mysql-community-8.0.40.0&#xff1b; 二.MySQL下载&#xff1a; 访问MySQL 官网下载地址&#xff1a;https://www.mysql.com/&#xff0c;点击DOWNLOADS&#xff1b; 跳转后页…

Maven---依赖管理,项目构建工具

1.Maven安装和配置 1.1设置本地仓库 提前准备好仓库的位置,打开配置文件maven/conf/setting.xml 1.2配置阿里镜像源 在mirrors节点(标签)下添加阿里中央仓库镜像,把原本的镜像源注释掉,不要写在mirrors标签外 <mirror><id>alimaven</id><name>aliy…

6 款超实用的 Coze 插件,让你的智能体开发效率提升 200%

最近我一直在频繁使用 Coze 智能体&#xff0c;帮朋友和客户实现各种定制化需求。 Coze 不仅提供了强大的工作流编排能力和全面的功能节点&#xff0c;还有大量由开发者和平台上传的插件库支持。 对于智能体开发者来说&#xff0c;找到一款合适、好用的插件&#xff0c;真的能…

【实用知识】Spring Boot 优雅捕捉异常的几种姿势

&#x1f449;博主介绍&#xff1a; 博主从事应用安全和大数据领域&#xff0c;有8年研发经验&#xff0c;5年面试官经验&#xff0c;Java技术专家&#xff0c;WEB架构师&#xff0c;阿里云专家博主&#xff0c;华为云云享专家&#xff0c;51CTO 专家博主 ⛪️ 个人社区&#x…

JVM(HotSpot):GC之G1垃圾回收器

文章目录 一、简介二、工作原理三、Young Collection 跨代引用四、大对象问题 一、简介 1、适用场景 同时注重吞吐量&#xff08;Throughput&#xff09;和低延迟&#xff08;Low latency&#xff09;&#xff0c;默认的暂停目标是 200 ms超大堆内存&#xff0c;会将堆划分为…

华为云弹性云服务器无法登录远程操作

遇到的问题&#xff1a; 就是你在创建弹性云服务器的时候选择了没有子网的虚拟私有云&#xff0c; 你属于误删了虚拟私有云的子网&#xff0c;自己没有注意看 如果在华为云创建弹性云服务器时选择的虚拟私有云&#xff08;VPC&#xff09;没有配置子网&#xff0c;那么在尝试远…