C ++或Java,高頻交易哪個更快?

總覽

關于什么是高頻交易的最佳解決方案,存在不同意見。 問題的一部分是高頻交易的變化超出您的預期,另一部分是更快的含義。

我的看法

如果您有一個典型的Java程序員和一個典型的C ++程序員,并且每個人都有幾年編寫典型的面向對象程序的經驗,并且給了他們相同的時間,那么Java程序員可能會更早地擁有一個工作程序,并且將擁有更多的工作時間。是時候調整應用程序了。 在這種情況下,Java應用程序可能會更快。 恕我直言。

以我的經驗,Java在檢測不需要執行的代碼方面在C ++上表現更好。 esp微型基準測試,無濟于事。 ;)如果您在不花任何時間和精力的情況下盡可能地調優Java和C ++,那么C ++程序將更快。 但是,在有限的資源和不斷變化的環境中,動態語言將無法運行。 即在實際應用中。

在股票空間延遲中,您需要將潛伏期定為10到10毫秒以下才能使頻率很高。 不能選擇Java甚至商用硬件上的標準OOP C ++。 您需要C或C ++的精簡版以及專用硬件,例如FPGA,GPU。

在FX中,高頻意味著延遲小于100 us。 在此空間中,可以選擇使用C ++或帶有內核旁路網絡適配器的精簡Java(低GC)。 在這種情況下,使用一種或另一種語言將有加有減。 就個人而言,我認為隨著交流的不斷變化,Java會提供更大的靈活性,前提是您認為可以利用IT獲得競爭優勢。

在許多情況下,當人們談論高頻(尤其是Banks)時,他們說的是1 ms以下或一位數ms。 在這個領域,我想說Java,Scala或C#等的靈活性/動態編程將給您時間,與C / C ++或FPGA相比,具有可維護性和可靠性方面的優勢。


Java面臨的問題

問題不在于語言本身,而是缺乏對緩存,上下文切換和中斷的控制。 如果復制一塊內存(發生在本機內存中,但是在運行之間使用了不同的延遲),則該副本會變慢,具體取決于副本之間發生的情況。

問題不是GC或Java,因為這兩者都不起作用。 問題在于緩存的一部分已被換出,副本本身需要更長的時間。 這對于任何訪問內存的操作都是相同的。 例如訪問普通對象也將變慢。

private void doTest(Pauser delay) throws InterruptedException {int[] times = new int[1000 * 1000];byte[] bytes = new byte[32* 1024];byte[] bytes2 = new byte[32 * 1024];long end = System.nanoTime() + (long) 5e9;int i;for (i = 0; i < times.length; i++) {long start = System.nanoTime();System.arraycopy(bytes, 0, bytes2, 0, bytes.length);long time = System.nanoTime() - start;times[i] = (int) time;delay.pause();if (start > end) break;}Arrays.sort(times, 0, i);System.out.printf(delay + ": Copy memory latency 1/50/99%%tile %.1f/%.1f/%.1f us%n",times[i / 100] / 1e3,times[i / 2] / 1e3,times[i - i / 100 - 1] / 1e3);
}

測試多次執行相同的操作,執行該測試之間的延遲有所不同。 該測試將大部分時間花費在本機方法上,并且沒有像在測試期間那樣創建或丟棄任何對象。

收益率:復制內存延遲1/50/99%tile 1.6 / 1.6 / 2.3 us
NO_WAIT:復制內存延遲1/50/99%tile 1.6 / 1.6 / 1.6 us
BUSY_WAIT_10:復制內存延遲時間為1/50/99%tile 3.1 / 3.5 / 4.4 us BUSY_WAIT_3:復制內存延遲時間為1/50/99%tile 2.7 / 3.0 / 4.0 us BUSY_WAIT_1:復制內存延遲時間為1/50/99%tile 1.6 / 1.6 / 2.6 us SLEEP_10:復制內存延遲時間為1/50/99%tile 2.3 / 3.7 / 5.2 us SLEEP_3:復制內存延遲時間為1/50/99%tile 2.7 / 4.4 / 4.8 us SLEEP_1:復制內存延遲時間為1/50/99%tile 2.8 / 4.6 / 5.0 us

執行內存復制所需的典型時間(中間值)在1.6到4.6 us之間,這取決于是否有1到10毫秒的繁忙等待或睡眠時間。 這個比率大約是Java的3倍,但與Java沒有任何關系。 甚至最好的時間也相差約2倍。


編碼

ThreadlatencyTest.java


結論

在超高頻下,核心引擎將比OOP C ++或Java更多的C,匯編和自定義硬件。 在引擎的延遲要求不太嚴格的市場中,C ++和Low GC Java成為了選擇。 隨著等待時間要求變得不那么嚴格,Java和其他動態語言可能會變得更有效率。 在這種情況下,Java可以更快地推向市場,因此您可以利用市場/需求變化中的優勢。

參考: C ++或Java,高頻交易更快? 來自我們的JCG合作伙伴 Peter Lawrey在Vanilla Java 。

相關文章:
  • Java中的低GC:使用原語而不是包裝器
  • Java Lambda語法替代
  • JVM如何處理鎖
  • Erlang與Java內存架構
  • Java Fork / Join進行并行編程
  • Java最佳實踐系列
  • 如何在Java中獲得類似于C的性能

翻譯自: https://www.javacodegeeks.com/2011/07/c-or-java-which-is-faster-for-high.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/374781.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/374781.shtml
英文地址,請注明出處:http://en.pswp.cn/news/374781.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

iOS 8 Xcode6 設置Launch Image 啟動圖片

本人apem http://www.mamicode.com/info-detail-494411.html 如何設置App的啟動圖,也就是Launch Image? Step1 1.點擊Image.xcassets 進入圖片管理,然后右擊,彈出"New Launch Image"2.如圖,右側的勾選可以讓你選擇是否要對ipad,橫屏,豎屏,以及低版本的ios系統做支持…

代碼分享h5-sessionStorage,提示app下載代碼塊

1.html <div class"down-app">    <span id"dowm-close">x</span>    <dl>      <dt>logo</dt>      <dd>        <h3>某某公司</h3>        <p>某某公…

Apache CXF負載平衡和故障轉移

前一段時間&#xff0c;我們已經面臨基于Apache CXF的負載平衡Web服務客戶端的需求。 此外&#xff0c;當某些服務器關閉時&#xff0c;客戶端應自動進行故障轉移。 更糟糕的是&#xff0c;服務器目標地址列表要從外部服務獲取并在運行時更新。 最終&#xff0c;我們最終獲得了…

Java局部變量一定要賦初值

根據大佬文章https://blog.csdn.net/wjw521wjw521/article/details/79243596的理解而寫的 1.類成員變量在 類加載 時會被系統賦初值&#xff0c;比如定義一個整型變量int num 系統默認num值為0 2.但是方法內的局部變量執行進棧操作&#xff0c;這個過程中系統不會賦初值&…

隱式的類類型轉換

如果構造函數只接受一個實參&#xff0c;則它實際上定義了轉換為此類類型的隱式轉換機制。將這種構造函數稱為轉換構造函數。 #ifndef MAIN_H_INCLUDED#define MAIN_H_INCLUDED#include<iostream>usingnamespace std;classClassTest{public:ClassTest(){ cout <<&q…

負數的 %求余和取模

1.求余和取模是不同的 2.‘%’ 在C/C&#xff0c;Java等語言中意為 求余 &#xff0c;在python 中意為 取模 3.a%b c 求余: c的符號和a一致 取模&#xff1a;c的符號和b一致 比如&#xff0c;一個小李子&#xff1a; public class Solution{public static void main(String…

PAT-BASIC-1038-統計同成績學生

本題要求讀入N名學生的成績&#xff0c;將獲得某一給定分數的學生人數輸出。 輸入格式&#xff1a; 輸入在第1行給出不超過105的正整數N&#xff0c;即學生總人數。隨后1行給出N名學生的百分制整數成績&#xff0c;中間以空格分隔。最后1行給出要查詢的分數個數K&#xff08;不…

JavaScript事件處理的三種方式(轉)

一、什么是JavaScript事件&#xff1f;事件(Event)是JavaScript應用跳動的心臟&#xff0c;也是把所有東西粘在一起的膠水&#xff0c;當我們與瀏覽器中Web頁面進行某些類型的交互時&#xff0c;事件就發生了。 事件可能是用戶在某些內容上的點擊、鼠標經過某個特定元素或按下鍵…

Erlang與Java內存架構

我讀了一篇關于Erlang VM的內存管理策略的非常非常有趣的文章。 它是Jesper Wilhelmsson撰寫的論文 &#xff0c;我認為討論Erlang的內存設置和Oracle的Java VM之間的差異可能會很好。 作為對從未聽說過Erlang的人的真正的簡短介紹; 它是一種功能語言&#xff0c;使用異步消息傳…

Xuggler教程:轉碼和媒體修改

注意&#xff1a;這是我們的“ Xuggler開發教程 ”系列的一部分。 在之前的教程中&#xff0c;我對視頻處理Xuggler進行了簡短介紹 。 在這一部分中&#xff0c;我們將看到Xuggler和FFmpeg提供的一些更令人興奮的功能&#xff0c;例如視頻轉碼和媒體修改。 不要忘記Xuggler是一…

Web工程師必備的43款可視化工具

國外站點DATAVISUALIZATION.CH為大家總結出了當前熱用的43款可視化工具&#xff0c;包括Arbor、Chroma.js、D3.js、Google Chart Tools等&#xff0c;絕對讓你一飽眼福。 1.Arbor.js Arbor是一個免費的、可視化的圖形庫&#xff0c;基于矢量創建動態的連接圖。它為圖形組織和屏…

力扣7. 整數反轉

方法一&#xff1a;官方給的&#xff0c;自己懂了后照著敲了一遍 class Solution {public int reverse(int x) {int rev 0;while (x ! 0) {//if判斷條件過于復雜&#xff0c;我好不容易看懂了if (rev < Integer.MIN_VALUE / 10 || rev > Integer.MAX_VALUE / 10) {retu…

AndroidManifest.xml中的application中的name屬性

被這個不起眼的屬性折磨了一天&#xff0c;終于解決了。 由于項目需要&#xff0c;要合并兩個android應用&#xff0c;于是拷代碼&#xff0c;拷布局文件&#xff0c;拷values&#xff0c;所有的都搞定之后程序還是頻頻崩潰&#xff0c;一直沒有找到原因&#xff0c;學android…

完美單身

我不時遇到一些Java程序員&#xff0c;他們不確定他們應該如何正確實現Singleton模式。 &#xff08;如果您不知道什么是Singleton&#xff0c;請嘗試Wikipedia&#xff1a; Singleton模式 &#xff09;。 我并不是在談論在線程環境中的正確實現。 但是&#xff0c;使用最常見的…

力扣移動零

給定一個數組 nums&#xff0c;編寫一個函數將所有 0 移動到數組的末尾&#xff0c;同時保持非零元素的相對順序。 我寫的代碼思路是從開始元素找0&#xff0c;找到了就將這個0后面的元素向前移一位 class Solution {public void moveZeroes(int[] nums) {int n nums.length;…

Doclava:來自Google的自定義Javadoc Doclet

Doclava是Google的自定義Javadoc Doclet&#xff0c;由Google Guice使用&#xff08;請參閱稍冷的 Javadocs &#xff09;。 Doclava使用JSilver作為其模板引擎&#xff0c;這是Clearsilver的純Java實現。 我個人喜歡聯合文檔的想法&#xff0c;它允許文檔在打開的項目上相互鏈…

linux cat顯示若干行

【一】從第3000行開始&#xff0c;顯示1000行。即顯示3000~3999行 cat filename | tail -n 3000 | head -n 1000 【二】顯示1000行到3000行 cat filename| head -n 3000 | tail -n 1000 *注意兩種方法的順序 分解&#xff1a; tail -n 1000&#xff1a;顯示最后1000行 tail -n …

【Stackoverflow好問題】java在,如何推斷陣列Array是否包括指定的值

問題java中&#xff0c;怎樣推斷數組Array是否包括指定的值精華回答1.Arrays.asList(...).contains(...) 2.使用 Apache Commons Lang包中的ArrayUtils.containsString[] fieldsToInclude { "id", "name", "location" };if ( ArrayUtils.contai…

力扣移除元素

給你一個數組 nums 和一個值 val&#xff0c;你需要 原地 移除所有數值等于 val 的元素&#xff0c;并返回移除后數組的新長度。 不要使用額外的數組空間&#xff0c;你必須僅使用 O(1) 額外空間并 原地 修改輸入數組。 元素的順序可以改變。你不需要考慮數組中超出新長度后面…

在域驅動設計中使用狀態模式

域驅動設計&#xff08;DDD&#xff09;是一種軟件開發方法&#xff0c;其中&#xff0c;通過將實現與核心業務概念的不斷發展的模型相連接&#xff0c;可以解決問題的復雜性。 該術語是由Eric Evans創造的&#xff0c;并且有一個DDD專用站點可以促進其使用。 根據其定義&#…