像Java这样的C ++具有低延迟

总览

以前,我写过一篇有关Java之类的C的文章。 这是我以前遇到的术语。 但是,经过思考,我认为像Java这样的C ++是一个更好的术语,因为您仍在使用OOP做法(不是C风格的),但是您需要自己进行更多的工作来管理和回收内存。

我现在支持的术语是“低级” Java编程。

低延迟和“自然” Java

许多低延迟系统仍使用我称为自然Java的程序进行编程。 在大多数情况下,这是最简单,最有效的方法。 当您具有大堆大小和低延迟要求时,这些问题才真正开始,因为它们不能很好地协同工作。

如果您有一个已建立的程序,并且重写是不合理的,则需要Zing之类的东西,它具有真正的并发收集器。 尽管您可能会看到1-4 ms的最严重的停顿,这与非实时系统一样好。 有传言说RedHat会生成并发收集器,但是正如Oracle在G1中发现的那样,编写有效的低延迟非常困难。 G1工作正常,只是不适合低延迟交易(例如,暂停时间为1毫秒),我不确定是否会如此。

如果可以重写关键组件,尤其是出于性能以外的原因而正在考虑这样做的话,则可以显着提高性能,但是可以使用更像C ++或C的低级编程。语言是指您正在使用与那些语言相同的技巧,并且已经使用了很长时间,但是使用Java。

为什么用Java进行低级编程?

主要原因是集成和易于支持。 低级Java与自然Java代码非常干净地集成在一起。 所有的Java工具都可以很好地使用它,并且它仍然是跨平台的(至少是跨OS的)。某些底层技术是JVM特定的,例如它们可以在OpenJDK / HotSpot上工作,但不能在IBM的JVM上工作,反之亦然。 他们可能会起作用,但许多都无济于事。 例如,在HotSpot上使用不安全可以更快,但在Android上则明显慢。

低级Java编程的另一个好处是,经验丰富的Java开发人员发现使用它相对容易。 他们可能会发现很难从头开始编写,但是如果使用隐藏更多细节的库,则可以有效地使用它。

低级Java有哪些注意事项?

延迟目标

除非您在99.9%的时间内运行时间少于1毫秒,否则您现在可以认为1毫秒的延迟不是那么快。 Java中最快的系统通常约为100微秒,甚至低于包装箱外部的20微秒。

如何处理高吞吐量

对于交易系统,我建议您将等待时间尽可能短,并且吞吐量通常足够。 例如,编年史可以以一个线程的持续速率以最大爆发次数持续完整的Opera提要。 这是可能的,因为编年史的潜伏期很短。 一条很小的4字节消息的平均延迟为7纳秒。 即使JVM在下一行崩溃时,它也将保留。 在这一点上吞吐量不是一个问题。

对于反向测试,低延迟是不够的。 这是因为您想要做的是在不到一秒钟的时间内(理想情况下)重播数月的数据。 在这种情况下,您需要高度的并行性以及能够在短时间内重播大量数据的能力。 为此,我使用了内存映射文件,这些文件具有对所需数据的预装查询。 如果这些文件为二进制格式并适合主内存,则可以非常快速地跨线程重复访问它们。

处理GC。

垃圾收集暂停会使您减速,因此最快的方法是构建引擎是不使用休息时间。 相反,您给自己一个预算,这是您可以合理拥有的最大伊甸园大小。 这可能是24 GB的Eden。 如果您花了一整天的时间来填满,一天之内就不会收集,即使是次要的收集也是如此。 假设您可以在晚上或周末停下来几秒钟,则可以在预定时间执行完全GC,而GC不再是问题。

即使这样,我还是建议尽量减少垃圾并本地化内存访问模式以最大化L1 / L2效率,这可以导致性能提高2-5倍。 L3缓存至少比L1慢10倍,并且如果您不给L1填充垃圾(正如许多Java程序一样),您的程序将更快,更一致地运行。

将共享内存用于IPC

这有两个优点。

  1. 您可以保留所有事件的记录,以及整天的时间安排和微不足道的开销。 因为您可以保留更多数据,所以可以在外部,下游或重现错误来重现系统的确切状态。 这为您提供了基于数据驱动的海量测试,您可以通过测试系统实时提供生产数据,以查看ti在实时运行之前的行为。
  2. 实际上,它可能比其他方法快得多。 一条微小的消息平均可以写入7纳秒的延迟,并且在不到100纳秒的时间内对另一个进程可见。

固定芯

许多人已经尝试过固定核心,但并没有太大的区别。 这可能是由于a)应用程序的抖动过大,几乎没有关系,或者b)然后没有固定到隔离的内核。 我发现如果绑定到隔离的内核,最坏情况的延迟会从2毫秒下降到10微秒,但固定到非隔离的内核似乎根本没有帮助。

忙碌中

您不希望关键线程进行上下文切换,而避免这种情况的一种方法是永不放弃内核或CPU。 这可以通过在固定的隔离内核上忙于等待来完成。 我要做的一件事是使用隔离的核心
a)对最关键的线程有选择地禁用超线程,而其余的则保留。
b)通过不对“垃圾”内核进行超频来更多地对隔离内核进行超频。 通过限制不需要最大速度的磁芯产生的热量,可以达到这一目的。 例如,假设您有一个十六进制内核,则不让内核0,2,4保持超频,而超频内核1,3,5则不使用HT,比整个插槽多使用10%。 我认为超频内核在芯片上并不相邻,因此它们不太可能过热。

更大的地址空间集合

Chronicle和OpenHFT的直接存储的主要功能是它们允许访问64位大小。 (由于OS / CPU的限制,技术上只能使用48位)这意味着您可以将TB大小的数据集作为一个集合进行管理,而该集合具有Java内存中本来就有数十亿条记录/节选。 这样甚至可以避免JNI障碍或系统调用来降低应用程序速度。

结论

如果您的应用程序将其90%的时间用在其代码的10%或80/20中,则可以使用“自然” Java编写90%的代码,或者使用第三方库。 但是,如果您用低级Java编写10%的代码,则可以显着提高性能。

参考: Vanilla Java博客上的JCG合作伙伴 Peter Lawrey提供了Java 等C ++的低延迟特性。

翻译自: https://www.javacodegeeks.com/2013/07/c-like-java-for-low-latency.html

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

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

相关文章

项目一总结

1、编程逻辑不明确的问题 在项目开始阶段,项目分工应根据项目模块进行详细分工,公用部分应尽量节省时间 2、对于文件命名规则的定义,现在项目名字命名很乱,在项目整合时会出很多问题 3、文件目录不清晰,条理性差 4、代…

Android GreenDao使用教程

一、Greendao简介 Greendao是一款用于数据库创建与管理的框架,由于原生SQLite语言比较复杂繁琐,使得不少程序员不得不去学习SQLite原生语言,但是学习成本高,效率低下,所以不少公司致力于开发一款简单的数据库管理框架&…

matlab如何将相近的数据,matlab新手,求帮助!主要是如何将数据和公式导入

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼这是别人给我的程序,我想问一下怎么把我的两个excel数据导入,以及公式怎么写?clc;clear all;close all;datadlmread(all_data_in_situ_lxz.txt);data(6,:)[];data(12,:)[];data(13,:)[];data(13,…

Java垃圾回收(1)

这是有关垃圾收集(GC)的系列文章中的第一篇。 我希望能够涵盖整个系列过程中的理论知识以及热点虚拟机中的所有主要收集器。 这篇文章仅说明什么是垃圾回收,以及不同回收器共有的元素。 我为什么要在乎? 您的Java虚拟机可以为您管…

如果

(最近遇到了一些困难,这篇翻译自己一直就很喜欢,贴上来鼓励自己。) 如果 吉卜林【英】芮成钢【译】 如果,身边的人都失去理智,并将其归咎于你, 而你却能保持清醒; 如果,所…

深入c#的string类

一.字符串常用方法 1.IndexOf("") 如果找到字符串出现的位置则为索引位置,否则返回-1,索引从0开始 2.string Substring( int startIndex , int length ); 从开始位置startIndex,截取到结束位置(截取长度length&#xff…

go语言服务器连接mysql,服务器mysql怎么配置才能远程连接

如何设置MYSQL服务器允许远程连接?如果你使用的与数据库不在同一台服务器上电脑,那么MySQL 服务器就需要允许远程链接,网站才能正常运行。那么如何设置MYSQL服务器允许远程连接呢?我想这是很多人都想提出的疑问,下面是…

h1、h2、h3标签及strong标签对页面seo的影响

今天和大家来聊下h1,h2,h3,strong几个标签&#xff0c;在网页中的使用对页面seo的影响&#xff0c;也阐述了个人的一些想法。 首先简要讲下H标签及strong标签的含义&#xff1a;<h1>、<h2>、<h3>、<h4>、<h5>、<h6>,作为标题使用&#x…

少锁定Java对象池

自从我写任何东西以来已经有一段时间了&#xff0c;我一直在忙于我的新工作&#xff0c;该工作涉及在性能调整方面做一些有趣的工作。 挑战之一是减少应用程序关键部分的对象创建。 尽管Java随着时间的推移改进了GC算法&#xff0c;但垃圾回收打h一直是Java的主要难题。 Azul是…

Java (数组的遍历,for循环的使用)

/*多行注释的快捷键&#xff1a;Ctrlshift/ 快速格式化代码快捷键&#xff1a;Ctrlshiftf 自动导入一个包&#xff1a;Ctrlshifto */ package test_1;public class Day_2 {public static void main(String args[]) {//一个九九乘法表的实现int c 0;for (int a 1; a < 9; a…

php数据库postgresql,PHP 操作 PostgreSQL数据库

1.要让PHP支持PostgreSQL&#xff0c;就需要重新编译PHP&#xff1b;./configure --prefix/usr/local/php5 --with-apxs2/usr/local/apache2/bin/apxs --with-mysql/usr/local/mysql --with-config-file-path/usr/local/php5 --with-zlib --enable-mbstringall --with-mysql…

开始学习前端开发吧

据说最好的输入是输出&#xff0c;所以听我讲给你听我学到的东西吧。 学习前端入门时&#xff0c;无论在哪儿都告诉我们&#xff0c;要学习HTML CSS JS。google之&#xff0c;得到html是超文本标记语言&#xff08;英语&#xff1a;HyperText Markup Language&#xff0c;简称…

Java 8 Lambda演练

在工作中&#xff0c;我做了关于Java 8项目lambda的演示&#xff0c;当然还有一些简单的代码来说明其中的一些要点。 Java 8的总体原因是&#xff1a; 更简洁的代码&#xff08;适用于只有一种方法和集合的类&#xff09;。 “我们希望代码的读者在到达lambda表达式的“实质”…

虚拟机vmnet0、vmnet1和vmnet8的区别

vmnet0&#xff0c;实际上就是一个虚拟的网桥 vmnet0&#xff0c;实际上就是一个虚拟的网桥&#xff0c;这个网桥有很若干个端口&#xff0c;一个端口用于连接你的Host&#xff0c;一个端口用于连接你的虚拟机&#xff0c;他们的位置是对等的&#xff0c;谁也不是谁的网关。所以…

uestc summer training #2

A 增广 #include<bits/stdc.h> using namespace std; const int MAXN 1000000 10; vector<int> g[MAXN]; int a[MAXN], b[MAXN], sz[MAXN], cnt[MAXN]; bool mg[MAXN], vis[MAXN]; int n, m; bool dfs(int u, int f -1) {if (g[u].empty()) //如果当前数没有位…

mysql有实例名这个概念,MySQL的一些概念笔记

1.MySQL Server、MySQL实例、MySQL数据库MySQL数据库指的是实际存在的物理操作系统文件的集合&#xff0c;也可以指逻辑数据的集合。为了访问、处理数据&#xff0c;我们需要一个数据库管理系统&#xff0c;也就是MySQL Server(也称为MySQL服务器)。MySQL实例指的是MySQL进程及…

OpenHFT Java Lang项目

OpenHFT / Java Lang从Apache 2.0库开始&#xff0c;提供Java Chronicle使用的低级功能&#xff0c;而无需持久存储到文件中。 这允许对数据进行可序列化和反序列化&#xff0c;以及对本机空间&#xff08;堆外&#xff09;中的内存的随机访问。它支持使用对象池写入和读取可枚…

spring cloud-spring boot 文档信息

官网&#xff1a; spring boot springcloud 学习资源 使用IDEA创建SpringBoot项目 Spring Boot教程 https://blog.csdn.net/forezp/article/details/70341818 Spring Cloud教程 http://blog.csdn.net/forezp/article/details/70148833 Spring Cloud教程 http://blog.csdn.net…

python基础学习笔记(十三)

re模块包含对 正则表达式。本章会对re模块主要特征和正则表达式进行介绍。 什么是正则表达式 正则表达式是可以匹配文本片段的模式。最简单的正则表达式就是普通字符串&#xff0c;可以匹配其自身。换包话说&#xff0c;正则表达式’python’ 可以匹配字符串’python’ 。你可以…

OD debug matlab,OllyDebug基本使用方法

OD是逆向过程中最好的动态调试工具&#xff0c;这次来记录学习笔记。(特别鸣谢石总)1、OD的工作界面最开始要学的就是界面的使用N了吧&#xff0c;这里分各个框来解释下&#xff1a;列举各个框用处&#xff1a;可以看到下面一框框东西&#xff1a;这些一时半会用不到&#xff0…