首页 文章 精选 留言 我的

精选列表

搜索[高性能全文搜索引擎],共10000篇文章
优秀的个人博客,低调大师

高性能链接器 Mold 发布 1.6 版本

Mold 是现有 Unix 链接器的快速替代品,它比 LLVM lld 链接器快几倍。目前 Mold 发布了 1.6 版本,此版本增加了对两个基于 IBM 的平台的支持,主要带来以下更改: 新功能 [ppc64] Mold 现在支持原始的 64 位 big-endian PowerPC ABI(也称为 PPC64 ELFv1 或简称 ppc64),可以使用 Mol d为较旧的 PPC64 系统构建应用程序。请注意,不要与 Mold 已经支持的现代 PPC64 ELFv2 ABI(也称为 ppc64le)相混淆。 [s390x] 现在支持 Linux/s390x,Linux/s390x 是 IBM z/Architecture 大型机上的 Linux 环境。 Mold现在会创建更小的输出文件,这点在具有大页面大小的目标上最为明显,例如 PPC64(其常见页面大小为 64 KiB),但即使在 x86-64 上,它也会为每个输出文件节省几千字节。 错误修复和兼容性改进 [arm64] Mold 现在可以链接带 -static-pie 标志的可执行文件。以前与该标志链接的可执行文件会立即崩溃。 更新公告:https://github.com/rui314/mold/releases/tag/v1.6.0

优秀的个人博客,低调大师

PondPond —— Python 高性能对象池库

PondPond 是一个 Python 中高效的通用对象池,具有性能好、内存占用小、命中率高的特点。基于近似统计的根据频率自动回收的能力,能够自动调整每个对象池的空闲对象数量。 因为目前 Python 目前没有比较好的、测试用例完备、代码注释完备、文档完善的对象池化库,同时目前的主流对象池库也没有比较智能的自动回收机制。Pond 可能是 Python 中第一个社区公开的测试用例完整,覆盖率 90% 以上、代码注释完备、文档完善的对象池化库。 Pond 灵感来自于 Apache Commons Pool、Netty Recycler、HikariCP、Caffeine,集合了多家的优点。其次 Pond 通过使用近似计数的方式以极小的内存空间统计每个对象池的使用频率,并且自动回收。 流量较为随机平均的情况下,默认策略和权重可以降低 48.85% 内存占用,借取命中率 100%。 流量较为符合 2/8 定律的情况下,默认策略和权重可以降低 45.7% 内存占用, 借取命中率 100%。 设计概述 Pond 主要由 FactoryDict、Counter、PooledObjectTree 三部分以及一个单独的回收线程构成。 FactoryDict 使用 Pond 需要实现对象工厂 PooledObjectFactory,PooledObjectFactory 提供对象的创建、初始化、销毁、验证等操作,由 Pond 调用。所以为了让对象池支持存放完全不同的对象,Pond 使用了一个字典来记录每个工厂类的名称和自己实现的工厂类的实例化对象。 每个 PooledObjectFactory 应该具备创建对象、销毁对象、验证对象是否还可用、重置对象四个功能。 比较特别的是 Pond 支持自动重置对象,因为某些场景下可能会存在对象中要先赋值进行传递,传递完又被回收的情况,为了避免污染建议这种场景下无比实现这个功能。 Counter Counter 中保存了一个近似计数器。 PooledObjectTree PooleedObjectTree 是个字典,每个 key 对应着一个先进先出的队列,这些队列都是线程安全的。每个队列中保存着多个 PooleedObject。PooledObejct 保存了创建时间、最后借出的时间以及实际需要的对象。 线程安全 Pond 的借用和回收都是线程安全的。Python 的 queue 模块提供了一个适用于多线程编程的先进先出(FIFO)数据结构。它可以用来安全地在生产者和消费者线程之间传递消息或其他数据。锁是调用者来处理的,所有多个线程能够安全且容易的使用同样的 Queue 实例工作。而 Pond 的借用和回收都是在操作 queue,所以基本可以认为是线程安全的。 借出机制 在使用 Pond 借出一个对象时,会先检查想要借出的对象的种类是否已经在 PooledObjectTree 存在,如果存在会检查这个对象的对象池是否为空,如果为空会创建一个新的。 如果对象池中有多余的对象,会利用 queue 弹出一个对象并验证这个对象是否可用。如果不可用会自动调用所属的 Factory 清理销毁该对象,同时清理它在 Python 中的 GC 计数,让它更快被 GC 回收,不断拿取下一个直至有可用的。 如果这个对象可用,则会直接返回。当然无论是从对象池中取出对象还是新创建了一个对象,都会利用 Counter 增加一个计数。 回收机制 回收一个对象时会判断目标对象池存不存在,如果存在会检查对象池是否已经满了,满了的话会自动销毁要归还的这个对象。 然后会检查这个对象是否已经被借出太长时间,如果超过了配置的最长时间同样会被清理掉。 自动回收 自动回收时每隔一段时间,默认是 300 s,就会执行一次。自动清理不经常使用的对象池中的对象。 使用说明 你可以先安装 Pond 的库并且在你的项目中引用。 pip install pondpond from pond import Pond, PooledObjectFactory, PooledObject 首先你需要声明一个你想要放入的类型的对象的工厂类,比如下面的例子我们希望池化的对象是 Dog,所以我们先声明一个 PooledDogFactory 类,并且实现 PooledObjectFactory。 class Dog: name: str validate_result:bool = True class PooledDogFactory(PooledObjectFactory): def creatInstantce(self) -> PooledObject: dog = Dog() dog.name = "puppy" return PooledObject(dog) def destroy(self, pooled_object: PooledObject): del pooled_object def reset(self, pooled_object: PooledObject) -> PooledObject: pooled_object.keeped_object.name = "puppy" return pooled_object def validate(self, pooled_object: PooledObject) -> bool: return pooled_object.keeped_object.validate_result 接着你需要创建 Pond 的对象: pond = Pond(borrowed_timeout=2, time_between_eviction_runs=-1, thread_daemon=True, eviction_weight=0.8) Pond 可以传递一些参数进去,分别代表: borrowed_timeout:单位为秒,借出对象的最长期限,超过期限的对象归还时会自动销毁不会放入对象池。 time_between_eviction_runs:单位为秒,自动回收的间隔时间。 thread_daemon:守护线程,如果为 True,自动回收的线程会随着主线程关闭而关闭。 eviction_weight:自动回收时权重,会将这个权重与最大使用频次想乘,使用频次小于这个值的对象池中的对象都会进入清理步骤。 实例化工厂类: factory = PooledDogFactory(pooled_maxsize=10, least_one=False) 所有继承了 PooledObjectFactory 都会自带构造函数,可以传递 pooled_maxsize 和 least_one 两个参数。 pooled_maxsize:这个工厂类生成出的对象的对象池的最大能放置的数量。 least_one:如果为 True,在进入自动清理时,这个工厂类生成出的对象的对象池会至少保留一个对象。 向 Pond 注册这个工厂对象,默认会使用 factory 的类名作为 PooledObjectTree 的 key : pond.register(factory) 当然你也可以自定义它的名字,名字会作为 PooledObjectTree 的 key: pond.register(factory, name="PuppyFactory") 注册成功后,Pond 会自动根据 factory 中设置的 pooled_maxsize 自动开始创建对象直至填满这个对象池。 借用和归还对象: pooled_object: PooledObject = pond.borrow(factory) dog: Dog = pooled_object.use() pond.recycle(pooled_object, factory) 当然你可以用名字来进行借用和归还: pooled_object: PooledObject = pond.borrow(name="PuppyFactory") dog: Dog = pooled_object.use() pond.recycle(pooled_object, name="PuppyFactory") 完全清理一个对象池: pond.clear(factory) 通过名字清理一个对象池: pond.clear(name="PuppyFactory") 正常情况下,你只需要使用上面的这些方法,生成对象和回收对象都是全自动的。

优秀的个人博客,低调大师

高性能链接器 Mold 发布 1.4.2 版本

Mold 是现有 Unix 链接器的快速替代品,它比 LLVM lld 链接器快几倍。 目前 Mold 发布了最新版本 1.4.2 ,此版本带来以下新功能和各种错误修复: 新功能和错误修复 [RV32] 修复了 32 位 RISC-V 的几个问题。Mold 现在可以为目标构建复杂的程序,包括它自己。 [ARM32] Mold 获得了范围扩展 thunk,因此它可以链接 .text 大于 16 MiB 的程序。以前 Mold 无法链接这么大的程序。 还修复了 ARM32 的稳定性问题。 创建 Mold 二进制包请注意:请静态链接捆绑的 libtbb(这是默认设置)或使用补丁重建发行版的 libtbb 包,以便 Mold 的链接时间优化(LTO)在重负荷下可靠地工作。 更新公告:https://github.com/rui314/mold/releases/tag/v1.4.2

优秀的个人博客,低调大师

GraphVite —— 通用高性能的图表学习系统

GraphVite 是一个通用图表嵌入引擎,用于在各种应用中进行高速和大规模嵌入式学习。GraphVite 支持多 GPU 并行,在百万节点的图上,只需要一分钟左右的时间学习节点的表示。GraphVite 为 3 类应用提供完整的训练和评估管道:节点嵌入(Node Embedding)、知识图谱嵌入(Knowledge Graph Embedding)和高维数据图表可视化(Graph&High-dimensional data visualization)。 此项目还包括 9 个流行的模型,以及它们在一些标准数据集上的效果。

优秀的个人博客,低调大师

高性能链接器 Mold 发布 1.2.1 版本

Mold 是现有 Unix 链接器的快速替代品,它比 LLVM lld 链接器快几倍。目前 Mold 发布了 1.2.1 版本,带来以下更改 修复 --gdb-index 中的各种错误。 为了与 LLVM lld 兼容,Mold 现在可以识别 --thinlto-cache-dir 和 --thinlto-cache-policy。 (7ebd071) Mold 现在可以处理 TLS 常用符号,GCC 有时会为线程局部变量创建这样的符号。 (cf850f8) 在某些极端情况下,Mold 为同一符号创建了一个非版本化符号和一个版本化符号,即使一个符号被版本化,所有同名符号也必须被版本化。(8298c0a) 修复:Mold 用于将符号的 PLT 地址而不是其地址写入 .symtab。 (e088db7) Mold 现在可以处理超过 219 个符号的输入文件。(f1f2d40) /usr/local/libexec/mold/ld 现在安装为相对符号链接,而不是绝对符号链接。(5803c3c) 更新公告:https://github.com/rui314/mold/releases/tag/v1.2.1

优秀的个人博客,低调大师

BeeCP-3.1.9 发布,高性能 JDBC池

小蜜蜂连接池:一款轻量级JDBC连接池。 1:版本下载(java7) <dependency> <groupId>com.github.chris2018998</groupId> <artifactId>beecp</artifactId> <version>3.1.9</version> </dependency> 2:更新内容 调整配置项名 ‘ connectionTestSQL’ 为‘ connectionTestSql’ 增强连接检查时事务处理 在池化对象上增加onBeforeRemove方法 5:Springboot启动器同步更新 <dependency> <groupId>com.github.chris2018998</groupId> <artifactId>beecp-spring-boot-starter</artifactId> <version>1.5.5</version> </dependency> 6:项目地址 国内地址:https://gitee.com/mirrors/BeeCP 国外地址:https://github.com/Chris2018998/BeeCP

优秀的个人博客,低调大师

elton —— 简单高性能的 Go Web 框架

前言 开始接触后端开发是从 nodejs 开始,最开始使用的框架是 express,后来陆续接触了其它的框架,觉得最熟悉的还是koa。使用 golang 做后端开发时,对比使用过 gin,echo 以及 iris 三个框架,它们的用法都类似(都支持中间件,中间件的处理也类似),但是在开发过程中还是钟情于 koa 的处理方式,失败则 throw error,成功则将响应数据赋值至 ctx.body,简单易懂。 概述 造一个新的轮子的时候,首先考虑的是满足自己的需求,弱水三千只取一瓢饮,对我来说,新轮子的满足我所需要的一瓢则是重中之重。 请求经过中间件的处理方式为由外至内,响应时再由内至外 所有的处理函数都一致(参数、类型等),每个处理函数都有可以是其它处理函数的前置中间件 请求处理成功时,直接赋值至 Body(interface{}),由中间件将 interface{} 序列化(如 json,xml 等) 请求处理失败时,返回 error,由中间件将 error 转换为相应的 HTTP 响应(golang 中的 error 为 interface,可自定义相应的 Error 实例) elton 参考 koa 的实现,能够简单的添加各类中间件,中间件的执行也和 koa 一样,如下图所示的洋葱图,从外层往内层递进,再从内层返回外层(也可以未至最内层则直接往上返回)。 下面我们先看一下简单的处理成功与出错的例子: package main import ( "bytes" "errors" "github.com/vicanso/elton" ) func main() { d := elton.New() d.GET("/", func(c *elton.Context) (err error) { c.BodyBuffer = bytes.NewBufferString("hello world") return }) d.GET("/error", func(c *elton.Context) (err error) { err = errors.New("my error") return }) d.ListenAndServe(":7001") } 如代码所示,处理过程非常简单,响应数据由BodyBuffer中获取,如果流程出错,直接返回Error则可。不过例子中的与koa的处理还是有所差距,koa中返回数据时可以随意的指定各种Object(转换为json),而在golang中因为是强类型,所以需要使用interface{}的形式返回,再通过中间件将各类不同的struct转换至BodyBuffer,以及设置Content-Type。 中间件 在 elton 中有两类中间件是必须了解的,一是将 Context.Body(interface{}) 转换至对应的响应数据的 Responder 中间件,另外一个就是将 Error 转换至对应的响应数据的 Error 中间件。在详解这两类中间件之前,我们首先来了解一下 elton 的中间件的一些基本概念。 elton 中间件的处理函数是Handler func(*Context) error,可以通过Use方法添加至全局的中间件,也可单独添加至单一组或单一的路由处理。中间件处理也非常简单,如果出错,返回 Error(后续的处理函数不再执行)。在当前函数中已完成处理,则无需要调用Context.Next(),需要转至下一处理函数,则调用Context.Next()则可。 package main import ( "bytes" "log" "time" "github.com/vicanso/elton" ) func main() { d := elton.New() // logger d.Use(func(c *elton.Context) (err error) { err = c.Next() rt := c.GetHeader("X-Response-Time") log.Printf("%s %s - %s\n", c.Request.Method, c.Request.RequestURI, rt) return }) // x-response-time d.Use(func(c *elton.Context) (err error) { start := time.Now() err = c.Next() c.SetHeader("X-Response-Time", time.Since(start).String()) return }) d.GET("/", func(c *elton.Context) (err error) { c.BodyBuffer = bytes.NewBufferString("hello world") return }) d.ListenAndServe(":7001") } responder 中间件 HTTP 的响应主要分三部分,HTTP 响应状态码,HTTP 响应头以及 HTTP 响应体。前两部分比较简单,格式统一,但是 HTTP 响应体对于不同的应用有所不同。在 elton 的处理中,会将 BodyBuffer 的相应数据在响应时作为 HTTP 响应体输出。在实际应用中,有些会使用 json,有些是 xml 或者自定义的响应格式。因此在elton是提供了Body(interface{}) 属性,允许将响应数据赋值至此字段,再由相应的中间件转换为对应的 BodyBuffer 以及设置Content-Type。 在实际使用中,HTTP 接口的响应主要还是以json为主,因此elton-responder提供了将 Body 转换为对应的 BodyBuffer(json) 的处理,主要的处理如下: // New create a responder func New(config Config) elton.Handler { skipper := config.Skipper if skipper == nil { skipper = elton.DefaultSkipper } marshal := standardJSON.Marshal if config.Fastest { marshal = fastJSON.Marshal } return func(c *elton.Context) (err error) { if skipper(c) { return c.Next() } err = c.Next() if err != nil { return } // 如果已设置了BodyBuffer,则已生成好响应数据,跳过 if c.BodyBuffer != nil { return } if c.StatusCode == 0 && c.Body == nil { // 如果status eltone 与 body 都为空,则为非法响应 err = errInvalidResponse return } // 如果body是reader,则跳过 if c.IsReaderBody() { return } ct := elton.HeaderContentType hadContentType := false // 判断是否已设置响应头的Content-Type if c.GetHeader(ct) != "" { hadContentType = true } statusCode := c.StatusCode if statusCode == 0 { statusCode = http.StatusOK } var body []byte if c.Body != nil { switch c.Body.(type) { case string: if !hadContentType { c.SetHeader(ct, elton.MIMETextPlain) } body = []byte(c.Body.(string)) case []byte: if !hadContentType { c.SetHeader(ct, elton.MIMEBinary) } body = c.Body.([]byte) default: // 转换为json buf, err := marshal(c.Body) if err != nil { c.Cod().EmitError(c, err) statusCode = http.StatusInternalServerError he := hes.NewWithErrorStatusCode(err, statusCode) he.Exception = true c.SetHeader(ct, elton.MIMEApplicationJSON) body = he.ToJSON() err = nil } else { if !hadContentType { c.SetHeader(ct, elton.MIMEApplicationJSON) } body = buf } } } c.BodyBuffer = bytes.NewBuffer(body) c.StatusCode = statusCode return nil } } 代码的处理步骤如下: 1、前置判断是否跳过中间件,主要判断条件为:是否出错,或者已设置BodyBuffer(表示已完成响应数据的处理)或者 Body 为 Reader (以流的形式输出响应数据)。 2、如果 Body 的类型为 string,则将 string 转换为 bytes,如果未设置数据类型,则设置为text/plain; charset=UTF-8 3、如果 Body 的类型为 []byte,如果未设置数据类型,则设置为application/octet-stream 4、对于其它类型,则使用json.Marshal转换为对应的 []byte,如果未设置数据类型,则设置为application/json; charset=UTF-8 通过此中间件,在开发时可以简单的将各种 struct 对象,map 对象以json的形式返回,无需要单独处理数据转换,方便快捷。如果应用需要以 xml 等其它形式返回,则可自己编写自定义中间件来做转换处理。 error handler 中间件 elton 中默认的 Error 处理只是简单的输出err.Error(),而且状态码也只是简单的使用StatusInternalServerError,无法满足应用中的各类定制的出错方式。因此一般建议编写自定义的出错处理中间件,根据自定义的 Error 对象生成相应的出错响应数据。如elton-error-handler则针对返回的hes对象对应生成相应的状态码,响应类型以及响应数据(json): // New create a error handler func New(config Config) elton.Handler { skipper := config.Skipper if skipper == nil { skipper = elton.DefaultSkipper } return func(c *elton.Context) error { if skipper(c) { return c.Next() } err := c.Next() // 如果没有出错,直接返回 if err == nil { return nil } he, ok := err.(*hes.Error) if !ok { he = hes.Wrap(err) he.StatusCode = http.StatusInternalServerError he.Exception = true he.Category = errErrorHandlerCategory } c.StatusCode = he.StatusCode if config.ResponseType == "json" { buf := he.ToJSON() c.BodyBuffer = bytes.NewBuffer(buf) c.SetHeader(elton.HeaderContentType, elton.MIMEApplicationJSON) } else { c.BodyBuffer = bytes.NewBufferString(he.Error()) c.SetHeader(elton.HeaderContentType, elton.MIMETextPlain) } return nil } } 后记 elton提供更简单方便的 WEB 开发体验,主要实现的代码非常简单,更多的功能都依赖于各类中间件。需要查阅更多的中间件以及文档说明请查阅 github 项目中的说明。

资源下载

更多资源
Spring

Spring

Spring框架(Spring Framework)是由Rod Johnson于2002年提出的开源Java企业级应用框架,旨在通过使用JavaBean替代传统EJB实现方式降低企业级编程开发的复杂性。该框架基于简单性、可测试性和松耦合性设计理念,提供核心容器、应用上下文、数据访问集成等模块,支持整合Hibernate、Struts等第三方框架,其适用范围不仅限于服务器端开发,绝大多数Java应用均可从中受益。

Rocky Linux

Rocky Linux

Rocky Linux(中文名:洛基)是由Gregory Kurtzer于2020年12月发起的企业级Linux发行版,作为CentOS稳定版停止维护后与RHEL(Red Hat Enterprise Linux)完全兼容的开源替代方案,由社区拥有并管理,支持x86_64、aarch64等架构。其通过重新编译RHEL源代码提供长期稳定性,采用模块化包装和SELinux安全架构,默认包含GNOME桌面环境及XFS文件系统,支持十年生命周期更新。

Sublime Text

Sublime Text

Sublime Text具有漂亮的用户界面和强大的功能,例如代码缩略图,Python的插件,代码段等。还可自定义键绑定,菜单和工具栏。Sublime Text 的主要功能包括:拼写检查,书签,完整的 Python API , Goto 功能,即时项目切换,多选择,多窗口等等。Sublime Text 是一个跨平台的编辑器,同时支持Windows、Linux、Mac OS X等操作系统。

WebStorm

WebStorm

WebStorm 是jetbrains公司旗下一款JavaScript 开发工具。目前已经被广大中国JS开发者誉为“Web前端开发神器”、“最强大的HTML5编辑器”、“最智能的JavaScript IDE”等。与IntelliJ IDEA同源,继承了IntelliJ IDEA强大的JS部分的功能。

用户登录
用户注册