谁才是真正的协议之王?fastjson2 vs fury

news2024/12/25 14:14:50

文章目录

    • 写在前面
    • 简单介绍
    • 官网和引入
    • 设备,环境及样本
      • 设备
      • JDK
      • 样本
    • 测评数据
      • 包体大小
      • 序列化
      • 反序列化
      • 垃圾回收
      • JIT优化耗时
    • 结论
      • 序列化对比
      • 反序列化对比
      • 包体压缩比上
      • API易用性上
      • 多语言生态上
      • 垃圾回收上
      • JIT优化耗时上
    • 综述

写在前面

前阵子,我们写过一篇关于fury和protostuff的性能对比的文章:性能飙升20倍!!! 超高性能协议框架fury完爆protostuff,那么,fury 是否能真的坐稳协议框架的头把交椅呢?正逢fastjson2推出了新2.0.37版本,据说也很早就支持了字节序列化和反序列化,正好打算一较高下!

简单介绍

序列化框架是系统通信的基础组件,在游戏,大数据、AI 框架和云原生等分布式系统中广泛使用。当对象需要跨进程、跨语言、跨节点传输、持久化、状态读写、复制时,都需要进行序列化,其性能和易用性影响运行效率和开发效率。
fastjson2 是 FASTJSON 项目的重要升级,目标是为下一个十年提供一个高性能的JSON库, fastjson2 性能相比原先旧的 fastjson 有了很大提升,并且 fastjson2 更安全,完全删除autoType白名单,提升了安全性。
Fury 是一个基于 JIT 动态编译和零拷贝的多语言序列化框架,支持 Java/Python/Golang/JavaScript/C++ 等语言,提供全自动的对象多语言 / 跨语言序列化能力。
至于protostuff,这里就不提了,可以参看上一篇文章,它在这里,只能当个可怜的反面教材。

今天,我们从序列化/反序列化,包体的压缩率,GC,和JIT优化的角度来做下性能评测:

官网和引入

fastjson2
官网:无
开源地址:https://github.com/alibaba/fastjson2
使用引入:

implementation 'com.alibaba.fastjson2:fastjson2:2.0.37'

fury
官网:https://furyio.org
开源地址:https://github.com/alipay/fury
使用引入:

implementation 'org.furyio:fury-core:0.1.0'

设备,环境及样本

设备

测试设备: win11, 8core,16g memory,

JDK

openjdk version "11.0.16.1" 2022-08-16
OpenJDK Runtime Environment TencentKonaJDK (build 11.0.16.1+2)
OpenJDK 64-Bit Server VM TencentKonaJDK (build 11.0.16.1+2, mixed mode)

样本

用游戏中高频调用的技能回包做样本,字节大小 为704 bytes,

SkillFire_S2C_Msg[attackerId=2013850838,harmList={HarmDTO[curHp=1061639.1,dead=true,maxHp=972081.06,real=36249,targetId=1711281434,type=84,value=18168.72],HarmDTO[curHp=836323.44,dead=true,maxHp=8546706.0,real=91675,targetId=1527336063,type=22,value=30714.76],HarmDTO[curHp=2022717.6,dead=true,maxHp=8923567.0,real=74008,targetId=1684460215,type=67,value=93250.83]},index=37,param1={7153337,1918282,5243103,1985757,7515730},skillCategory=ATTACK_PASSIVE]

放一张使用的游戏场景,让大家感性认识一下:
在这里插入图片描述
对fastjson2和fury从包的大小和吞吐量,GC,和JIT优化等几个指标做了性能对比,并且,让我们继续!

测评数据

包体大小

对序列化后传输包体压缩率的各种比较如下:

协议设置压缩率
fastjson2BeanToArray=false41.48%
fastjson2BeanToArray=true16.34%
furyNumberCompressed=false35.94%
furyNumberCompressed=true27.84%
furyNumberCompressed=true,ClassRegistration20.45%
Protostuff17.90%

在这里插入图片描述

可以看出,fastjson2表现最优异,为16.34%
在引用解析(RefTracking)关闭,类注册 (ClassRegistration)打开,整数压缩(NumberCompressed)打开的情况下,我们把这个纳入到性能测试案例中,得到了如下的数据:

序列化

Benchmark                                                                       Mode  Cnt        Score        Error  Units
ProtoSerializeBenchMark.furySerialize                                          thrpt   10  4405011.951 ± 151916.918  ops/s
ProtoSerializeBenchMark.furySerializeWithClassRegistrationAndNumberCompressed  thrpt   10  5537945.622 ± 245265.769  ops/s
ProtoSerializeBenchMark.jsonSerialize                                          thrpt   10  2149077.623 ±  81047.066  ops/s
ProtoSerializeBenchMark.jsonSerializeWithBeanToArray                           thrpt   10  5309057.521 ± 220991.568  ops/s
ProtoSerializeBenchMark.jsonSerializeWithBeanToArrayAndFieldBase               thrpt   10  5060364.814 ± 342432.492  ops/s
ProtoSerializeBenchMark.protostuffSerialize                                    thrpt   10   196659.980 ±   7036.993  ops/s

在这里插入图片描述

反序列化

Benchmark                                                                           Mode  Cnt        Score        Error  Units
ProtoDeserializeBenchMark.furyDeserialize                                          thrpt   10  3273154.497 ± 246280.027  ops/s
ProtoDeserializeBenchMark.furyDeserializeWithClassRegistrationAndNumberCompressed  thrpt   10  4343790.775 ± 175190.374  ops/s
ProtoDeserializeBenchMark.jsonDeserialize                                          thrpt   10  2478522.415 ±  36606.918  ops/s
ProtoDeserializeBenchMark.jsonDeserializeWithArrayToBean                           thrpt   10  4805905.704 ±  73786.104  ops/s
ProtoDeserializeBenchMark.jsonDeserializeWithArrayToBeanAndFieldBase               thrpt   10  4666934.415 ± 262638.869  ops/s
ProtoDeserializeBenchMark.protostuffDeserialize                                    thrpt   10   192222.309 ±   4843.832  ops/s

在这里插入图片描述

垃圾回收

分析垃圾回收器在内存空间上所花费的时间消耗:

Benchmark                                                                                           Mode  Cnt        Score        Error   Units
ProtoSerializeBenchMark.furySerialize                                                              thrpt   10  4039378.284 ± 142043.248   ops/s
ProtoSerializeBenchMark.furySerialize:·gc.alloc.rate                                               thrpt   10     1170.814 ±     41.186  MB/sec
ProtoSerializeBenchMark.furySerialize:·gc.alloc.rate.norm                                          thrpt   10      304.001 ±      0.001    B/op
ProtoSerializeBenchMark.furySerialize:·gc.count                                                    thrpt   10       75.000               counts
ProtoSerializeBenchMark.furySerialize:·gc.time                                                     thrpt   10       60.000                   ms
ProtoSerializeBenchMark.furySerializeWithClassRegistrationAndNumberCompressed                      thrpt   10  6338653.047 ± 288140.271   ops/s
ProtoSerializeBenchMark.furySerializeWithClassRegistrationAndNumberCompressed:·gc.alloc.rate       thrpt   10     1015.321 ±     46.153  MB/sec
ProtoSerializeBenchMark.furySerializeWithClassRegistrationAndNumberCompressed:·gc.alloc.rate.norm  thrpt   10      168.001 ±      0.001    B/op
ProtoSerializeBenchMark.furySerializeWithClassRegistrationAndNumberCompressed:·gc.count            thrpt   10       66.000               counts
ProtoSerializeBenchMark.furySerializeWithClassRegistrationAndNumberCompressed:·gc.time             thrpt   10       57.000                   ms
ProtoSerializeBenchMark.jsonSerialize                                                              thrpt   10  2433452.831 ± 134796.548   ops/s
ProtoSerializeBenchMark.jsonSerialize:·gc.alloc.rate                                               thrpt   10     1262.157 ±     69.960  MB/sec
ProtoSerializeBenchMark.jsonSerialize:·gc.alloc.rate.norm                                          thrpt   10      544.001 ±      0.002    B/op
ProtoSerializeBenchMark.jsonSerialize:·gc.count                                                    thrpt   10       82.000               counts
ProtoSerializeBenchMark.jsonSerialize:·gc.time                                                     thrpt   10       70.000                   ms
ProtoSerializeBenchMark.jsonSerializeWithBeanToArray                                               thrpt   10  4824280.181 ± 355784.630   ops/s
ProtoSerializeBenchMark.jsonSerializeWithBeanToArray:·gc.alloc.rate                                thrpt   10     1545.476 ±    113.917  MB/sec
ProtoSerializeBenchMark.jsonSerializeWithBeanToArray:·gc.alloc.rate.norm                           thrpt   10      336.001 ±      0.001    B/op
ProtoSerializeBenchMark.jsonSerializeWithBeanToArray:·gc.count                                     thrpt   10       77.000               counts
ProtoSerializeBenchMark.jsonSerializeWithBeanToArray:·gc.time                                      thrpt   10       66.000                   ms
ProtoSerializeBenchMark.jsonSerializeWithBeanToArrayAndFieldBase                                   thrpt   10  4994330.560 ± 402699.443   ops/s
ProtoSerializeBenchMark.jsonSerializeWithBeanToArrayAndFieldBase:·gc.alloc.rate                    thrpt   10     1599.959 ±    129.010  MB/sec
ProtoSerializeBenchMark.jsonSerializeWithBeanToArrayAndFieldBase:·gc.alloc.rate.norm               thrpt   10      336.001 ±      0.001    B/op
ProtoSerializeBenchMark.jsonSerializeWithBeanToArrayAndFieldBase:·gc.count                         thrpt   10      105.000               counts
ProtoSerializeBenchMark.jsonSerializeWithBeanToArrayAndFieldBase:·gc.time                          thrpt   10       90.000                   ms
ProtoSerializeBenchMark.protostuffSerialize                                                        thrpt   10   196414.101 ±   9192.079   ops/s
ProtoSerializeBenchMark.protostuffSerialize:·gc.alloc.rate                                         thrpt   10      870.439 ±     40.732  MB/sec
ProtoSerializeBenchMark.protostuffSerialize:·gc.alloc.rate.norm                                    thrpt   10     4648.018 ±      0.026    B/op
ProtoSerializeBenchMark.protostuffSerialize:·gc.count                                              thrpt   10       67.000               counts
ProtoSerializeBenchMark.protostuffSerialize:·gc.time                                               thrpt   10       53.000                   ms
Benchmark                                                                                               Mode  Cnt        Score        Error   Units
ProtoDeserializeBenchMark.furyDeserialize                                                              thrpt   10  3769407.082 ± 153367.315   ops/s
ProtoDeserializeBenchMark.furyDeserialize:·gc.alloc.rate                                               thrpt   10     2357.655 ±     95.882  MB/sec
ProtoDeserializeBenchMark.furyDeserialize:·gc.alloc.rate.norm                                          thrpt   10      656.001 ±      0.001    B/op
ProtoDeserializeBenchMark.furyDeserialize:·gc.count                                                    thrpt   10       95.000               counts
ProtoDeserializeBenchMark.furyDeserialize:·gc.time                                                     thrpt   10       93.000                   ms
ProtoDeserializeBenchMark.furyDeserializeWithClassRegistrationAndNumberCompressed                      thrpt   10  4246958.076 ± 165462.964   ops/s
ProtoDeserializeBenchMark.furyDeserializeWithClassRegistrationAndNumberCompressed:·gc.alloc.rate       thrpt   10     2494.351 ±     97.119  MB/sec
ProtoDeserializeBenchMark.furyDeserializeWithClassRegistrationAndNumberCompressed:·gc.alloc.rate.norm  thrpt   10      616.001 ±      0.001    B/op
ProtoDeserializeBenchMark.furyDeserializeWithClassRegistrationAndNumberCompressed:·gc.count            thrpt   10       96.000               counts
ProtoDeserializeBenchMark.furyDeserializeWithClassRegistrationAndNumberCompressed:·gc.time             thrpt   10       95.000                   ms
ProtoDeserializeBenchMark.jsonDeserialize                                                              thrpt   10  2461425.079 ±  71354.374   ops/s
ProtoDeserializeBenchMark.jsonDeserialize:·gc.alloc.rate                                               thrpt   10     2027.745 ±     58.903  MB/sec
ProtoDeserializeBenchMark.jsonDeserialize:·gc.alloc.rate.norm                                          thrpt   10      864.001 ±      0.002    B/op
ProtoDeserializeBenchMark.jsonDeserialize:·gc.count                                                    thrpt   10       91.000               counts
ProtoDeserializeBenchMark.jsonDeserialize:·gc.time                                                     thrpt   10       90.000                   ms
ProtoDeserializeBenchMark.jsonDeserializeWithArrayToBean                                               thrpt   10  4627064.619 ± 203137.578   ops/s
ProtoDeserializeBenchMark.jsonDeserializeWithArrayToBean:·gc.alloc.rate                                thrpt   10     3705.782 ±    162.762  MB/sec
ProtoDeserializeBenchMark.jsonDeserializeWithArrayToBean:·gc.alloc.rate.norm                           thrpt   10      840.001 ±      0.001    B/op
ProtoDeserializeBenchMark.jsonDeserializeWithArrayToBean:·gc.count                                     thrpt   10      119.000               counts
ProtoDeserializeBenchMark.jsonDeserializeWithArrayToBean:·gc.time                                      thrpt   10      120.000                   ms
ProtoDeserializeBenchMark.jsonDeserializeWithArrayToBeanAndFieldBase                                   thrpt   10  4523421.319 ± 154096.124   ops/s
ProtoDeserializeBenchMark.jsonDeserializeWithArrayToBeanAndFieldBase:·gc.alloc.rate                    thrpt   10     3622.814 ±    123.593  MB/sec
ProtoDeserializeBenchMark.jsonDeserializeWithArrayToBeanAndFieldBase:·gc.alloc.rate.norm               thrpt   10      840.001 ±      0.001    B/op
ProtoDeserializeBenchMark.jsonDeserializeWithArrayToBeanAndFieldBase:·gc.count                         thrpt   10      107.000               counts
ProtoDeserializeBenchMark.jsonDeserializeWithArrayToBeanAndFieldBase:·gc.time                          thrpt   10      110.000                   ms
ProtoDeserializeBenchMark.protostuffDeserialize                                                        thrpt   10   189091.087 ±  10938.077   ops/s
ProtoDeserializeBenchMark.protostuffDeserialize:·gc.alloc.rate                                         thrpt   10      787.513 ±     45.575  MB/sec
ProtoDeserializeBenchMark.protostuffDeserialize:·gc.alloc.rate.norm                                    thrpt   10     4368.019 ±      0.027    B/op
ProtoDeserializeBenchMark.protostuffDeserialize:·gc.count                                              thrpt   10       40.000               counts
ProtoDeserializeBenchMark.protostuffDeserialize:·gc.time                                               thrpt   10       39.000                   ms

JIT优化耗时

Benchmark                                                                                               Mode  Cnt        Score        Error  Units
ProtoSerializeBenchMark.furySerialize                                                                  thrpt   10  3988034.285 ± 139528.585  ops/s
ProtoSerializeBenchMark.furySerialize:·compiler.time.profiled                                          thrpt   10        4.000                  ms
ProtoSerializeBenchMark.furySerialize:·compiler.time.total                                             thrpt   10     2932.000                  ms
ProtoSerializeBenchMark.furySerializeWithClassRegistrationAndNumberCompressed                          thrpt   10  6445600.977 ± 153492.182  ops/s
ProtoSerializeBenchMark.furySerializeWithClassRegistrationAndNumberCompressed:·compiler.time.profiled  thrpt   10        6.000                  ms
ProtoSerializeBenchMark.furySerializeWithClassRegistrationAndNumberCompressed:·compiler.time.total     thrpt   10     2624.000                  ms
ProtoSerializeBenchMark.jsonSerialize                                                                  thrpt   10  2413208.213 ±  77023.998  ops/s
ProtoSerializeBenchMark.jsonSerialize:·compiler.time.profiled                                          thrpt   10        4.000                  ms
ProtoSerializeBenchMark.jsonSerialize:·compiler.time.total                                             thrpt   10     1986.000                  ms
ProtoSerializeBenchMark.jsonSerializeWithBeanToArray                                                   thrpt   10  6272217.689 ± 162504.678  ops/s
ProtoSerializeBenchMark.jsonSerializeWithBeanToArray:·compiler.time.profiled                           thrpt   10        4.000                  ms
ProtoSerializeBenchMark.jsonSerializeWithBeanToArray:·compiler.time.total                              thrpt   10     1948.000                  ms
ProtoSerializeBenchMark.jsonSerializeWithBeanToArrayAndFieldBase                                       thrpt   10  6028406.523 ± 161064.529  ops/s
ProtoSerializeBenchMark.jsonSerializeWithBeanToArrayAndFieldBase:·compiler.time.profiled               thrpt   10        3.000                  ms
ProtoSerializeBenchMark.jsonSerializeWithBeanToArrayAndFieldBase:·compiler.time.total                  thrpt   10     1938.000                  ms
ProtoSerializeBenchMark.protostuffSerialize                                                            thrpt   10   212378.958 ±  13824.911  ops/s
ProtoSerializeBenchMark.protostuffSerialize:·compiler.time.profiled                                    thrpt   10        4.000                  ms
ProtoSerializeBenchMark.protostuffSerialize:·compiler.time.total                                       thrpt   10     3196.000                  ms
Benchmark                                                                                                   Mode  Cnt        Score        Error  Units
ProtoDeserializeBenchMark.furyDeserialize                                                                  thrpt   10  3577484.780 ± 180920.346  ops/s
ProtoDeserializeBenchMark.furyDeserialize:·compiler.time.profiled                                          thrpt   10        6.000                  ms
ProtoDeserializeBenchMark.furyDeserialize:·compiler.time.total                                             thrpt   10     3235.000                  ms
ProtoDeserializeBenchMark.furyDeserializeWithClassRegistrationAndNumberCompressed                          thrpt   10  4192498.438 ± 176522.218  ops/s
ProtoDeserializeBenchMark.furyDeserializeWithClassRegistrationAndNumberCompressed:·compiler.time.profiled  thrpt   10        4.000                  ms
ProtoDeserializeBenchMark.furyDeserializeWithClassRegistrationAndNumberCompressed:·compiler.time.total     thrpt   10     3479.000                  ms
ProtoDeserializeBenchMark.jsonDeserialize                                                                  thrpt   10  2399044.624 ± 165715.862  ops/s
ProtoDeserializeBenchMark.jsonDeserialize:·compiler.time.profiled                                          thrpt   10        7.000                  ms
ProtoDeserializeBenchMark.jsonDeserialize:·compiler.time.total                                             thrpt   10     3355.000                  ms
ProtoDeserializeBenchMark.jsonDeserializeWithArrayToBean                                                   thrpt   10  4677755.187 ± 135508.540  ops/s
ProtoDeserializeBenchMark.jsonDeserializeWithArrayToBean:·compiler.time.profiled                           thrpt   10        4.000                  ms
ProtoDeserializeBenchMark.jsonDeserializeWithArrayToBean:·compiler.time.total                              thrpt   10     3562.000                  ms
ProtoDeserializeBenchMark.jsonDeserializeWithArrayToBeanAndFieldBase                                       thrpt   10  4635990.508 ± 108135.163  ops/s
ProtoDeserializeBenchMark.jsonDeserializeWithArrayToBeanAndFieldBase:·compiler.time.profiled               thrpt   10        6.000                  ms
ProtoDeserializeBenchMark.jsonDeserializeWithArrayToBeanAndFieldBase:·compiler.time.total                  thrpt   10     3464.000                  ms
ProtoDeserializeBenchMark.protostuffDeserialize                                                            thrpt   10   205998.280 ±   8099.058  ops/s
ProtoDeserializeBenchMark.protostuffDeserialize:·compiler.time.profiled                                    thrpt   10        5.000                  ms
ProtoDeserializeBenchMark.protostuffDeserialize:·compiler.time.total                                       thrpt   10     4534.000                  ms

结论

序列化对比

fastjson2在BeanToArray(将对象序列化成数组)情况下,是protostuff 的26.996倍。
fury在 引用解析(RefTracking)关闭,类注册(ClassRegistration)打开,整数压缩(NumberCompressed)打开的情况下 ,是protostuff 的28.160倍。
fury 胜出!

反序列化对比

fastjson2在SupportArrayToBean(将数组反序列化成对象)情况下,是protostuff 的25.002倍。
fury在 引用解析(RefTracking)关闭,类注册(ClassRegistration)打开,整数压缩(NumberCompressed)打开的情况下 ,是protostuff 的22.598倍。
fastjson2 胜出!

包体压缩比上

选取各自表现最优的情况下,fury , protostuff,fastjson 比较 20.45%> 17.90%>16.34% ,fastjson2 胜出!

API易用性上

准备数据:

 byte[]  array = FileUtils.getByteArrayFromFile("message.txt");
 skillFire_s2C_msg= JSON.parseObject(array,SkillFire_S2C_Msg.class);

fastjson2使用

//序列化
byte[] bytes=JSONB.toBytes(skillFire_s2C_msg, JSONWriter.Feature.BeanToArray);
//反序列化
SkillFire_S2C_Msg message=JSONB.parseObject(bytes, SkillFire_S2C_Msg.class, JSONReader.Feature.SupportArrayToBean);

fury 使用

//初始化
Fury fury = Fury.builder().withLanguage(Language.JAVA)
        .withRefTracking(false).requireClassRegistration(true).withNumberCompressed(true).build();
 //下面是一堆的自定义对象的显式注册,不注册的话,很会影响性能
fury .register(SkillFire_S2C_Msg.class);
fury .register(SkillCategory.class);
fury .register(HarmDTO.class);
//序列化
byte[] bytes=fury.serialize(skillFire_s2C_msg);
//反序列化
SkillFire_S2C_Msg message=fury.deserializeJavaObject(bytes, SkillFire_S2C_Msg.class);

很明显,接口的易用性上来说,fastjson2相对更友好优雅些,也可能和我以前用了多年的fastjson的缘故,笔者特别困惑的是fury要求对用到的自定义消息对象要提前注册,虽然说可以在程序初始化时通过遍历消息包目录通过反射去注册完成,但总感觉还有优化的空间,参考Spring中的循环依赖的解决方案,希望官方能再优化。

fastjson2 胜出!

多语言生态上

fury 目前支持了 Java/Python/Golang/Rust/JavaScript/C++等 ,缺少对C# 版本的支持。
fastjson2 目前多语言支持很有限, 仅仅对java/Kotlin 做了支持,缺少对JavaScript和C# 版本的支持。
可以这么说,谁先对JavaScript和C# 的版本提供强力支持,谁将会吸引到一大批游戏从业者来使用该协议框架。

fury 胜出!

垃圾回收上

fastjson2,在BeanToArray(将对象序列化成数组)情况下,GC总共出现过 77 次,总共耗时 66 毫秒,在此期间也发生了多次的堆内存的申请,每秒钟大约会有 1545.476MB 的数据被创建,若换算成对jsonSerializeWithBeanToArray方法的每次调用,那么我们会发现大约有 336.001 Byte 的内存使用。
Fury,在 引用解析(RefTracking)关闭,类注册(ClassRegistration)打开,整数压缩(NumberCompressed)打开的情况下,GC总共出现过 66 次,总共耗时 57 毫秒,在此期间也发生了多次的堆内存的申请,每秒钟大约会有 1015.321 MB 的数据被创建,若换算成对furySerializeWithClassRegistrationAndNumberCompressed方法的每次调用,那么我们会发现大约有 168.001 Byte 的内存使用。
这个我们可以理解成,吞吐量越大,创建的数据越多,只要冗余的临时对象数量产生合理,该指标应该不会相差太大,这点上,两者战平。

JIT优化耗时上

fastjson2,在BeanToArray(将对象序列化成数组)情况下,执行过程中,profiled 的优化耗时为 4 毫秒,total 的优化耗时为 1948 毫秒。
Fury,在 引用解析(RefTracking)关闭,类注册(ClassRegistration)打开,整数压缩(NumberCompressed)打开的情况下,执行过程中,profiled 的优化耗时为 6 毫秒,total 的优化耗时为 2624 毫秒。
fastjson2 胜出!

综述

总之,两个协议框架各有千秋,不分伯仲,出了希望性能和包体上后面再接再厉,如果能在多语言生态,和接口的易用性上更上一层,两大框架会有更灿烂更广泛的应用前景。

附言:本人认知有限,如本文中有错误的使用或者见解,请联系我纠正,谢谢!

参考链接:
通过Features配置序列化和反序列化的行为
JSONB存储格式设计

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

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

相关文章

Tomcat 部署及优化

Tomcat概述 Tomcat 是 Java 语言开发的,Tomcat 服务器是一个免费的开放源代码的 Web 应用服务器,是 Apache 软件基金会的 Jakarta 项目中的一个核心项目,由 Apache、Sun 和其他一些公司及个人共同开发而成。在中小型系统和并发访问用户不是很…

Vite 创建 Vue项目之后,eslint 错误提示的处理

使用 npm create vuelatest创建 vue 项目(TS)之后,出现了一些 eslint 错误提示,显然,不是代码真实的错误,而是提示搞错了。 vuejs/create-vue: 🛠️ The recommended way to start a Vite-pow…

利用NtDuplicateObject进行Dump

前言 由于传播、利用此文所提供的信息而造成的任何直接或者间接的后果及损失,均由使用者本人负责,文章作者不为此承担任何责任。(本文仅用于交流学习) 这是国外老哥2020年提出的一种蛮有意思的思路。 我们先来看看大致的思路是…

Technical debt (技术负债 / 技术债)

Technical debt (技术负债 / 技术债) In software development, or any other IT field (e.g., Infrastructure, Networking, etc.) technical debt (also known as design debt or code debt) is the implied cost of future reworking required when choosing an easy but li…

成集云 | 报销单同步到金蝶云星空 | 解决方案

方案介绍 金蝶云星空是金蝶集团针对企业数字化转型需求推出的一款云端产品。它是一套集成了多个业务模块的全面企业管理解决方案,旨在帮助企业实现全面管控和高效运营。 旗下涵盖了多个功能模块,包括财务、人力资源、供应链、生产制造、销售与市场、客…

SpringBoot 整合JDBC

SpringData简介 Sping Data 官网:https://spring.io/projects/spring-data数据库相关的启动器 :可以参考官方文档:https://docs.spring.io/spring-boot/docs/2.6.5/reference/htmlsingle/#using-boot-starter 整合JDBC 创建测试项目测试数据…

云技术-混沌工程

目录 混沌工程 故障注入 监控和观测 自动化和持续集成 混沌工程 混沌工程(Chaos Engineering)是一种实验性的系统可靠性工程方法,主动引入故障和异常来测试系统的弹性和容错能力。混沌工程的核心思想是通过模拟故障场景来验证系统在各种异…

Android:换肤框架Android-Skin-Support

gihub地址:https://github.com/ximsfei/Android-skin-support 样例: 默认: 更换后: 一、引入依赖: // -- 换肤依赖implementation skin.support:skin-support:4.0.5// skin-supportimplementation skin.support:ski…

ctf中linux内核态的漏洞挖掘与利用系列(一)

说明 该系列文章主要是从ctf比赛入手,针对linux内核上的漏洞分析、挖掘与利用做讲解,本篇文章主要介绍内核漏洞利用所需的前置知识以及准备工作。 linux内核态与用户态的区别 以 Intel CPU 为例,按照权限级别划分,Intel把 CPU指…

Mysql数据库之单表查询

目录 一、练习时先导入数据如下: 二、查询验证导入是否成功 三、单表查询 四、where和having的区别 一、练习时先导入数据如下: 素材: 表名:worker-- 表中字段均为中文,比如 部门号 工资 职工号 参加工作 等 CRE…

umi快速搭建中后台管理系统(命令行创建和区块开发的区别)

后台管理系统 命令行创建新项目命令行效果图配置文件package.json umi3构建区块readme.md主页面页面布局页面布局的一些参数总结 区块开发步骤三级目录 命令行创建新项目 命令行 1、 npm i ant-design/pro-cli -g 2、 pro create demo_spacemv_managementsys 3、 umi 3 simpl…

安防监控小程序商城开发攻略

在当今信息化的时代,安防监控已经成为了人们生活中的重要一环。为了更好地满足人们对于安全的需求,许多企业都开始利用小程序来开展安防监控业务。那么,如何搭建一个安防监控小程序呢?下面我们将一步步来进行介绍。 首先&#xff…

Oracle 开发篇+Java通过共享模式访问Oracle数据库

标签:共享服务器进程、shared server process释义:shared server process是Oracle的一种数据库连接技术,类似的还有专用模式和DRCP ★ 数据库配置 alter system set shared_server_sessions1 scopespfile; alter system set max_shared_serv…

Delphi7通过VB6之COM对象调用PowerBASIC写的DLL功能

Delphi7通过VB6之COM对象调用PowerBASIC写的DLL功能。标题挺长,其实目标很简单,就是在Delphi7中使用PowerBASIC的MKI/CVI, MKS/CVS, MKD/CVD,并顺便加入CRC16检验函数,再进行16进制高低字节调整,方便在VB6、Delphi、La…

基于grpc从零开始搭建一个准生产分布式应用(系列)

花了点时间先把程序代码完全写完了,加了这个章节。因为后续章节是连续的,没有一个总纲同学们难免看的云里雾里的。本章先描述下完整的源码如何运行以及工程的结构。此专题大概由30章组成,真正的从0开始,框架是在原生产环境中抽取的…

【目标检测系列】YOLOV2解读

为更好理解YOLOv2模型,请先移步,了解YOLOv1后才能更好的理解YOLOv2所做的改进。 前情回顾:【目标检测系列】YOLOV1解读_怀逸%的博客-CSDN博客 背景 通用的目标检测应该具备快速、准确且能过识别各种各样的目标的特点。自从引入神经网络以来&a…

at命令 执行一次指定定时任务

简介: at命令 可以设置在一个指定的时间执行一个指定任务,只能执行一次,使用前确认系统开启了atd Service 安装: [rootnode1 ~]# yum -y install at启动: [rootnode1 ~]# systemctl enable atd [rootnode1 ~]# sys…

百望云斩获“2023企业财税服务平台TOP15”奖项

企业服务业务越来越成为企业发展中不可或缺的一部分。 根据权威数据,企业服务的市场规模在过去五年内年均增长率超过15%。这一点,在投融资领域可能表现得更加迅速也更加明显—— 依据IT桔子、烯牛数据的调研:7月份,企服领域投融资…

SonarQube安装与Java、PHP代码质量分析扫描

文章目录 1、下载安装1.1、SonarQube下载1.2、SonarQube安装1.3、SonarQube中文汉化1.4、SonarScanner扫描器 2、扫描项目2.1、java代码扫描2.2、php代码扫描 1、下载安装 SonarQube负责存储代码数据、收集数据、分析代码和生成报告等。 1.1、SonarQube下载 下载地址&#x…

HTML+CSS+JavaScript:渲染电商站购物车页面

一、需求 根据下图渲染购物车页面 二、代码素材 以下是缺失JS部分的代码&#xff0c;感兴趣的小伙伴可以先自己试着写一写 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta http-equiv"X-UA-Compatib…