日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

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

發(fā)布時間:2023/12/3 编程问答 42 豆豆
生活随笔 收集整理的這篇文章主要介紹了 省编码市编码区县编码_无浪费编码 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

省編碼市編碼區(qū)縣編碼

本文介紹了如何通過減少軟件堆棧中的浪費來高效解決有意義的事件處理問題。

Java通常被視為無法在低內(nèi)存環(huán)境中有效運行的內(nèi)存豬。 目的是證明許多人認為不可能的事情,有意義的java程序幾乎可以在沒有內(nèi)存的情況下運行。 示例流程
在Java的單個線程上,零內(nèi)存gc的3MB堆中每秒有220萬個csv記錄 。

您將了解Java應用程序中主要浪費區(qū)域的位置以及可以用來減少浪費的模式。 引入了零成本抽象的概念,并且可以通過代碼生成在編譯時自動進行許多優(yōu)化。 Maven插件簡化了開發(fā)人員的工作流程。

我們的目標不是高性能,而是高效率的副產(chǎn)品。 該解決方案采用了Fluxtion ,與現(xiàn)有的Java事件處理框架相比,它占用的資源很少 。

計算與氣候

當前,氣候變化及其原因引起許多人的極大關(guān)注。 計算是主要的排放源,產(chǎn)生的碳足跡與整個航空業(yè)相同 。 在沒有規(guī)定計算能耗的法規(guī)的情況下,作為工程師,我們必須承擔生產(chǎn)與成本相平衡的高效系統(tǒng)的責任。

在倫敦Infoq 2019的一次小組會議上, 馬丁·湯普森 ( Martin Thompson)熱情洋溢地談到了建筑節(jié)能計算系統(tǒng)。 他指出,控制廢物是最大程度降低能耗的關(guān)鍵因素。 Martin的評論引起了我的共鳴,因為Fluxtion背后的核心理念是消除不必要的資源消耗。 小組會議是本文的靈感。

加工要求

處理示例的要求是:

  • 使用零gc在3MB的堆中運行
  • 僅使用標準Java庫,沒有“不安全”的優(yōu)化
  • 讀取包含數(shù)百萬行輸入數(shù)據(jù)的CSV文件
  • 輸入是一組未知事件,沒有預先加載數(shù)據(jù)
  • 數(shù)據(jù)行是異構(gòu)類型
  • 處理每一行以計算多個匯總值
  • 計算取決于行類型和數(shù)據(jù)內(nèi)容
  • 將規(guī)則應用于匯總并計算違反規(guī)則的次數(shù)
  • 數(shù)據(jù)隨機分配以防止分支預測
  • 根據(jù)行輸入值進行分區(qū)計算
  • 收集分區(qū)計算并將其分組到匯總視圖中
  • 在文件末尾發(fā)布摘要報告
  • 使用高級功能的純Java解決方案
  • 沒有準時熱身

頭寸和利潤監(jiān)控示例

CSV文件包含一系列資產(chǎn)的交易和價格,每行一條記錄。 每個資產(chǎn)的頭寸和利潤計算都劃分在其自己的內(nèi)存空間中。 資產(chǎn)計算會在每個匹配的輸入事件上更新。 所有資產(chǎn)的利潤將匯總為投資組合利潤。 每項資產(chǎn)都監(jiān)視其當前頭寸/利潤狀態(tài),并在其中一項違反預設(shè)限制時記錄計數(shù)。 投資組合的利潤將受到監(jiān)控,并計算違約損失。

針對每個傳入事件在資產(chǎn)和投資組合級別驗證規(guī)則。 隨著事件流式傳輸?shù)较到y(tǒng)中,違反規(guī)則的計數(shù)也會更新。

行數(shù)據(jù)類型

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]

樣本數(shù)據(jù)

CSV文件的每種類型都有一個標題行,以允許動態(tài)列位置映射到字段。 每行前面都有要編組的目標類型的簡單類名。 記錄示例集,包括標題:

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

計算說明

資產(chǎn)計算按符號劃分,然后收集到資產(chǎn)組合計算中。

分區(qū)資產(chǎn)計算

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)

監(jiān)控規(guī)則

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

注意:

  • 當通知程序指示違反規(guī)則時,將進行計數(shù)。 通知程序僅在第一個違規(guī)時觸發(fā),直到將其重置。 當規(guī)則再次變得有效時,將重置通知程序。
  • 正交易::大小是買入,負值是賣出。
  • 執(zhí)行環(huán)境

    為了確保滿足內(nèi)存要求(零gc和3MB堆),
    使用Epsilon無操作垃圾收集器,最大堆大小為3MB。 如果在整個過程的生命周期中分配了超過3MB的內(nèi)存,則JVM將立即退出,并顯示內(nèi)存不足錯誤。

    運行示例: 從git克隆,并在trading-monitor項目的根目錄中,運行dist目錄中的jar文件,以生成400萬行的測試數(shù)據(jù)文件。

    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文件。 使用上面的命令,輸入數(shù)據(jù)應具有400萬行,并且長度為94MB,可以執(zhí)行。

    結(jié)果

    要執(zhí)行測試,請運行不帶參數(shù)的tradingmonitor.jar:

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

    對400萬行執(zhí)行測試,摘要結(jié)果為:

    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

    注意:結(jié)果來自沒有JIT預熱的第一次運行。 jit預熱后,代碼執(zhí)行時間縮短了大約10%。 分配的總內(nèi)存為2.86Mb,其中包括啟動JVM。

    通過分析Epsilon的輸出,我們估計應用程序為6次運行分配了15%的內(nèi)存,即每次運行分配90KB。 應用程序數(shù)據(jù)很可能適合L1緩存,此處需要進行更多調(diào)查。

    輸出量

    每次測試程序循環(huán)打印6次結(jié)果,Epsilon在運行結(jié)束時記錄內(nèi)存統(tǒng)計信息。

    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

    廢物熱點

    下表標識了處理循環(huán)中的功能,這些功能通常會創(chuàng)建示例中使用的浪費和避免浪費技術(shù)。

    功能 廢物來源 影響 回避
    讀取CSV文件 為每行分配一個新的字符串 GC 將每個字節(jié)讀入一個flyweight,并在無分配解碼器中進行處理
    行數(shù)據(jù)持有人 為每一行分配一個數(shù)據(jù)實例 GC Flyweight單個數(shù)據(jù)實例
    讀取列值 為每列分配一個字符串數(shù)組 GC 將字符推送到可重復使用的字符緩沖區(qū)中
    將值轉(zhuǎn)換為類型 字符串到類型的轉(zhuǎn)換分配內(nèi)存 GC 零分配轉(zhuǎn)換器CharSequence代替字符串
    將col值推送給持有人 基本類型的自動裝箱會分配內(nèi)存。 GC 原始感知功能可推送數(shù)據(jù)。 零分配
    分區(qū)數(shù)據(jù)處理 數(shù)據(jù)分區(qū)并行處理。 分配給隊列的任務(wù) GC /鎖 單線程處理,無分配或鎖
    計算方式 自動裝箱,分配中間實例的不可變類型。 無狀態(tài)功能需要外部狀態(tài)存儲和分配 GC 生成沒有自動裝箱的功能。 有狀態(tài)功能零分配
    匯總摘要計算 將分區(qū)線程的結(jié)果推送到隊列中。 需要分配和同步 GC /鎖 單線程處理,無分配或鎖

    減少廢物的解決方案

    使用Fluxtion生成實現(xiàn)事件處理的代碼。 生成解決方案允許采用零成本抽象方法,其中已編譯的解決方案的開銷最少。 程序員描述所需的行為,并在構(gòu)建時生成滿足要求的優(yōu)化解決方案。 對于此示例,可以在此處查看生成的代碼。

    maven pom包含一個配置文件,用于使用通過以下命令執(zhí)行的Fluxtion maven插件重建生成的文件:

    mvn -Pfluxtion install

    文件讀取

    從輸入文件中提取數(shù)據(jù)作為一系列CharEvents ,并將其發(fā)布到csv類型的marshaller。 每個字符都可以從文件中單獨讀取,然后推入CharEvent中。 由于重復使用了相同的CharEvent實例,因此初始化后不會分配任何內(nèi)存。 用于流CharEvents邏輯位于CharStreamer類。 整個96 MB的文件可以讀取,應用程序在堆上分配的內(nèi)存幾乎為零。

    CSV處理

    在Javabean中添加@CsvMarshaller會通知Fluxtion在構(gòu)建時生成csv解析器。 Fluxtion在應用程序類中掃描@CsvMarshaller批注,并在構(gòu)建過程中生成編組器。 有關(guān)示例,請參見AssetPrice.java ,它會生成AssetPriceCsvDecoder0 。 解碼器處理CharEvents并將行數(shù)據(jù)編組到目標實例中。

    生成的CSV解析器采用上表中概述的策略,避免了不必要的內(nèi)存分配,并為處理的每一行重用了對象實例:

    • 單個可重復使用的字符緩沖區(qū)實例存儲行字符
    • 輕量級可重用實例是編組列數(shù)據(jù)的目標
    • 直接從CharSequence轉(zhuǎn)換為目標類型,而無需創(chuàng)建中間對象。
    • 如果在目標實例中使用了CharSequence,則不會創(chuàng)建任何字符串,則將使用一個輕量級的Charsequence。

    有關(guān)將無用字符轉(zhuǎn)換為目標字段的示例,請參見AssetPriceCsvDecoder中的upateTarget()方法:

    計算方式

    該構(gòu)建器使用Fluxtion流API描述資產(chǎn)計算。 聲明形式類似于Java流api,但是建立實時事件處理圖。 標有注釋的方法
    Maven插件調(diào)用@SepBuilder來生成靜態(tài)事件處理器。 以下代碼描述了資產(chǎn)的計算,請參見
    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");}

    功能描述被轉(zhuǎn)換為有效的命令形式以執(zhí)行。 生成的事件處理器SymbolTradeMonitor是AssetPrice和Deal事件的入口點。 事件處理器使用生成的幫助程序類來計算聚合,這些幫助程序類在此處 。

    處理器從分區(qū)程序接收事件,并調(diào)用幫助程序函數(shù)以提取數(shù)據(jù)并調(diào)用計算函數(shù),將聚合結(jié)果存儲在節(jié)點中。 匯總值被推送到結(jié)果實例AssetTradePos的字段中。 不創(chuàng)建任何中間對象,無需自動裝箱即可處理任何原始計算。 計算節(jié)點從父實例引用數(shù)據(jù),執(zhí)行期間沒有數(shù)據(jù)對象在圖上移動。 圖形初始化后,處理事件時便沒有內(nèi)存分配。

    與代碼同時生成代表資產(chǎn)計算處理圖的圖像,如下所示:

    資產(chǎn)處理圖

    FluxtionBuilderbuilder類的buildPortfolioAnalyser方法中描述了投資組合的一組類似計算,生成了PortfolioTradeMonitor事件處理程序。 AssetTradePos從SymbolTradeMonitor發(fā)布到PortfolioTradeMonitor。 用于投資組合計算的生成文件位于此處 。

    分區(qū)和收集

    所有計算,分區(qū)和收集操作都在同一單個線程中進行,不需要鎖。 不需要不變的對象,因為沒有要處理的并發(fā)問題。 封送處理的事件具有隔離的私有作用域,由于生成的事件處理器在事件處理期間控制實例的生命周期,因此可以安全地重用實例。

    系統(tǒng)數(shù)據(jù)流

    下圖顯示了系統(tǒng)的完整數(shù)據(jù)流,從磁盤上的字節(jié)到已發(fā)布的摘要報告。 紫色框是構(gòu)建的一部分,藍色框是可重用的類。

    結(jié)論

    在本文中,我證明了可以解決Java中復雜的事件處理問題而幾乎沒有浪費。 在聲明/功能方法中使用了高級功能來描述所需的行為,并且生成的事件處理器符合描述的要求。 一個簡單的注釋觸發(fā)編組器生成。 生成的代碼是JIT可以輕松優(yōu)化的簡單命令式代碼。 不會進行不必要的內(nèi)存分配,并且將盡可能多地重用實例。

    采用這種方法,具有低資源消耗的高性能解決方案在普通程序員的掌握范圍內(nèi)。 傳統(tǒng)上,只有具有多年經(jīng)驗的專業(yè)工程師才能獲得這些結(jié)果。

    盡管這種方法在Java中很新穎,但在其他語言中卻很熟悉,通常稱為零成本抽象。

    在當今基于云的計算環(huán)境中,資源是按消耗的單位計費的。 任何節(jié)省能源的解決方案也將對公司的底線產(chǎn)生積極的好處。

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

    省編碼市編碼區(qū)縣編碼

    總結(jié)

    以上是生活随笔為你收集整理的省编码市编码区县编码_无浪费编码的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。