省编码市编码区县编码_无浪费编码

省编码市编码区县编码

本文介绍了如何通过减少软件堆栈中的浪费来高效解决有意义的事件处理问题。

Java通常被视为无法在低内存环境中有效运行的内存猪。 目的是证明许多人认为不可能的事情,有意义的java程序几乎可以在没有内存的情况下运行。 示例流程
在Java的单个线程上,零内存gc的3MB堆中每秒有220万个csv记录

您将了解Java应用程序中主要浪费区域的位置以及可以用来减少浪费的模式。 引入了零成本抽象的概念,并且可以通过代码生成在编译时自动进行许多优化。 Maven插件简化了开发人员的工作流程。

我们的目标不是高性能,而是高效率的副产品。 该解决方案采用了Fluxtion ,与现有的Java事件处理框架相比,它占用的资源很少 。

计算与气候

当前,气候变化及其原因引起许多人的极大关注。 计算是主要的排放源,产生的碳足迹与整个航空业相同 。 在没有规定计算能耗的法规的情况下,作为工程师,我们必须承担生产与成本相平衡的高效系统的责任。

在伦敦Infoq 2019的一次小组会议上, 马丁·汤普森 ( Martin Thompson)热情洋溢地谈到了建筑节能计算系统。 他指出,控制废物是最大程度降低能耗的关键因素。 Martin的评论引起了我的共鸣,因为Fluxtion背后的核心理念是消除不必要的资源消耗。 小组会议是本文的灵感。

加工要求

处理示例的要求是:

  • 使用零gc在3MB的堆中运行
  • 仅使用标准Java库,没有“不安全”的优化
  • 读取包含数百万行输入数据的CSV文件
  • 输入是一组未知事件,没有预先加载数据
  • 数据行是异构类型
  • 处理每一行以计算多个汇总值
  • 计算取决于行类型和数据内容
  • 将规则应用于汇总并计算违反规则的次数
  • 数据随机分配以防止分支预测
  • 根据行输入值进行分区计算
  • 收集分区计算并将其分组到汇总视图中
  • 在文件末尾发布摘要报告
  • 使用高级功能的纯Java解决方案
  • 没有准时热身

头寸和利润监控示例

CSV文件包含一系列资产的交易和价格,每行一条记录。 每个资产的头寸和利润计算都划分在其自己的内存空间中。 资产计算会在每个匹配的输入事件上更新。 所有资产的利润将汇总为投资组合利润。 每项资产都监视其当前头寸/利润状态,并在其中一项违反预设限制时记录计数。 投资组合的利润将受到监控,并计算违约损失。

针对每个传入事件在资产和投资组合级别验证规则。 随着事件流式传输到系统中,违反规则的计数也会更新。

行数据类型

href="https://github.com/gregv12/articles/blob/article_may2019/2019/may/trading-monitor/src/main/java/com/fluxtion/examples/tradingmonitor/AssetPrice.java" target="_blank" rel="noopener noreferrer">AssetPrice - [price: double] [symbol: CharSequence]

Deal       - [price: double] [symbol: CharSequence] [size: int]

样本数据

CSV文件的每种类型都有一个标题行,以允许动态列位置映射到字段。 每行前面都有要编组的目标类型的简单类名。 记录示例集,包括标题:

Deal,symbol,size,price
AssetPrice,symbol,price
AssetPrice,FORD,15.0284
AssetPrice,APPL,16.4255
Deal,AMZN,-2000,15.9354

计算说明

资产计算按符号划分,然后收集到资产组合计算中。

分区资产计算

asset position  = sum(Deal::size)
deal cash value = (Deal::price) X (Deal::size) X -1
cash position   = sum(deal cash value)
mark to market  = (asset position) X (AssetPrice::price)
profit          = (asset mark to market) + (cash position)

投资组合计算

portfolio profit = sum(asset profit)

监控规则

asset loss > 2,000
asset position outside of range +- 200
portfolio loss > 10,000

注意:

  1. 当通知程序指示违反规则时,将进行计数。 通知程序仅在第一个违规时触发,直到将其重置。 当规则再次变得有效时,将重置通知程序。
  2. 正交易::大小是买入,负值是卖出。

执行环境

为了确保满足内存要求(零gc和3MB堆),
使用Epsilon无操作垃圾收集器,最大堆大小为3MB。 如果在整个过程的生命周期中分配了超过3MB的内存,则JVM将立即退出,并显示内存不足错误。

运行示例: 从git克隆,并在trading-monitor项目的根目录中,运行dist目录中的jar文件,以生成400万行的测试数据文件。

git clone --branch  article_may2019 https://github.com/gregv12/articles.git
cd articles/2019/may/trading-monitor/
jdk-12.0.1\bin\java.exe -jar dist\tradingmonitor.jar 4000000

默认情况下,tradingmonitor.jar处理data / generated-data.csv文件。 使用上面的命令,输入数据应具有400万行,并且长度为94MB,可以执行。

结果

要执行测试,请运行不带参数的tradingmonitor.jar:

jdk-12.0.1\bin\java.exe -verbose:gc -Xmx3M -XX:+UnlockExperimentalVMOptions -XX:+UseEpsilonGC -jar dist\tradingmonitor.jar

对400万行执行测试,摘要结果为:

Process row count     =    4 million
Processing time       =    1.815 seconds
Avg row exec time     =  453 nano seconds
Process rate          =    2.205 million records per second
garbage collections   =    0
allocated mem total   = 2857 KB
allocated mem per run =   90 KB
OS                    = windows 10
Processor             = Inte core i7-7700@3.6Ghz
Memory                = 16 GB
Disk                  = 512GB Samsung SSD PM961 NVMe

注意:结果来自没有JIT预热的第一次运行。 jit预热后,代码执行时间缩短了大约10%。 分配的总内存为2.86Mb,其中包括启动JVM。

通过分析Epsilon的输出,我们估计应用程序为6次运行分配了15%的内存,即每次运行分配90KB。 应用程序数据很可能适合L1缓存,此处需要进行更多调查。

输出量

每次测试程序循环打印6次结果,Epsilon在运行结束时记录内存统计信息。

jdk-12.0.1\bin\java.exe" -server -XX:+UnlockExperimentalVMOptions -XX:+UseEpsilonGC  -Xmx3M -verbose:gc -jar dist\tradingmonitor.jar
[0.011s][info][gc] Non-resizeable heap; start/max: 3M
[0.011s][info][gc] Using TLAB allocation; max: 4096K
[0.011s][info][gc] Elastic TLABs enabled; elasticity: 1.10x
[0.011s][info][gc] Elastic TLABs decay enabled; decay time: 1000ms
[0.011s][info][gc] Using Epsilon
[0.024s][info][gc] Heap: 3M reserved, 3M (100.00%) committed, 0M (5.11%) used
[0.029s][info][gc] Heap: 3M reserved, 3M (100.00%) committed, 0M (10.43%) used
.....
.....
[0.093s][info][gc] Heap: 3M reserved, 3M (100.00%) committed, 1M (64.62%) used
[0.097s][info][gc] Heap: 3M reserved, 3M (100.00%) committed, 2M (71.07%) usedportfolio loss gt 10k count -> 792211.0
Portfolio PnL:-917.6476000005273
Deals processed:400346
Prices processed:3599654
Assett positions:
-----------------------------
[1.849s][info][gc] Heap: 3M reserved, 3M (100.00%) committed, 2M (76.22%) used
MSFT : AssetTradePos{symbol=MSFT, pnl=484.68589999993696, assetPos=97.0, mtm=1697.0247000000002, cashPos=-1212.3388000000632, positionBreaches=139, pnlBreaches=13628, dealsProcessed=57046, pricesProcessed=514418}
GOOG : AssetTradePos{symbol=GOOG, pnl=-998.6065999999155, assetPos=-1123.0, mtm=-19610.1629, cashPos=18611.556300000084, positionBreaches=3, pnlBreaches=105711, dealsProcessed=57199, pricesProcessed=514144}
APPL : AssetTradePos{symbol=APPL, pnl=-21.881300000023202, assetPos=203.0, mtm=3405.1017, cashPos=-3426.9830000000234, positionBreaches=169, pnlBreaches=26249, dealsProcessed=57248, pricesProcessed=514183}
ORCL : AssetTradePos{symbol=ORCL, pnl=-421.9756999999504, assetPos=-252.0, mtm=-4400.4996, cashPos=3978.5239000000497, positionBreaches=103, pnlBreaches=97777, dealsProcessed=57120, pricesProcessed=513517}
FORD : AssetTradePos{symbol=FORD, pnl=112.14559999996254, assetPos=-511.0, mtm=-7797.8089, cashPos=7909.9544999999625, positionBreaches=210, pnlBreaches=88851, dealsProcessed=57177, pricesProcessed=514756}
BTMN : AssetTradePos{symbol=BTMN, pnl=943.8932999996614, assetPos=-1267.0, mtm=-19568.9417, cashPos=20512.83499999966, positionBreaches=33, pnlBreaches=117661, dealsProcessed=57071, pricesProcessed=514291}
AMZN : AssetTradePos{symbol=AMZN, pnl=-557.0849999999355, assetPos=658.0, mtm=10142.214600000001, cashPos=-10699.299599999937, positionBreaches=63, pnlBreaches=114618, dealsProcessed=57485, pricesProcessed=514345}
-----------------------------
Events proecssed:4000000
millis:1814
...
...
portfolio loss gt 10k count -> 792211.0
Portfolio PnL:-917.6476000005273
Deals processed:400346
Prices processed:3599654
Assett positions:
-----------------------------
MSFT : AssetTradePos{symbol=MSFT, pnl=484.68589999993696, assetPos=97.0, mtm=1697.0247000000002, cashPos=-1212.3388000000632, positionBreaches=139, pnlBreaches=13628, dealsProcessed=57046, pricesProcessed=514418}
GOOG : AssetTradePos{symbol=GOOG, pnl=-998.6065999999155, assetPos=-1123.0, mtm=-19610.1629, cashPos=18611.556300000084, positionBreaches=3, pnlBreaches=105711, dealsProcessed=57199, pricesProcessed=514144}
APPL : AssetTradePos{symbol=APPL, pnl=-21.881300000023202, assetPos=203.0, mtm=3405.1017, cashPos=-3426.9830000000234, positionBreaches=169, pnlBreaches=26249, dealsProcessed=57248, pricesProcessed=514183}
ORCL : AssetTradePos{symbol=ORCL, pnl=-421.9756999999504, assetPos=-252.0, mtm=-4400.4996, cashPos=3978.5239000000497, positionBreaches=103, pnlBreaches=97777, dealsProcessed=57120, pricesProcessed=513517}
FORD : AssetTradePos{symbol=FORD, pnl=112.14559999996254, assetPos=-511.0, mtm=-7797.8089, cashPos=7909.9544999999625, positionBreaches=210, pnlBreaches=88851, dealsProcessed=57177, pricesProcessed=514756}
BTMN : AssetTradePos{symbol=BTMN, pnl=943.8932999996614, assetPos=-1267.0, mtm=-19568.9417, cashPos=20512.83499999966, positionBreaches=33, pnlBreaches=117661, dealsProcessed=57071, pricesProcessed=514291}
AMZN : AssetTradePos{symbol=AMZN, pnl=-557.0849999999355, assetPos=658.0, mtm=10142.214600000001, cashPos=-10699.299599999937, positionBreaches=63, pnlBreaches=114618, dealsProcessed=57485, pricesProcessed=514345}
-----------------------------
Events proecssed:4000000
millis:1513
[14.870s][info][gc] Total allocated: 2830 KB
[14.871s][info][gc] Average allocation rate: 19030 KB/sec

废物热点

下表标识了处理循环中的功能,这些功能通常会创建示例中使用的浪费和避免浪费技术。

功能 废物来源 影响 回避
读取CSV文件 为每行分配一个新的字符串 GC 将每个字节读入一个flyweight,并在无分配解码器中进行处理
行数据持有人 为每一行分配一个数据实例 GC Flyweight单个数据实例
读取列值 为每列分配一个字符串数组 GC 将字符推送到可重复使用的字符缓冲区中
将值转换为类型 字符串到类型的转换分配内存 GC 零分配转换器CharSequence代替字符串
将col值推送给持有人 基本类型的自动装箱会分配内存。 GC 原始感知功能可推送数据。 零分配
分区数据处理 数据分区并行处理。 分配给队列的任务 GC /锁 单线程处理,无分配或锁
计算方式 自动装箱,分配中间实例的不可变类型。 无状态功能需要外部状态存储和分配 GC 生成没有自动装箱的功能。 有状态功能零分配
汇总摘要计算 将分区线程的结果推送到队列中。 需要分配和同步 GC /锁 单线程处理,无分配或锁

减少废物的解决方案

使用Fluxtion生成实现事件处理的代码。 生成解决方案允许采用零成本抽象方法,其中已编译的解决方案的开销最少。 程序员描述所需的行为,并在构建时生成满足要求的优化解决方案。 对于此示例,可以在此处查看生成的代码。

maven pom包含一个配置文件,用于使用通过以下命令执行的Fluxtion maven插件重建生成的文件:

mvn -Pfluxtion install

文件读取

从输入文件中提取数据作为一系列CharEvents ,并将其发布到csv类型的marshaller。 每个字符都可以从文件中单独读取,然后推入CharEvent中。 由于重复使用了相同的CharEvent实例,因此初始化后不会分配任何内存。 用于流CharEvents逻辑位于CharStreamer类。 整个96 MB的文件可以读取,应用程序在堆上分配的内存几乎为零。

CSV处理

在Javabean中添加@CsvMarshaller会通知Fluxtion在构建时生成csv解析器。 Fluxtion在应用程序类中扫描@CsvMarshaller批注,并在构建过程中生成编组器。 有关示例,请参见AssetPrice.java ,它会生成AssetPriceCsvDecoder0 。 解码器处理CharEvents并将行数据编组到目标实例中。

生成的CSV解析器采用上表中概述的策略,避免了不必要的内存分配,并为处理的每一行重用了对象实例:

  • 单个可重复使用的字符缓冲区实例存储行字符
  • 轻量级可重用实例是编组列数据的目标
  • 直接从CharSequence转换为目标类型,而无需创建中间对象。
  • 如果在目标实例中使用了CharSequence,则不会创建任何字符串,则将使用一个轻量级的Charsequence。

有关将无用字符转换为目标字段的示例,请参见AssetPriceCsvDecoder中的upateTarget()方法:

计算方式

该构建器使用Fluxtion流API描述资产计算。 声明形式类似于Java流api,但是建立实时事件处理图。 标有注释的方法
Maven插件调用@SepBuilder来生成静态事件处理器。 以下代码描述了资产的计算,请参见
FluxtionBuilder :

@SepBuilder(name = "SymbolTradeMonitor",packageName = "com.fluxtion.examples.tradingmonitor.generated.symbol",outputDir = "src/main/java",cleanOutputDir = true)public void buildAssetAnalyser(SEPConfig cfg) {//entry points subsrcibe to eventsWrapper<Deal> deals = select(Deal.class);Wrapper<AssetPrice> prices = select(AssetPrice.class);//result collector, and republish as an event sourceAssetTradePos results = cfg.addPublicNode(new AssetTradePos(), "assetTradePos");eventSource(results);//calculate derived valuesWrapper<Number> cashPosition = deals.map(multiply(), Deal::getSize, Deal::getPrice).map(multiply(), -1).map(cumSum());Wrapper<Number> pos = deals.map(cumSum(), Deal::getSize);Wrapper<Number> mtm = pos.map(multiply(), arg(prices, AssetPrice::getPrice));Wrapper<Number> pnl = add(mtm, cashPosition);//collect into resultscashPosition.push(results::setCashPos);pos.push(results::setAssetPos);mtm.push(results::setMtm);pnl.push(results::setPnl);deals.map(count()).push(results::setDealsProcessed);prices.map(count()).push(results::setPricesProcessed);//add some rules - only fires on first breachpnl.filter(lt(-200)).notifyOnChange(true).map(count()).push(results::setPnlBreaches);pos.filter(outsideBand(-200, 200)).notifyOnChange(true).map(count()).push(results::setPositionBreaches);//human readable names to nodes in generated code - not required deals.id("deals");prices.id("prices");cashPosition.id("cashPos");pos.id("assetPos");mtm.id("mtm");pnl.id("pnl");}

功能描述被转换为有效的命令形式以执行。 生成的事件处理器SymbolTradeMonitor是AssetPrice和Deal事件的入口点。 事件处理器使用生成的帮助程序类来计算聚合,这些帮助程序类在此处 。

处理器从分区程序接收事件,并调用帮助程序函数以提取数据并调用计算函数,将聚合结果存储在节点中。 汇总值被推送到结果实例AssetTradePos的字段中。 不创建任何中间对象,无需自动装箱即可处理任何原始计算。 计算节点从父实例引用数据,执行期间没有数据对象在图上移动。 图形初始化后,处理事件时便没有内存分配。

与代码同时生成代表资产计算处理图的图像,如下所示:

资产处理图

FluxtionBuilderbuilder类的buildPortfolioAnalyser方法中描述了投资组合的一组类似计算,生成了PortfolioTradeMonitor事件处理程序。 AssetTradePos从SymbolTradeMonitor发布到PortfolioTradeMonitor。 用于投资组合计算的生成文件位于此处 。

分区和收集

所有计算,分区和收集操作都在同一单个线程中进行,不需要锁。 不需要不变的对象,因为没有要处理的并发问题。 封送处理的事件具有隔离的私有作用域,由于生成的事件处理器在事件处理期间控制实例的生命周期,因此可以安全地重用实例。

系统数据流

下图显示了系统的完整数据流,从磁盘上的字节到已发布的摘要报告。 紫色框是构建的一部分,蓝色框是可重用的类。

结论

在本文中,我证明了可以解决Java中复杂的事件处理问题而几乎没有浪费。 在声明/功能方法中使用了高级功能来描述所需的行为,并且生成的事件处理器符合描述的要求。 一个简单的注释触发编组器生成。 生成的代码是JIT可以轻松优化的简单命令式代码。 不会进行不必要的内存分配,并且将尽可能多地重用实例。

采用这种方法,具有低资源消耗的高性能解决方案在普通程序员的掌握范围内。 传统上,只有具有多年经验的专业工程师才能获得这些结果。

尽管这种方法在Java中很新颖,但在其他语言中却很熟悉,通常称为零成本抽象。

在当今基于云的计算环境中,资源是按消耗的单位计费的。 任何节省能源的解决方案也将对公司的底线产生积极的好处。

翻译自: https://www.javacodegeeks.com/2019/06/waste-free-coding.html

省编码市编码区县编码

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

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

相关文章

Java日期时间字符串和毫秒相互转换的方法

参考链接&#xff1a; 1.https://www.jb51.net/article/130195.htm 2.https://blog.csdn.net/yhj19920417/article/details/73799842?locationNum10&fps1

谷歌本地不支持websocket_django开发-websocket的实现

今天介绍下如何在django中使用channels实现websocket。其实还可以使用dwebsocket实现websocket&#xff0c;这里不做介绍。首先介绍一个概念ASGI。ASGI异步网关协议接口&#xff0c;一个介于网络协议服务和Python应用之间的标准接口&#xff0c;能够处理多种通用的协议类型&…

我要正式开始《一个项目征服Java中高级体系》

在互联网上经常看到很多人说35岁危机的问题、大厂裁员、互联网寒冬这些问题。我感觉比较幸运的是&#xff0c;在之前大环境还不是很坏时候就被裁了一次&#xff0c;所以我很早就开始做持续的准备&#xff0c;现在不好说一定能怎么样&#xff0c; 至少自己在持续的探索适合自己的…

cuba 平台_CUBA 7的新功能

cuba 平台三年前&#xff0c;我们宣布了该框架的第二个公开可用的主要版本。 CUBA 6是改变游戏规则的版本–许可从专有转为Apache 2.0。 那些日子&#xff0c;我们甚至无法猜测从长远来看它将把框架带到哪里。 CUBA社区开始呈指数级增长&#xff0c;因此我们了解了开发人员如何…

java.util.Date详解

获取当前的系统时间&#xff1a; Date date new Date();获取毫秒数&#xff1a; long time date.getTime();毫秒数转成 Date 对象&#xff1a; long l 23434324324343L; Date date new Date(l);比较两个 Date 对象&#xff1a; SimpleDateFormat sdf new SimpleDateFo…

夸克代码_关于夸克的思考

夸克代码Quarkus&#xff0c;新的“超音速&#xff0c;亚原子” Java框架目前正受到广泛关注。 对于企业Java的未来而言&#xff0c;此构建和运行时工具背后的思想确实比我们感兴趣。 使用Quarkus有什么好处和缺点&#xff1f; 摆脱动力 Quarkus认为&#xff0c;在容器化的世…

ntdll 异常代码0xc0000374_不要把异常当做业务逻辑,这性能可能你无法承受

一&#xff1a;背景1. 讲故事在项目中摸爬滚打几年&#xff0c;应该或多或少的见过有人把异常当做业务逻辑处理的情况(┬&#xff3f;┬)&#xff0c;比如说判断一个数字是否为整数,就想当然的用try catch包起来&#xff0c;再进行 int.Parse&#xff0c;如果抛异常就说明不是整…

java中的hashset_Java中的HashSet

java中的hashset介绍&#xff1a; Java中的HashSet实现Set接口&#xff0c;即它不允许重复。 它在内部由HashMap支持&#xff0c;该哈希表基于哈希原理。 我们可以在HashSet中存储一个空值。 默认容量为16&#xff0c;负载系数为0.75&#xff0c;其中&#xff1a; Load facto…

win32bridge.server.exe函数不正确_修电脑?不,其实我们学的是......

COMPUTER计信学子Python?JAVA?C?C?HTML?身为重师计信人逢年过节总免不了被亲戚们“盘问”一番必问清单第一名就是“专业”他们往往从字面去理解而我们计信人被误解的频率相当高“学计算机的肯定会修电脑对吧”请接着看下去吧!我们学的到底是什么&#xff1f;(点击查看答案…

SimpleDateFormat详解

SimpleDateFormat 中的时间标识含义&#xff1a; G 年代标志符 y 年 M 月 d 日 h 时 在上午或下午 (1~12) H 时 在一天中 (0~23) m 分 s 秒 S 毫秒 E 星期 D 一年中的第几天 F 一月中第几个星期几 w 一年中第几个星期 W 一月中第几个星期 a 上午 / 下午 标记符 k 时 在一天中 …

java uuid_Java UUID

java uuid介绍&#xff1a; UUID&#xff08;通用唯一标识符&#xff09;表示一个128位长的唯一值 。 它也被普遍称为GUID&#xff08;全球唯一标识符&#xff09;。 UUID的标准表示形式由十六进制数字组成&#xff1a; 533a4559-e55c-18b3-8456-555563322002并具有36个字符 …

JDK 9.0.4 报错:程序包 com.sun.xml.internal.fastinfoset.stax.events 不存在/不可见

IDE&#xff1a;IntelliJ IDEA 构建工具&#xff1a;Maven JDK版本&#xff1a;JDK 9.0.4 在代码中使用下面的工具类&#xff1a; com.sun.xml.internal.fastinfoset.stax.events.Util报错如下&#xff1a; 或者 光标移到 Util 处&#xff0c;按下 Option Enter&#xff1a…

3650m5设置u盘启动_系统重装必备神器,U盘如何制作启动盘?

早些年的时候&#xff0c;电脑安装系统需要光盘&#xff0c;但是现在光盘也逐渐退出历史舞台。不管是台式计算机还是笔记本&#xff0c;光驱这个东西也逐渐消失。如果自己的计算机没有光驱&#xff0c;电脑又无法开机需要重装系统&#xff0c;这个时候该怎么办呢&#xff1f;可…

jtable隐藏全部_全部隐藏!

jtable隐藏全部在较早的文章中 &#xff0c;我写了以下几句话&#xff1a; 在面向对象的代码库中&#xff0c;该工具包应尽可能离散。 您使用开发套件的次数越多&#xff0c;您的代码实际面向对象的次数就越少&#xff0c;或者您的抽象并不是最好的。 。 我认为有必要详细说明…

IntelliJ IDEA 如何多模块开发

参考&#xff1a; https://blog.csdn.net/jqc874789596/article/details/86609554

距离矢量路由算法的java代码_八大排序算法比较(附Java代码)

冒泡排序/*** 冒泡排序 比较好理解* 两两相比 较大的放后面* 时间复杂度O(n^2)*//*** 改进前的冒泡排序算法进行100,000数据排序运行时间为&#xff1a;3829ms* 优化后的冒泡排序算法进行100,000数据排序运行时间为&#xff1a;3551ms*/ public static void bubbleSort(int[] a…

jaxb注解使用_使用JAXB时

jaxb注解使用并没有很多例子可以说明这一点&#xff0c;但是如何在应用程序中使用JAXB可以在性能&#xff08;和内存使用&#xff09;方面产生巨大差异。 这个例子 在此博客文章中&#xff0c;我将使用一个名为Membership的示例对象&#xff0c;看起来像这样&#xff1a; 我们…

org.apache.tomcat.util.descriptor.web.WebXml.setVersion 未知版本字符串 [4.0]

参考&#xff1a; https://blog.csdn.net/qq_40829288/article/details/93936261 https://www.shuzhiduo.com/A/Ae5RnvaN5Q/ https://www.cnblogs.com/youpeng/p/11095504.html

python无法安装pycurl_Python安装pycurl失败的解决方法

Centos安装pycurlcentos 安装pycurlyum install python-devel curl-develpip3 install pycurlMac(老版本)安装pycurl解决MacOS升级后出现xcrun: error: invalid active developer path, missing xcrun的问题xcode-select --install然后dongchang-5:qqmusic baoshan$ pip3 insta…

组装一台计算机 java_如何在同一台计算机上安装多个Java版本

组装一台计算机 java一段时间以前&#xff0c;我写了一篇文章《 用示例解释Java Lambda表达式》&#xff0c;但是我很容易浏览Java 8&#xff0c;因为我在项目中使用了Java 8&#xff0c;并且允许我安装和使用它。 但是在我当前的项目中&#xff0c;我们仍在使用Java 8&#xf…