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

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

看一个 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;广泛用…

简单记录ios打包流程

1、点击这里获取UDID 2、xcode登录开发者账户、确定唯一id&#xff08;Bundle ID&#xff09; 3、去这里注册appid 4、在这里这里创建app 5、之后xcode中打包

Mac 出现zsh: command not found: aapt

Mac 运行aapt命令 提示&#xff1a;zsh: command not found: aapt 这个问题是Mac本地没有配置 aapt的 环境变量。理论上本地有Android Studio&#xff0c;aapt是默认配置了的&#xff0c;无奈要用到aapt&#xff0c;还是配置下吧。 mac zsh 配置 aapt 环境变量的方法&#xf…

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

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必买物品清单有哪些成为了一…

面向对象进阶(下)(JAVA笔记第二十五期)

p.s.这是萌新自己自学总结的笔记&#xff0c;如果想学习得更透彻的话还是请去看大佬的讲解 目录 抽象方法和抽象类抽象方法定义格式抽象类定义格式抽象方法和抽象类注意事项 接口接口的定义接口中成员变量的特点接口中没有构造方法接口中成员方法的特点在接口中定义具有方法体…

vue3中ref和reactive的用法,区别和优缺点,以及使用场景

写在前头&#xff1a; reactive定义的数据只能修改里面的属性&#xff0c;不能将整个数据替换&#xff0c;实在要替换请使用 Object.assign(obj1, obj2);举个例子 这种写法无法直接改变obj1 let obj1 reactive({name: 猫,age: 2, });obj1 {name: 猪,age: 2, } 正确的写法…

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

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

LLVM - 编译器前端-llvm:IRBuilder 介绍

一:概述 llvm::IRBuilder 是 LLVM 中的一个重要类,用于方便地构建 LLVM 中间表示(IR)。它提供了一种高层次的接口,使得生成和操作 IR 更加简洁和高效。通过使用 IRBuilder,开发者可以轻松地创建基本块、指令、函数等,而不需要直接操作低级别的 LLVM API。它的主要功能有…

网上摄影工作室: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 &#…

ubantu 编译安装ceph 18.2.4

下载ceph代码 git clone https://github.com/ceph/ceph.git #切换tag git checkout v18.2.4 -b v18.2.4 #下载子模块 会有报错重新执行即可 git submodule update --init --recursive安装ceph所需要的依赖 #curl命令安装 sudo apt install curl#安装ceph依赖 ./install-deps.…

SQL内外连接详解

SQL中的内连接&#xff08;INNER JOIN&#xff09;和外连接&#xff08;包括左外连接LEFT JOIN/LEFT OUTER JOIN、右外连接RIGHT JOIN/RIGHT OUTER JOIN&#xff09;是用于从两个或多个表中组合数据的技术。这里用一些简单的例子来帮助理解。 内连接&#xff08;INNER JOIN&am…

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…

API接口:驱动日常生活便利与商业决策智慧的关键力量

1. 日常生活中的应用 智能家居 场景描述&#xff1a;智能家居系统通过集成各种设备的API接口&#xff0c;实现远程控制和自动化。例如&#xff0c;通过API接口&#xff0c;用户可以通过手机应用控制家中的灯光、温度、安防系统等。案例&#xff1a;某智能家居品牌通过集成智能…