多核可扩展计数器

到处都需要计数器,例如,查找应用程序的关键KPI,应用程序的负载,服务的请求总数,用于查找应用程序吞吐量的一些KPI等。

由于所有这些需求,并发复杂性也增加了,这使这个问题变得有趣。

如何实现并发计数器


  • 同步 –这是JDK 1.5之前的唯一选项,因为现在我们正在等待JDK8版本,因此绝对不是一个选项。
  • 基于锁 –切勿尝试将其用作计数器,否则它将性能很差
  • 等待免费 -Java不支持Fetch-and-add ,因此实现起来有点困难。
  • 无锁 –很好地支持“ 比较和交换” ,使用起来不错。

基于比较和交换的计数器如何执行

我使用AtomicInteger进行此测试,并且每个线程使此计数器递增1百万次,以增加线程的争用数量,并逐渐增加。

试验机详细信息

作业系统:Windows 8

JDK:1.7.0.25

处理器:Intel i7-3632QM,8 Core

内存:8 GB

原子整数

Y轴 –增加一百万次所需的时间

X轴–螺纹数

随着线程数量的增加,增加计数器所花费的时间也增加了,这是由于争用造成的。 对于基于CAS的计数器,是CAS故障导致减速。

这是我们可以获得的最佳性能吗? 肯定不是它们是实现并发计数器的更好的解决方案,让我们来看看它们。

备用并发计数器

让我们看一些实现计数器的解决方案,以更好的方式处理竞争:

  • 基于核心的计数器 –维护每个逻辑核心的计数器,这样您的争用就会减少。 您拥有这种类型的计数器的唯一问题是,如果线程数大于逻辑核心数,那么您将开始注意到竞争。
  • 基于线程的计数器 –维护将使用系统的线程总数的计数器。 当线程数大于逻辑核心数时,这很好地工作。

让我们测试一下

不同类型的计数器花费的时间

所有反击-花费的时间

Y轴 –增加一百万次所需的时间

X轴–螺纹数

同时用计数器进行比基于原子计数器要好得多,16个线程是5倍左右的时间比较好,这是巨大的差异!

CAS失效率

反CAS失败

Y轴 – CAS失效100Ks

X轴–螺纹数

由于争用,基于原子的计数器会出现很多故障,并且随着我添加更多线程和其他计数器的性能提高,它会呈指数增长。

观察

多核计算机变得易于使用,并且我们必须改变处理并发的方式,传统的并发方式在当今时代无法扩展,因为拥有24或48核服务器非常普遍。

  • 为了减少争用,您必须使用多个计数器,然后再将它们聚合
  • 如果线程数少于或等于内核数,则基于内核的计数器效果很好
  • 当线程数量远大于可用内核时,基于线程的计数器就很好
  • 减少争用的关键是确定要写入哪个线程的计数器。我使用了基于线程ID的简单方法,但是可以使用更好的方法,请查看JDK 8的ThreadLocalRandom以获得一些想法。
  • JDK8的LongAdder使用基于线程的方法,该方法创建许多插槽以减少争用。

Github提供了此测试中使用的所有计数器的代码

参考:来自JCG合作伙伴 Ashkrit Sharma的“ 多核可扩展计数器 ”,准备好博客了。

翻译自: https://www.javacodegeeks.com/2013/09/scalable-counters-for-multi-core.html

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

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

相关文章

三年前端,面试思考(二)

为什么还有(二) 没有想到上一篇 《三年前端,面试思考》 有这么多前端同学看到。 在评论区也有很多鼓励和质疑的声音,而且群里面交流的同学两天就达到了700人。 群里有同学问了很多问题,同时希望我再分享一些面试技巧…

React入门-ReactDOM.render()介绍

React中的核心概念 1 虚拟DOM(Virtual DOM)2 Diff算法(虚拟DOM的加速器,提升React性能的法宝)虚拟DOM(Vitural DOM) React将DOM抽象为虚拟DOM,虚拟DOM其实就是用一个对象来描述DOM&a…

51单片机auxr寄存器_MCS-51单片机有几个工作寄存器

工作寄存器有4组,每组都是8个工作寄存器R0~R7,通过PSW中的RS1、RS0两位来选择使用哪一组,如果不选,默认是选择第0组。RS1RS0组合为00时,选中第0组工作寄存器,R0~R7地址为00H~07H;RS1RS0组合为01时&#xff…

柯里化

柯里化(currying),是指把接受多个参数的函数变换成接受一个单一参数(最初函数的第一个参数)的函数,并且返回接受余下参数而且返回结果的新函数的技术。 柯里化是理解装饰器函数的一个非常重要的知识点。 比如,将加法函…

matlab中quat2angle,RPY_Euler_Quaternion_AngleAxis角度转化:Matlab、Python、Halc

RPY_Euler_Quaternion_AngleAxis角度转化:Matlab、Python、HalcRPY_Euler_Quaternion_AngleAxis角度转化:Matlab、Python、Halcon版本UR协作机器人和Franka机器人导出的位姿为angleVector,三个量表示,在Matlab中angleVector是四个…

基本注射/资格赛,范围

这是上周解决的DI / CDI基础知识的延续-在本文中,我将讨论基础注入,限定词和范围。 在上一个主题中,我们提供了有关DI / CDI概念的大量信息,我们还讨论了如何使用注释加载这些bean或类-这构成了对象的组成并创建了关于如何进行采…

100*100的 canvas 占多少内存?

题目 100*100的 canvas 占多少内存? 在 三年前端,面试思考 中提到了一个题目,非常有新意,这里分享一下当时面试的思考过程。 解题思路 其实真正的答案是多少我并不清楚,面试过程中面试官也不期待一个准确的答案&am…

python,获取用户输入,并且将输入的内容写到.txt

该功能缺点是必须保证该文件不存在的情况才会成功 fopen(E:/mywork/保存文件.txt,x)def userwrite(code):if codew:f.close()return Falseelse:f.writelines(code\n)return True isbool True count 0 while isbool:codeif count0:code input("请输入内容:\n…

1t硬盘怎么分区最好_这下尴尬了,电脑硬盘分区常见误区,移动硬盘分区方法...

大家买了新电脑硬盘要不要分区呢?像以往咱们买了新电脑一般会分4个区,C、D、E、F,方便更合理的分类使用,比如把工作放为D盘,娱乐影音放为E盘,游戏放为F盘,C盘为系统盘。不过渐渐地发现&#xff…

matlab仿真环境,高低温环境模拟系统MATLAB仿真研究

1] Sadoun B. Applied system simulation:a review study[J] Information Sciences, 2000, 124:173~192[2] 王子介,Krauss G. 热交换器的微元模拟法及求解[J] 制冷学报, 2000,(1):33~39 Wang Zijie,Krauss G. Unit simulation method for heat-exchanger[J] Journal of Refrige…

用Spring长轮询Tomcat

就像喜剧演员弗兰基 豪威尔 ( Frankie Howerd)所说的“哦,小姐小姐” ,但足够多的英国影射和双重诱惑,因为长轮询雄猫对隔壁的闷气不是某种性偏见,这是一种技术(或更像是一种骇客)由…

.net core 编译时报错 Package Microsoft.Composition 1.0.27 is not compatible with netcoreapp1.1

查找错误项目 通过命令行cd到项目位置&#xff0c;执行dotnet restore命令查看具体报错项目。 解决方案 去项目中找到项目解决方案.csproj > 编辑 > PropertyGroup节点 > 添加如下代码 <PropertyGroup><TargetFramework>netcoreapp1.1</TargetFramewor…

支援一波 《面试数十人有感》

戳原文 无意间看到原博主的这篇文章&#xff0c;强调基础和原理&#xff0c;略有同感。 然而却发现评论区简直 ~ 辣眼睛 ~ 比如 活在梦里的面试官 我觉着吧&#xff0c;技术迭代的这么快&#xff0c;公司更需要的是有能力、有思想解决技术问题的人&#xff0c;并不代表说基础…

exchange 删除邮件

一 批量删除特定主题的邮件1.1 批量删除所有数据库中特定主题的邮件1) 群发了几封主题为“backup”的邮件&#xff1b; 2) 当前操作账号需要满足如下需求&#xff1a; a)该账号需属于Exchange Server 管理员角色以及源服务器和目标服务器的本地 Administrator组&#xff1b; b)…

js点击取消按钮关闭当前弹框_UI设计中“取消按钮”的分析详解

按钮&#xff0c;无论是在 Web 还是 App 上都被广泛地使用&#xff0c;而很少有设计师会注意到按钮当中的细节&#xff0c;导致在设计过程中出现一些低级的错误&#xff0c;使得用户在完成任务的过程中产生阻碍&#xff0c;无法顺利达成目的。在许多优秀的产品中&#xff0c;关…

MATLAB飞机大战第二版,windows程序设计——飞机大战札记(单文档文件登陆界面)...

windows程序设计——飞机大战笔记(单文档文件登陆界面)//2015/07/21/by xbw////环境 VS 2013飞机大战做的差不多了&#xff0c;闲来无事加点高大上的东西&#xff0c;关于单文档的登陆界面&#xff1b;&#xff1b;&#xff1b;界面有点丑&#xff0c;但是足够账号登陆了&#…

吸收Mockito的流利度

我最近发现自己编写了一些代码来集成两个不同的平台。 这些系统之一是基于Java的系统&#xff0c;而另一个虽然不是用Java编写的&#xff0c;却提供了Java API。 我将这些系统分别称为Foo和Bar。 在编写一行代码之前就很明显了&#xff0c;但是&#xff0c;测试最终的适配器将…

软件工程第三次作业

题目要求 最大连续子数组和&#xff08;最大子段和&#xff09; 问题&#xff1a; 给定n个整数&#xff08;可能为负数&#xff09;组成的序列a[1],a[2],a[3],…,a[n],求该序列如a[i]a[i1]…a[j]的子段和的最大值。 当所给的整数均为负数时定义子段和为0&#xff0c;依此定义&a…

使用HTML5 IndexDB存储图像和文件

使用IndexedDB存储图像和文件 有一天&#xff0c;我们写了关于如何在localStorage中保存图像和文件的文章&#xff0c;它是关于我们今天可用的实用主义。 然而&#xff0c;localStorage有一些性能影响 - 我们将在稍后的博客中讨论这个问题 - 并且未来期望的方法是使用IndexedD…

Gitlab 项目上传

一&#xff0c;登陆gitab&#xff0c;新建reject Repository name: 仓库名称 Description(可选): 仓库描述介绍 Public, Private : 仓库权限&#xff08;公开共享&#xff0c;私有或指定合作者&#xff09; Initialize this repository with a README: 添加一个README.md gitig…