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

ThreadCache

目录

一、Freelist        

二、ThreadCache

三、哈希桶映射规则

一、Freelist        

        在之前整体框架介绍的时候,我们曾说过ThreadCache是一个哈希桶的结构。每一个桶都要存同一个大小的对象块(即最小块的内存)。

        那么我们使用FreeList来当做桶,存放这些小块内存。

Freelist的结构

//管理切分好的小对象的自由链表
class FreeList
{
public:void Push(void* obj){assert(obj);//头插*(void**)obj = _freeList;_freeList = obj;_size++;}void PushRange(void* start, void* end, size_t n)//范围型的插入{*(void**)end = _freeList;_freeList = start;_size += n;}void* Pop(){assert(_freeList);//头删void* obj = _freeList;_freeList = *(void**)obj;--_size;return obj;}void PopRange(void*& start, void*& end, size_t n)//start和end是输出型参数{assert(n <= _size);start = _freeList;end = start;for (int i = 0; i < n - 1; i++)end = *(void**)end;_freeList = *(void**)end;*(void**)end = nullptr;_size -= n;}bool Empty(){return _freeList == nullptr;}size_t& MaxSize(){return _maxSize;}size_t Size(){return _size;}
private:void* _freeList = nullptr;size_t _maxSize = 1;//记录ThreadCache一次性最多向CentralCache申请多少个对象size_t _size = 0;//记录自由链表中挂的内存个数
};

二、ThreadCache

        ThreadCache要实现以下逻辑:其中Allocate和Deallocate是普通的申请和释放,而FetchFromCentralCache是保证在ThreadCache的freelist中没有内存块的时候,可以向CentralCache中要一定数量的内存块。当freelist中的内存块挂的太多了,通过listTooLong将其归还到CentralCache中。

#pragma once
#include"Common.hpp"
#include"CentralCache.hpp"class ThreadCache
{
public:// 申请和释放内存对象void* Allocate(size_t size);void Deallocate(void* ptr, size_t size);// 从中心缓存获取对象void* FetchFromCentralCache(size_t index, size_t size);// 释放对象时,链表过长时,回收内存回到中心缓存void ListTooLong(FreeList& list, size_t size);private:FreeList _freelists[NFREELISTS];
};//TLS无锁访问
thread_local ThreadCache* pTLSThreadCache=nullptr;-------------------------------------------------------------------------------void* ThreadCache::Allocate(size_t size)
{assert(size <= MAX_Bytes);//1.根据size,在合适的定长桶中拿内存块size_t alignSize = SizeClass::AlignUp(size);size_t index = SizeClass::Index(size);if (!_freelists[index].Empty()){return _freelists[index].Pop();}//2.如果对应的桶中没有内存块了,找CentralCache拿一大块,再切分else{return FetchFromCentralCache(index,alignSize);}
}void ThreadCache::Deallocate(void* ptr, size_t size)
{assert(size <= MAX_Bytes);assert(ptr);//1.把该内存块归还到对应的桶中size_t index = SizeClass::Index(size);_freelists->Push(ptr);//2.如果桶里挂的太多了,还给CentralCacheif (_freelists[index].Size() >= _freelists[index].MaxSize()){ListTooLong(_freelists[index],size);}}void ThreadCache::ListTooLong(FreeList& list, size_t size)
{//把一个批量的内存块从freelist中拿出来,链接到CentralCache的Span的freelist中void* start = nullptr;void* end = nullptr;list.PopRange(start,end, list.MaxSize());CentralCache::GetInstance()->ReleaseListToSpans(start,size);
}void* ThreadCache::FetchFromCentralCache(size_t index, size_t size)
{//采用慢开始的反馈调节算法,小对象给多一点,大对象给少一点size_t batchNum = min(_freelists[index].MaxSize(), SizeClass::NumMoveSize(size));if (_freelists[index].MaxSize() == batchNum){_freelists[index].MaxSize() += 1;}//用两个指针来接收中心缓存得到的内存空间的起始、结束地址void* begin = nullptr;void* end = nullptr;//需要massnum个对象,但是实际上不一定有这么多个,返回值为实际上获取到的个数size_t factNum = CentralCache::GetInstance()->CentralCache::FetchRangeObj(begin, end, batchNum, size);//要batchNum个对象,每个对象的大小是sizeassert(factNum != 0);if (factNum == 1){assert(begin == end);return begin;}else{//如果从中心缓存获取了多个,则将第一个返回给threadcachee,然后再将剩余的内存挂在threadcache的自由链表中_freelists[index].PushRange(NextObj(begin), end, factNum - 1);return begin;}
}

TLS无锁访问

        我们知道每一个进程是独享一个内存地址空间的,而同一个进程内部的线程共享该进程的大部分资源,如堆区,全局变量等等。虽然线程有自己独立的栈区,但是栈是用于函数调用的时候存储局部变量了,出了该栈帧,变量就销毁没有用了。所以必须要有一个线程的空间,且能长久保存数据。那么如果每一个线程想要自己独立的空间怎么做呢?

        C++中有一个关键字叫做thread_local,只要被他修饰的变量都会被操作系统保存在线程独享的空间中(不是堆),这样以后在每个线程访问自己的变量就不会再需要加锁或者局部变量被覆盖的问题了。

三、哈希桶映射规则

        这里用到一个方法,也就是内存对齐!比如想要申请1~7字节的内存,先把它对齐为8字节再进行后续的操作,这么做的原因有两个: 一是因为如果申请多少内存就给多少内存,那么我们需要的哈希桶的数量就太多了,不合理. 二是因为释放内存时比较方便。当然这样会造成内碎片的问题,不过我们通过一定的规则将内碎片限制在10%左右。

内存对齐的具体规则:


为什么不都使用8字节对齐呢?

        因为若使用8字节对齐,共256KB内存一共要使用三万多个桶,也是不合理的这样的对齐方式只用使用208个桶!

        除此之外,我们还有一些用于计算桶号等的函数,为了方便管理我们统一放到一个类SizeClass中。关于这些函数我们只需要了解有这么个东西就行了,不用在意他具体是怎么实现的,现在AI如此发达,这种纯体力活可以交给AI代劳。

// 管理对齐和映射等关系
class SizeClass
{
public:// 整体控制在最多10%左右的内碎片浪费// [1,128]                  8byte对齐        freelist[0,16)// [128+1,1024]             16byte对齐       freelist[16,72)// [1024+1,8*1024]          128byte对齐      freelist[72,128)// [8*1024+1,64*1024]       1024byte对齐     freelist[128,184)// [64*1024+1,256*1024]     8*1024byte对齐   freelist[184,208)//一共208个桶static inline size_t AlignUp(size_t size)//将size向上对齐{if (size <= 128)return _AlignUp(size, 8);else if (size <= 1024)return _AlignUp(size, 16);else if (size <= 8 * 1024)return _AlignUp(size, 128);else if (size <= 64 * 1024)return _AlignUp(size, 1024);else if (size <= 256 * 1024)return _AlignUp(size, 8 * 1024);elsereturn _AlignUp(size, 1 << PAGE_SHIFT);}static inline size_t _AlignUp(size_t size, size_t align_number){return (((size)+align_number - 1) & ~(align_number - 1));}static inline size_t _Index(size_t bytes, size_t align_shift){return ((bytes + ((unsigned long long)1 << align_shift) - 1) >> align_shift) - 1;}// 计算映射的哪一个自由链表桶static inline size_t Index(size_t bytes){assert(bytes <= MAX_Bytes);// 每个区间有多少个链static int group_array[4] = { 16, 56, 56, 56 };if (bytes <= 128) {return _Index(bytes, 3);}else if (bytes <= 1024) {return _Index(bytes - 128, 4) + group_array[0];}else if (bytes <= 8 * 1024) {return _Index(bytes - 1024, 7) + group_array[1] + group_array[0];}else if (bytes <= 64 * 1024) {return _Index(bytes - 8 * 1024, 10) + group_array[2] + group_array[1]+ group_array[0];}else if (bytes <= 256 * 1024) {return _Index(bytes - 64 * 1024, 13) + group_array[3] +group_array[2] + group_array[1] + group_array[0];}else {assert(false);}return -1;}// 一次从中心缓存获取多少个static size_t NumMoveSize(size_t size){assert(size > 0);if (size == 0)return 0;// [2, 512],一次批量移动多少个对象的(慢启动)上限值// 小对象一次批量上限高// 小对象一次批量上限低size_t num = MAX_Bytes / size;if (num < 2)num = 2;if (num > 512)num = 512;return num;}// 计算一次向系统获取几个页// 单个对象 8byte// ...// 单个对象 256KBstatic size_t NumMovePage(size_t size){size_t num = NumMoveSize(size);size_t npage = num * size;npage >>= PAGE_SHIFT;if (npage == 0)npage = 1;return npage;}};

相关文章:

ThreadCache

目录 一、Freelist 二、ThreadCache 三、哈希桶映射规则 一、Freelist 在之前整体框架介绍的时候&#xff0c;我们曾说过ThreadCache是一个哈希桶的结构。每一个桶都要存同一个大小的对象块&#xff08;即最小块的内存&#xff09;。 那么我们使用FreeList来…...

c++中同步和异步,阻塞和非阻塞原理以及机制

在C中&#xff0c;同步与异步、阻塞与非阻塞是并发编程中的重要概念&#xff0c;它们描述了程序在执行任务时的行为模式。理解这些概念对于设计高效、响应良好的并发程序至关重要。下面我将详细介绍这些概念的原理和机制。 1. 同步与异步 同步&#xff08;Synchronous&#x…...

Python项目打包指南:PyInstaller与SeleniumWire的兼容性挑战及解决方案

前言 前段时间做一个内网开发的需求&#xff0c;要求将selenium程序打包成.exe放在内网的win7上运行&#xff0c;在掘金搜了一圈也没有发现相关文章&#xff0c;因此将过程中踩到的坑记录分享一下。 本文涵盖了具体打包操作、不同模块和依赖项的兼容性解决方案&#xff0c;以…...

浅谈微信视频号推荐算法

这次可能会稍微有点干货&#xff0c;但保证不晦涩~ 一、算法推荐的本质&#xff1a;猜你喜欢 vs 社交绑架​ 视频号的推荐系统本质上在做两件事&#xff1a; ​预测你的兴趣​&#xff1a;通过你的浏览、点赞、评论、分享等行为&#xff0c;分析你的偏好。​满足社交需求​&…...

selenium 常用方法

selenium 库的常用方法&#xff1a; 方法说明示例代码webdriver.Chrome()初始化 Chrome 浏览器实例。driver webdriver.Chrome()driver.get(url)访问指定的 URL 地址。driver.get("https://example.com")driver.find_element(By, value)查找第一个匹配的元素。elem…...

springboot中使用async实现异步编程

目录 1.说明 2.实现原理 3.示例 4.总结 1.说明 Async 是 Spring 框架提供的一个注解&#xff0c;用于标记方法为异步执行。被标记的方法将在调用时立即返回&#xff0c;而实际的方法执行将在单独的线程中进行。 Async 注解有一个可选属性&#xff1a;指定要使用的特定线程…...

【2024年蓝桥杯Java B组】省赛真题详细解析

【2024年蓝桥杯Java B组】省赛真题 距离比赛仅剩5天&#xff0c;大多数省份可能完成3-4题即可拿到省奖&#xff0c;2025年想要拿到省奖&#xff0c;需要高效利用时间&#xff0c;重点突破关键知识点和题型。这里以【2024年蓝桥杯Java B组省赛真题】为例&#xff0c;梳理我们最后…...

SQL:DDL(数据定义语言)和DML(数据操作语言)

目录 什么是SQL&#xff1f; 1. DDL&#xff08;Data Definition Language&#xff0c;数据定义语言&#xff09; 2. DML&#xff08;Data Manipulation Language&#xff0c;数据操作语言&#xff09; DDL和DML的区别 什么是SQL&#xff1f; SQL&#xff08;Structured …...

机器学习核心概念、算法分类与应用场景全解析

文章目录 一、基础任务与算法分类1. 分类任务&#xff08;监督学习&#xff09;2. 回归任务&#xff08;监督学习&#xff09;3. 聚类任务&#xff08;无监督学习&#xff09; 二、关键流程与技术细节1. 数据预处理2. 特征工程3. 数据集划分与评估 三、进阶技术1.深度学习2.强化…...

【leetcode】—416.分割等和子集

✏️ 关于专栏&#xff1a;专栏用于记录 LeetCode 中做题与总结 文章目录 分割等和子集▐ 题目描述▐ 题目示例▐ 题目提示▐ 思路&代码方法&#xff1a;动态规划 分割等和子集 ▐ 题目描述 题目链接&#xff1a;分割等和子集 给你一个 只包含正整数 的 非空 数组 nums …...

jemeter 之mysql驱动问题

问题 java.sql.SQLException: No suitable driver found for jdbc:mysql 解决 先把jar放到lib下 检查 JMeter 的 Classpath 在 JMeter 中&#xff0c;JDBC 驱动需要手动添加到 Classpath 中。 打开 JMeter 安装目录下的 bin/jmeter.properties 文件&#xff0c;找到 user.cla…...

隐私计算的崛起:数据安全的未来守护者

在信息技术&#xff08;IT&#xff09;的滚滚浪潮中&#xff0c;一种新兴技术正以惊人速度崭露头角——隐私计算&#xff08;Privacy-Preserving Computation&#xff09;。2025 年&#xff0c;随着数据泄露事件频发、全球隐私法规日益严格&#xff0c;以及企业对数据协作需求的…...

Excel计数、求和、统计、计算类函数

目录 一、计数函数1. COUNT2. COUNTA3. COUNTBLANK4. COUNTIF5. COUNTIFS 二、求和函数1. SUM2. SUMIF3. SUMIFS4. SUMPRODUCT 三、统计函数1. AVERAGE2. AVERAGEA3. AVERAGEIF 函数4. AVERAGEIFS 函数 四、其他常用计算函数1. MAX 与 MIN2. RANK3. MOD4. ROUND5. FLOOR6. INT7…...

解决 Kubernetes 中容器 `CrashLoopBackOff` 问题的实战经验

在 Kubernetes 集群中&#xff0c;容器状态为 CrashLoopBackOff 通常意味着容器启动失败&#xff0c;并且 Kubernetes 正在不断尝试重启它。这种状态表明容器内可能存在严重错误&#xff0c;如应用异常、依赖服务不可用、配置错误等。本文将分享一次实际排障过程&#xff0c;并…...

北师大具身AI的虚拟世界扩展!UNREALZOO:为具身智能打造高逼真度的虚拟世界

作者&#xff1a;Fangwei Zhong, Kui Wu, Churan Wang, Hao Chen, Hai Ci, Zhoujun Li, Yizhou Wang 单位&#xff1a;北京师范大学&#xff0c;北京航空航天大学&#xff0c;北京大学&#xff0c;BIGAI&#xff0c;澳门城市大学&#xff0c;新加坡国立大学 论文标题&#xf…...

2025 年浙江保安员职业资格考试高效备考指南​

浙江以创新活力著称&#xff0c;保安行业也在不断革新。2025 年考试报考条件常规&#xff0c;报名主要通过浙江省保安服务监管信息系统&#xff0c;方便快捷。​ 理论考试在传统知识基础上&#xff0c;加大对智能安防技术应用的考查&#xff0c;如人脸识别系统、智能监控报警系…...

创意设计:动态彩色数学爱心

设计理念 数学之美&#xff1a;使用心形线的数学方程&#xff08;心形曲线&#xff09;生成爱心形状。视觉吸引力&#xff1a;通过 Python 的 colorama 库添加颜色渐变效果。动态感&#xff1a;加入简单的动画&#xff0c;让爱心“跳动”。技术魅力&#xff1a;结合模块化编程…...

C++动态内存管理完全指南:从基础到现代最佳实践

一、动态内存基础原理 1.1 内存分配层次结构 内存类型生命周期分配方式典型使用场景静态存储区程序整个运行期编译器分配全局变量、静态变量栈内存函数作用域自动分配/释放局部变量堆内存手动控制new/malloc分配动态数据结构 1.2 基本内存操作函数 // C风格 void* malloc(s…...

ebpf: CO-RE, BTF, and Libbpf(一)

本文内容主要来源于Learning eBPF&#xff0c;可阅读原文了解更全面的内容。 概述 一个ebpf程序可以在一个kernel版本中编译&#xff0c;而在另外一个kernel版本上运行&#xff0c;即便两个kernel版本中有些结构体有变化。而BTF(BPF Type Format) 是能让ebpf有这种强大兼容性…...

Linux 递归查找并删除目录下的文件

在 Linux 中&#xff0c;可以使用 find 命令递归查找并删除目录下的文件 1、示例命令 find /path/to/directory -type f -name "filename_pattern" -exec rm -f {} 2、参数说明 /path/to/directory&#xff1a;要查找的目标目录type f&#xff1a;表示查找文件&am…...

使用人工智能大模型腾讯元宝,如何快速编写活动记录?

今天我们学习使用人工智能大模型腾讯元宝&#xff0c;如何快速编写活动记录&#xff1f; 手把手学习视频地址https://edu.csdn.net/learn/40402/666457 第一步在腾讯元宝对话框中输入如何协助老师写教研活动记录&#xff0c;通过提问&#xff0c;我们了解了老师写教研活动记录…...

File 类的用法和 InputStream, OutputStream 的用法

1 文件系统的操作 创建文件&#xff0c;删除文件&#xff0c;创建目录&#xff0c;重命名文件&#xff0c;判定文件存在... Java中提供file类进行文件系统操作&#xff0c;使用路径进行初始化表示具体的文件&#xff08;可以存在&#xff0c;也可以不存在&#xff09;&#xf…...

buuctf--[湖南省赛2019]Findme

目录 前沿 解题过程 分析 ​p1 P2 p3 p4 p5 前沿 其实对于这道题呢&#xff0c;我的想法是不知道怎么判断的&#xff0c;这个题你说他难吧&#xff0c;他用的都是比较基础的东西&#xff0c;说他简单吧&#xff0c;他有太复杂的过程&#xff0c;总体来讲&#xff0…...

【从0到1学MybatisPlus】MybatisPlus入门

Mybatis-Plus 使用场景 大家在日常开发中应该能发现&#xff0c;单表的CRUD功能代码重复度很高&#xff0c;也没有什么难度。而这部分代码量往往比较大&#xff0c;开发起来比较费时。 因此&#xff0c;目前企业中都会使用一些组件来简化或省略单表的CRUD开发工作。目前在国…...

【S32M244 RTD200P04 LLD篇8】S32M244 PWM ADC LLD demo

【S32M244 RTD200P04 LLD篇8】S32M244 PWM ADC LLD demo 一&#xff0c;文档简介二&#xff0c;PWMTRGMUXPDBADC 2ch 软件配置与实现2.1 软硬件版本平台2.2 Demo CT 模块配置2.2.1 引脚配置2.2.2 时钟配置2.2.3 外设配置 2.3主程序调用情况 三&#xff0c; 测试结果 一&#xf…...

(蓝桥杯)动态规划蓝桥杯竞赛指南:动态规划解决最少钞票数问题(超详细解析+代码实现)

问题描述 近期&#xff0c;黄开的银行新发行了一种面额为 4 的钞票&#xff0c;使得钞票种类增至 5 种&#xff1a;20、10、5、4 和 1 元。银行在发钞时十分“节俭”&#xff0c;当有客户取钱时&#xff0c;需要以最少的钞票数来满足取款金额。 问题要求&#xff1a; 对于给定…...

深度:善用人工智能推动高等教育学习、教学与治理的深层变革

在人工智能技术与教育深度融合的当下,高等教育正经历着前所未有的范式转型。从学习方式的革新到教学模式的重构,再到治理体系的升级,人工智能已不再仅仅是辅助工具,而是成为重塑高等教育生态的核心驱动力。这一变革浪潮中,生成式人工智能(Generative AI)作为技术前沿的代…...

python全栈-JavaScript

python全栈-js 文章目录 js基础变量与常量JavaScript引入到HTML文件中JavaScript注释与常见输出方式 数据类型typeof 显示数据类型算数运算符之加法运算符运算符之算术运算符运算符之赋值运算符运算符之比较运算符运算符之布尔运算符运算符之位运算符运算符优先级类型转换 控制…...

Django信号使用完全指南示例

推荐超级课程: 本地离线DeepSeek AI方案部署实战教程【完全版】Docker快速入门到精通Kubernetes入门到大师通关课AWS云服务快速入门实战目录 **引言:****先决条件:****目录:****1. 什么是Django信号?****2:设置你的Django项目****2.1. 安装Django**2.2. 创建一个Django项…...

# 深入理解GPT:架构、原理与应用示例

深入理解GPT&#xff1a;架构、原理与应用示例 一、引言 GPT&#xff08;Generative Pre-trained Transformer&#xff09;系列模型自2018年问世以来&#xff0c;凭借其强大的文本生成能力和多任务适应性&#xff0c;彻底改变了自然语言处理&#xff08;NLP&#xff09;领域。…...

C语言递归

一、递归的核心原理 1. 递归的本质 自相似性&#xff1a;将问题分解为与原问题结构相同但规模更小的子问题&#xff08;如树的遍历、分治算法&#xff09;。 栈机制&#xff1a;每次递归调用都会在内存栈中创建一个新的函数栈帧&#xff0c;保存当前状态&#xff08;参数、局…...

Jetpack Compose 基础组件学习2.0

文章目录 1、kotlin版本修改问题修改2、前言&#xff1a;参考知识点&#xff1a; 3、文字超链接的实现新版实现&#xff08;Text AnnotatedString实现效果&#xff09; 4、文字强调效果&#xff08; Material3 的透明度方案&#xff09;material依赖实现文字强调效果&#xff…...

MySQL SQL 优化的10个关键方向

1. 索引优化 合理创建索引&#xff1a;为高频查询条件、JOIN字段、排序字段创建索引 复合索引设计&#xff1a;遵循最左前缀原则&#xff0c;将选择性高的列放在前面 避免索引失效&#xff1a;防止索引列上使用函数、类型转换、OR条件不当使用 覆盖索引&#xff1a;尽量让查…...

babel-runtime 如何缩小打包体积

&#x1f916; 作者简介&#xff1a;水煮白菜王&#xff0c;一位前端劝退师 &#x1f47b; &#x1f440; 文章专栏&#xff1a; 前端专栏 &#xff0c;记录一下平时在博客写作中&#xff0c;总结出的一些开发技巧和知识归纳总结✍。 感谢支持&#x1f495;&#x1f495;&#…...

VMware Fusion虚拟机Mac版安装CentOS Stream 9

VMware Fusion虚拟机Mac版安装CentOS Stream 9 文章目录 VMware Fusion虚拟机Mac版安装CentOS Stream 9一、介绍二、效果三、下载 一、介绍 CentOS Stream 9是CentOS Stream发行版的最新主要版本&#xff0c;旨在提供Red Hat Enterprise Linux&#xff08;RHEL&#xff09;的每…...

手搓多模态-05 transformer编码层

前情回顾 前面我们已经实现一个图像嵌入层和顶层的模型调度&#xff1a; class SiglipVisionTransformer(nn.Module): ##视觉模型的第二层&#xff0c;将模型的调用分为了图像嵌入模型和transformer编码器模型的调用def __init__(self, config:SiglipVisionConfig):super().__i…...

LightTrack + VOT2019 + Jetson 部署全流程指南【轻量级目标跟踪】

LightTrack VOT2019 Jetson 部署全流程指南【轻量级目标跟踪】 &#x1f527; 1. 环境准备&#xff08;Jetson 平台&#xff09;推荐配置&#xff1a;⚙️ 安装 Python 3.6 虚拟环境&#xff08;Jetson 原生 Python 版本较新&#xff09; &#x1f4e5; 2. 下载 LightTrack 源…...

【Easylive】视频删除方法详解:重点分析异步线程池使用

【Easylive】项目常见问题解答&#xff08;自用&持续更新中…&#xff09; 汇总版 方法整体功能 这个deleteVideo方法是一个综合性的视频删除操作&#xff0c;主要完成以下功能&#xff1a; 权限验证&#xff1a;检查视频是否存在及用户是否有权限删除核心数据删除&…...

(C语言)循环单链表(数据结构)(指针)(循环列表教程)

目录 源代码&#xff1a; 代码详解&#xff1a; 1. 头文件和宏定义 2. 类型定义 3. 初始化链表 4. 判断链表是否为空 5. 求链表的长度 6. 清空链表 7. 销毁链表 8. 链表的插入&#xff08;头插法&#xff09; 9. 链表的插入&#xff08;尾插法&#xff09; 10. 查看…...

Debian 12 服务器搭建Beego环境

一、Debian 12系统准备 1.更新系统 #apt update && apt upgrade -y 2.安装基础工具 #apt install -y git curl wget make gcc 二、安装Go环境 Go语言的镜像官网&#xff1a;https://golang.google.cn/ 1.下载go最新版 #cd /usr/local/src #wget -o https://golang.go…...

淘宝商品评论API接口概述及JSON数据参考(测试)

前言 一、淘宝商品评论API接口概述 淘宝商品评论API接口是淘宝开放平台提供的一项服务&#xff0c;允许开发者通过HTTP请求获取指定商品的评论数据。这些数据包括评论内容、评论者信息、评分、评论时间等&#xff0c;为开发者提供了丰富的商品评价信息&#xff0c;有助于分析…...

AI:决策树、决策森林与随机森林

决策树与随机森林:从原理到实战的全面解析(2025最新版) 引言 在机器学习的世界里,决策树和森林模型(包括随机森林)常常是数据科学家们常用的工具之一。无论是初学者还是资深从业者,理解这些模型的原理和应用,都能帮助你在数据分析和预测任务中获得更好的结果。本文将…...

图形化编程语言:低代码赛道的技术革命与范式突破

在 2024 年 Gartner 低代码平台魔力象限报告中&#xff0c;传统低代码厂商市场份额增速放缓至 12%&#xff0c;而图形化编程语言赛道融资额同比激增 370%。本文深度剖析低代码平台的技术瓶颈&#xff0c;系统阐释图形化编程语言的核心优势&#xff0c;揭示其如何重构软件开发范…...

EdgeInfinite: 用3B模型处理无限长的上下文

论文标题 EdgeInfinite: A Memory-Efficient Infinite-Context Transformer for Edge Devices 论文地址 https://arxiv.org/pdf/2503.22196 作者背景 vivo&#xff0c;浙江大学 代码 The code will be released after the official audit. 动机 self-attention的二次时…...

大模型论文:Improving Language Understanding by Generative Pre-Training

大模型论文&#xff1a;Improving Language Understanding by Generative Pre-Training OpenAI2018 文章地址&#xff1a;https://www.mikecaptain.com/resources/pdf/GPT-1.pdf 摘要 自然语言理解包括各种各样的任务&#xff0c;如文本蕴涵、问题回答、语义相似性评估和文…...

springboot 项目怎样开启https服务

要在Spring Boot项目中启用HTTPS服务&#xff0c;请按照以下步骤操作&#xff1a; 1. 生成SSL证书密钥库 使用keytool生成自签名证书 在终端或命令行工具中运行以下命令&#xff0c;生成一个PKCS12格式的密钥库文件&#xff1a; keytool -genkeypair -alias myapp -keyalg …...

R语言之mlr依赖包缺失警告之分析

因为本地没有网络&#xff0c;所有相关的依赖包都是手动下载&#xff0c;再使用脚本一键安装的。 在使用mlr包时&#xff0c;执行下面的代码时&#xff0c;总是报各种依赖缺失&#xff0c;也不知道咋看FAIL信息。 # 建模与调参 # 查阅线性回归、随机森林、xgboost和KNN四种模…...

如何记录日常笔记

关于用Obsidian记日常笔记这事儿&#xff0c;我的经验是别想得太复杂。刚开始用的时候总想着要搞个完美的分类系统&#xff0c;后来发现简单粗暴反而最实用。 文件夹分两类就够了——比如「工作记录」扔一个文件夹&#xff0c;「读书笔记」扔另一个&#xff0c;别分太细&#…...

Completablefuture的底层原理是什么

参考面试回答&#xff1a; 个人理解 CompletableFuture 是 Java 8 引入的一个类、它可以让我们在多线程环境中更加容易地处理异步任务。CompletableFuture 的底层原理是基于一个名为 FutureTask 的机制、结合了 监听器模式 和 等待-通知机制 来处理异步计算。 1.首先就是Com…...

Linux学习笔记(1) 目录结构与路径描述:对比 Windows 系统差异(期末,期中复习笔记全)

前言 一、Linux 的目录结构 二、Linux 路径的描述方式 三、总结 前言 在计算机操作系统的领域中&#xff0c;Linux 和 Windows 是两大主流系统。它们在目录结构和路径描述方式上存在显著不同&#xff0c;理解这些差异对于熟练掌握 Linux 系统至关重要。 一、Linux 的目录结构…...